打个好字的高尔夫给你!


12

任务

在这个挑战中,您的任务是编写一些代码,以随机分布的方式输出随机选择的七巧板之一,但永远不要输出。


细化

如果没有输入,您的程序应输出其源代码的任何字谜。您的程序永远都不要输出自己的源代码,即,永远不要成为奎因。


输入值

您的程序不得输入任何内容。但是,如果您的语言需要输入,则可以假定将其小写a。但是,您不得以任何方式使用输入。


输出量

您的程序可以以任何方式输出,除非将其写入变量。允许写入文件,控制台,屏幕等。功能return也是允许的。


附加规则

  • 程序的源代码必须至少包含3个字符(而不是3个字节)。

  • 程序的源代码必须至少包含3个字谜(不包含其自身)。例如,aab由于(和)aab以外只有两个字谜,因此不算作有效提交。aabbaaaba

  • 您的程序不得产生任何错误。

  • 您的程序应准确输出其字谜。

  • 适用标准漏洞标准奎因规则


假设程序的源代码是abc。它应该随机输出以下任意一项(均匀分布):

  1. acb
  2. bca
  3. bac
  4. cba
  5. cab

并且,它永远都不应输出abc


获胜标准

这是,因此以字节为单位的最短代码胜出!如果出现平局,则以较早发布的解决方案为准!



它是否需要保证其行为正确,或者仅以概​​率1为准?
PyRulez

@PyRulez 在这个挑战中,您的任务是编写一些代码,输出随机选择的七巧板之一,并以均匀分布的方式输出 ...(第一句话(在Task之下))
Arjun,

@Arjun那么失败的几率是0%吗?
PyRulez

@PyRulez失败?该代码应该输出随机选择的其中一个字谜(除了其本身),而输出任何字谜的机会均等。我不知道您所说的“失败”是什么意思。
Arjun

Answers:


5

果冻,15个字节

“v0¡µṾ;ḢŒ!QḊX”v

只是为了开始工作;这几乎可以肯定是可以击败的。这基本上是通用quine构造函数和“选择除输入之外的随机排列”功能的组合。后者可能是可改进的,前者几乎可以肯定是。

说明

通用quine构造函数

“v0¡µṾ;Ḣ”v
“       ”v   Evaluate the following, given {itself} as argument:
 v0¡µ          No-op (which starts with "v")
     Ṿ         Escape string
      ;Ḣ       Append first character of {the argument}

如果单独运行,这可以看作是一个难题。就我所知的大多数定义而言,它也是一个合适的方法。它不会读取自己的源(相反,它包含“ eval”化的文字,并为其提供一个副本作为参数),它可以携带有效负载(如此处所示!),并且v字符串之外文字由v内部编码。

选择一个随机的七巧板

Œ!QḊX
Œ!     All permutations
  Q    Discard duplicates
   Ḋ   Discard the first (i.e. the string itself)
    X  Choose random element

这么长的时间,这对字符串确实效率不高,因此我无法对程序进行整体测试,但是我已经对较短的字符串进行了测试,并且看来功能正常。


为什么Thins在TIO上不起作用?
Xcoder先生17年

@ Mr.Xcoder可能会绕过60秒的时间限制。
暴民埃里克(Erik the Outgolfer)'17年

哦,是的,你是对的。
Xcoder先生17年

当您将其保存在字节数中时,您的代码会错过必要的代码Q。不过,我觉得你可以改变这个“所有置换”的方法与一个“洗牌”一个使用Ẋ⁼¿,节省了字节,同时也允许其工作的TIO。
乔纳森·艾伦

4

CJam,17个字节

{`"_~"+m!(a-mR}_~

这不会很快结束,因此这次没有TIO链接。

令人欣慰的是,这里有一个20字节的解决方案,它很快就会终止:

{`"_~"+:S{mr_S=}h}_~

在线尝试!

说明

{`"_~"+   e# Standard quine framework, leaves a string equal to the source
          e# code on the stack.
  m!      e# Get all permutations. The first one will always be the original order.
  (a      e# Remove that copy of the source code and wrap it in a new list.
  -       e# Remove all copies of the source code from the list of permutations.
  mR      e# Pick a random permutation.
}_~

取而代之的是20个字节的解决方案,将源代码改编成与原始代码不同的代码。


4

Python 2,117字节

令人惊讶的是,此解决方案比我预期的要短。随机播放源代码,直到其与原始代码不同为止。

-2字节,感谢@ mbomb007
-3字节,感谢@Wondercricket

在线尝试

s=r"""from random import*;R='s=r\"""'+s+'\"""'+';exec s';L=R
while L==R:L=''.join(sample(R,len(R)))
print L""";exec s

这是我修改过的python中的基本奎因之一

s = r"print 's = r\"' + s + '\"' + '\nexec(s)'"
exec(s)

生成字谜是由随机模块完成的

L=R
while L==R:L=''.join(sample(L,len(L)))

其中R包含源代码

s=...
R='s=r\"""'+s+'\"""'+'\nexec s'

需要三引号,因为我被迫在代码中保留实际的换行符。字谜将有3行。


1
exec s而不是exec(s)
mbomb007 '17

由于a str是不可变的,因此您可以通过L=R使用sampleon L而不是 shuffleon 来保存字节list重复。这个想法来自这个Stackoverflow
Wondercricket '17

@Wondercricket Sample返回字符列表,因此将其结果与R比较将始终返回False。但是有些重新排列会有所帮助,谢谢s的想法!
死负鼠,

3

Java 7中,376个 428 426 428字节

import java.util.*;class M{public static void main(String[]a){String s="import java.util.*;class M{public static void main(String[]a){String s=%c%s%1$c,x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(%1$c%1$c));x.equals(s);s=s.join(%1$c%1$c,l))Collections.shuffle(l);System.out.print(s);}}",x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(""));x.equals(s);s=s.join("",l))Collections.shuffle(l);System.out.print(s);}}

+52和+2个字节,用于两个错误修复。.我没有(正确地)检查是否随机生成的String等于原始源代码。考虑到涉及的角色数量,这种机会天文数字很小,但是无论是否符合挑战规则,我都必须对其进行验证。

我在Java中的第一个答案。在
这里尝试。

您可以删除两者Collections.shuffle(l)!在两者前面添加x.equals(s)以验证输出确实等于程序:
在此处尝试。

说明:

  • String s包含未格式化的源代码。
  • %s用于将String本身输入s.format(...)
  • %c%1$c以及34用于格式化双引号。
  • s.format(s,34,s) 放在一起

代码的这一部分负责输出随机字谜:

// Strings `s` and `x` now both contain the source-code:
x=s=s.format(s,34,s);

// Create a list with the characters of this source-code-String and loop
for(List l=Arrays.asList(x.split(""));
    // as long as String `x` equals String `s`
    x.equals(s);
    // Shuffle the list, and set it to `s` in every iteration of the loop:
    s=s.join("",l))Collections.shuffle(l);
// End of loop (implicit / single-line body)

// And then print the random anagram to STDOUT:
System.out.print(x);

1

05AB1E,22字节

"34çìDJœ¦.R"34çìDJœ¦.R

这将创建一个对于TIO而言太大的列表,因此该链接使用了一个较小的字符串,但是想法是相同的。

在线尝试!

"34çìDJœ¦.R"           # Push this string
            34ç        # Push "
               ì       # Prepend
                DJ     # Duplicate and join 
                  œ¦   # Push all permutations except the original
                    .R # Pick a random element

1

Javascript(ES6),128个字节

!function a(){b="!"+a+"()",c=b.split(""),c.sort(()=>Math.round(Math.random())-.5),c!=b.split("")?console.log(c.join("")):a()}();

使用sort()返回随机-1,0或1来随机播放输出。


0

Bash,27个96字节

i=`cat $0`&&e=`fold -w1 $0|shuf|tr -d '\n'`&&while [ "$e" = "$i" ]; do `$0`; exit; done&&echo $e

fold将代码分成shuf几行,将各行混洗,然后tr将代码放回原处

修复了它自己输出的问题,现在它永远不会自己输出

在线尝试!


1
是否有机会输出代码本身而不进行更改?
死负鼠

它似乎也只能使行混乱,因此并非所有排列都是可能的,特别是因为该程序只有一行...
Martin Ender

所有排列都是可能的,请对其进行测试。我正在解决它可能自行解决的问题
DrnglVrgs

1
$0貌似违反了“你的程序必须不承担任何投入。”
manatwork

我很确定那只是文件名。因此,即使没有输入,这也是一个骗子:(
CalculatorFeline
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.