产生不确定性输出的最短代码


83

您需要产生不确定的输出。

在这种情况下,这将被定义为表示输出将不会总是相同的结果。

规则:

  • 始终具有相同种子的伪随机数生成器不计算在内。

  • 您可以依靠程序在每次执行的不同(未知)时间运行。

  • 您的代码的进程ID(如果解释器未固定)可以认为是不确定的。

  • 您可能依赖于基于网络的随机性。

  • 您的代码可能不接受非空输入。相关meta post

  • 不需要暂停程序,但是必须显示输出。

排行榜


33
@ mbomb007在C中,有许多事情只是“未定义”的行为。任何给定的口译员都可以在任何情况下做任何想做的事情。就我们所知,如果您在一个下雨的星期二尝试溢出一个有符号整数,gcc可能会命令您比萨饼,但在其他所有日子中,鳟鱼都会跳出屏幕。因此,您将永远不会真正知道它是否在任何给定的实现中都是确定性的。
Martin Ender

12
@MartinEnder我不确定这是否重要。我们在这里通过语言的实现而不是通过规范来定义语言(因为不允许没有实现的语言)
Nathan Merrill

2
@MartinEnder是的,我同意内森。
mbomb007 '16

7
请注意,C语言中未定义的行为通常会导致崩溃,而在UNIX和Linux上崩溃会导致其中包含进程ID的核心文件。这似乎符合当前措词的问题。

5
除非我误解了,否则该问题不会要求使用未定义行为的代码。它要求利用定义的行为的代码来确保不确定性。
WGroleau '16

Answers:


110

WinDbg,1个字节

#

哇!没想到WinDbg提供1字节的解决方案!

#搜索一个反汇编模式,但是由于没有参数,它看起来只是在您连接的任何转储/进程中返回下一个汇编指令。不确定设置初始地址的逻辑,但是可以。

样本输出:

0:000> #
Search address set to 75959556 
user32!NtUserGetMessage+0xc
75959556 c21000          ret     10h

0:000> #
user32!NtUserGetMessage+0xf 
75959559 90              nop

0:000> #
user32!NtUserMessageCall 
7595955a 90              nop

0:000> #
user32!NtUserMessageCall+0x1 
7595955b 90              nop

0:000> #
user32!NtUserMessageCall+0x2 
7595955c 90              nop

0:000> #
user32!NtUserMessageCall+0x3 
7595955d 90              nop

0:000> #
user32!GetMessageW
7595955e 8bff            mov     edi,edi

0:000> #
user32!GetMessageW+0x2 
75959560 55              push    ebp

0:000> #
user32!GetMessageW+0x3 
75959561 8bec            mov     ebp,esp

0:000> #
user32!GetMessageW+0x5 
75959563 8b5510          mov     edx,dword ptr [ebp+10h]

9
这里比较酷的答案之一是,我认为这应该会赢得“当前日期”解决方案。
魔术章鱼缸

上面的内容似乎在386 intel cpu组件中某些功能的开始令人不安,逐步
RosLuP

60

Java 7、33 30 27字节

int a(){return hashCode();}

因为Java。


49
因为Java。可能是有史以来对Java的最好解释。
F. George,

5
toString在先前版本中使用过@carusocomputing ,但是返回类型String比更长int。保存字节!:]

12
这是否有效?hashCode()是的缩写this.hashCode(),因此只能用作实例方法,不能用作静态方法。在这种情况下,您需要其他代码才能在调用方中创建对象。这在这里很重要,因为它是创建负责确定性的对象的代码。

15
在Java 8中:()->hashCode()14个字节。只是说说;)
奥利维尔·格雷戈尔

4
@pts我将基于元帖子来讨论帖子的默认提交结构。除非质询指定需要完整的程序,否则默认情况下允许使用功能。

52

MATLAB,3个字节

why

why提供几乎所有问题的答案。一些例子:

why
The programmer suggested it.

why
To fool the tall good and smart system manager. 

why
You insisted on it.

why
How should I know?

这比rand我能想到的任何功能都要短。


33
MATLAB有一个内置的这个?为什么?
ETHproductions's

59
@ETHproductions程序员建议使用
Eddie Curtis

40

R,1个字节

t

输出函数的源代码和一个内存指针地址,该地址随R的每个(重新)开始而变化。


36

嗯?,0字节


空程序仍会产生输出。执行的Python解释器的最后几行:

print "..."
f = open('Notes.txt', 'w')
f.write(time.strftime("%c") + " - The user tried to give me commands again. I still have no idea what they are talking about...\n")

在程序结束时,Python解释器将打印...,然后将创建/打开一个名为的文本文件,Notes.txt并在前面写入包含当前时间的字符串。


5
在我认为人们可以在GitHub上使用的所有东西中,我认为笑话语言解释器不是一个:P
Kade

@Kade实际上我也将用它来回答另一个问题(播放声音的最短代码,只有一个字节)-但问题现在已经关闭。
mbomb007 '16

除非我查看原始的.NET解释器,否则这将是非竞争的。
mbomb007 '16

30

迷宫,5字节

v
!
@

要么打印0要么什么都不打印(每次打印50%的机会)。

在线尝试!

在一个非常特殊的情况下,迷宫表现出随机的行为:

  • 指令指针前面和后面必须有一堵墙。
  • 指令指针的左右必须有一个非墙。
  • 堆栈的当前顶部必须为零。

如果满足所有这些条件,则将随机(均匀地)选择IP移动的方向。最重要的是,这三个条件在常规控制流中是不可能满足的,这意味着除非您在运行时修改源代码。

(这似乎有些武断,但这实际上是我在这些条件下可以找到的最一致的行为,因为通常IP的方向始终取决于先前的方向,其邻居和堆栈顶部的符号,并且这似乎是在语言中包含随机性来源的一种优雅方式。)

借助源代码轮换说明(<^>v),可以将IP置于这种情况。在顶部可以看到一个这样的例子。IP最初指向东方,并从顶部开始。该v旋转当前列,使我们得到:

@
v
!

IP随此旋转而移动,因此它仍在v指向东的上。现在已满足所有条件,因此IP会随机增加或减少。如果上升,程序将立即终止。如果下降,则打印零,再次旋转列,然后终止。

还有其他三个程序使用此程序(一个也可以打印0,一个可以打印00,另一个可以打印000):

v
@
!

"
>@!

"
>!@

(实际上,还有三个以上的程序,因为您还可以使用.而不是!打印空字节,或者用"各种各样的命令替换它,但是我相信它们的工作原理基本相同。)


30

Befunge(-93和-98),3个字节

?.@

?以随机方向发送执行。如果它上升或下降,则会循环回到?并重新滚动。如果左移,该程序将环绕到,@并退出而不打印任何内容。如果正确,它将打印0.堆栈为空时产生的输出),然后在上退出@


不能保证会终止,但是我打算这样发布+1
Daniel Daniel

您可能需要将逗号更改为句点,以输出0作为数字而不是空字符(ASCII值0)。+1
MildlyMilquetoast

.在我用于测试的程序中,但是以某种方式,将其复制到PPCG上成为一种。固定。

7
@Dopapp它几乎肯定会终止,但概率为1。我以此作为保证;)
Oliphaunt

@JamesHolderness 我想你可以在1不知道这样做,如果这个统计虽然...
MildlyMilquetoast

29

Minecraft,5个 4字节

op 8

通过键入服务器的控制台或命令块并赋予其电源来使用。可以在聊天界面前添加来运行/

通常这不会执行任何操作,但是如果服务器上有一个用户名“ 8”的播放器,则会为他们提供操作员权限。请注意,尽管Minecraft通常要求用户名的长度为3个字符,但在此限制之前创建了一些名称长度较短的帐户。

在没有以下用户名之一的情况下,可以证明该版本是不确定的版本,否则有给用户操作员权限的风险:

me @r

向所有人显示一条消息,该消息是随机播放器的用户名。该op命令仅使用字符串文字,而不使用任何返回字符串的脚本。

me对于第一个示例,该命令实际上并不起作用,它将显示"<your-username> 8"。从命令块运行时,它不是确定性的,因为所有命令块都具有相同的“用户名”,但是从聊天界面运行它需要/额外的一个字节。


那么/字节数不包括在内吗?
硕果累累

11
@ Challenger5在命令块中,斜杠是可选的,在服务器控制台中是不允许的,在聊天界面中是必需的。
帕维尔

2
实际上,它应该是4个字节+ 2个块(命令块和红石源)或6个blytes
RudolfJelin

2
@RudolphJelinek您可以从控制台运行它而无需命令块。
帕维尔

1
另一个不确定性选项是help在命令块中,该命令块为4个字节(并且不需要盗版游戏)。
Pokechu22年

21

sh + procps,1个字节

w

我知道这是最短的解决方案,它可以通过调用外部可执行文件来实现。procps是负责报告有关当前系统状态(ps和好友)信息的负责任软件包,默认情况下已安装在大多数Linux发行版中;w是其中名称最短的命令,它返回有关已登录用户的信息,还返回一些不确定性信息,例如正常运行时间。


21

通知7、6个字节

x is y

这不是有效的Inform 7程序,因为尚未定义“ x”或“ y”。因此,这将引发错误。

但是,Inform 7的某些错误消息(包括该错误消息)是随机的。因此,它打印的文本在技术上是不确定的。

一些可能的输出包括:

问题。句子“ x是y”似乎表明两件事是相同的-我将“ x”和“ y”读作两个不同的事物,因此,说一个是另一个是没有意义的,就像说“亚当斯就是杰斐逊”。没关系,如果第二件事是一种名称,也许带有属性:例如“弗吉尼亚是一间带灯的房间”,则说存在一种叫做弗吉尼亚的东西,而这是一个“房间”,我知道这是一种关于,再加上一个我也知道的称为“ lighted”的属性。

问题。句子“ x是y”似乎表明两件事是相同的-我将“ x”和“ y”读作两个不同的事物,因此,说一个是另一个是没有意义的,就像说“亚当是夏娃”。如果第二件事是一种种类的名称,也许带有属性,那就没关系了,例如“ Nod的土地是一间明亮的房间”说存在一个名为Nod的土地,并且它是一个“房间”,这就是我所知道的一种,再加上我也知道的称为“ lighted”的属性。

问题。句子“ x is y”似乎表明两件事是相同的-我将“ x”和“ y”读作两个不同的事物,因此,说一个是另一个是没有道理的:就像说“ Clark Kent是Lex Luthor”。没关系,如果第二件事是一种名称,也许带有属性:例如“ Metropolis是一间有照明的房间”,则说存在一种叫做Metropolis的东西,并且它是一个“房间”,我知道这是一种关于,再加上一个我也知道的称为“ lighted”的属性。

问题。句子“ x是y”似乎表明两件事是相同的-我将“ x”和“ y”读作两个不同的事物,因此,说一个是另一个是没有意义的,就像说“ Aeschylus是Euripides”。没关系,如果第二件事是一种名称,也许带有属性:例如,“地下世界是一间明亮的房间”说存在一个叫做黑社会的东西,并且它是一个“房间”,这就是我所知道的那种关于,再加上一个我也知道的称为“ lighted”的属性。


7
甚至错误消息也是冗长的!
破坏的柠檬

21

JavaScript,4个字节

Date

返回当前日期/时间的函数。我认为这是最短的...

说明

由于这似乎引起人们对其有效性的困惑,因此我将尽力进行解释。

在JavaScript中,如果可以将函数条目分配给变量并像函数一样调用,则该函数条目有效。例如,此函数是有效的条目:

function(){return Date()}

因为它是可以分配给变量的函数,如下所示:

f=function(){return Date()}

然后f()根据需要运行多次。每次,它都会返回当前日期/时间字符串,OP已将其确定为不确定的日期/时间字符串。

此ES6箭头功能也有效:

_=>Date()

可以将其分配给f=_=>Date(),然后f()像另一个一样运行。

现在,这是另一个有效条目:

Date

为什么?因为就像其他两个条目一样,可以使用分配它f=Date,然后使用调用它f(),并返回与其他两个完全相同的东西。试试吧:


1
您是否不需要Date()调用该函数?
牛奶

4
@milk Date是一个函数,当不带任何输入调用时,它会生成当前日期/时间。_=>Date()是一个完全相同的事情Date的有效输入,有效输入也是如此。
ETHproductions 2016年

1
那讲得通。
牛奶

2
输入Date浏览器的JavaScript控制台会产生确定性的输出,它始终会产生以下内容:function Date() { [native code] }。您可能是Date()6个字节。
pts 2016年

2
如果上述的“日期”比OK“的malloc(8)”或“时间(0)”将是C OK太
RosLuP


11

Python 2,11个字节

print id(1)

1
那就是我找到的那个。id(0)不过,我有。:)
mbomb007 '16

2
从技术上讲,我是击败了您,因为我是OP,并且在发布问题之前就找到了它。我不想发布问题并立即发布我最短的答案。
mbomb007 '16


10

PowerShell,4个 2字节

(划掉4 仍然看起来像4

ps

这是别名Get-Process,它将以表格的形式输出当前进程列表,包括句柄,私有内存,CPU时间等。

通过如下方式执行它:

C:\Tools\Scripts\golfing>powershell.exe "ps"

1
我必须承认,我检查了一下是否确实划掉了它。你甚至都说不清。
Carcigenicate's

@Carcigenicate我可以不选择文本就知道它是否被划线(Ubuntu 16.04.1,Chrome 54.0.2840.100)。
暴民埃里克

同样在Android上也可见,尽管不是很清楚:p
tomsmeding

在iOS应用中看起来不错。
Mateusz Piotrowski

我没有代表自己做,但您可以做04并删除。
鲍勃森


9

Commodore 64 Basic,4个字节

1S|0

PETSCII替代:|=SHIFT+Y

Commodore 64零页是一个256字节的内存区域,可以比其余RAM更快地访问。因此,程序(例如BASIC解释器)将其用于频繁访问的数据,并且CPU本身在此处存储其一些内部状态。内容如有更改,恕不另行通知。

上面的BASIC程序是1 SYS 0,即。将执行转移到内存位置0。这开始将零页作为代码执行。通常,当BASIC解释器开始运行程序时,前16个字节为

2F 37 00 AA  B1 91 B3 22
22 00 00 4C  00 00 00 00

所以SYS 0将执行以下

00: ROL-AND $37,A  - Undocumented opcode: rotate the value at memory location 0x37 left, and store the result in the accumulator
02: BRK            - Call the interrupt vector

总体结果是输出BASIC READY.提示并将控制权返回给用户。但是,存储位置0x00是CPU的I / O方向寄存器,而存储位置0x01是CPU的I / O地址寄存器。如果您在运行程序之前已经做过一些更改,则结果可能是不可预测的,从输出垃圾到锁定计算机(通常作为指令执行,通常包含在内存位置0x07中的0x22是未记录的)HALT操作码) 。

或者,更可靠的不可预测程序是四字节

1?TI

自系统开机以来,以时差(1/60秒)打印经过的时间。


8

05AB1E,2个字节

žd

在线尝试!

从执行机器的内部时钟输出当前的微秒。

或者你可以做这样的事情...

05AB1E,3个字节

A.r

在线尝试!

输出随机改组的小写字母。

或者这也可以:

A.R

在线尝试!

从字母表中输出随机字母。

或者这也可以,并且更酷:

05AB1E,9个字节

"ž"A.RJ.V

在线尝试!

随机输出以下之一:

ž 23  > ža           push current hours
        žb           push current minutes
        žc           push current seconds
        žd           push current microseconds
        že           push current day
        žf           push current month
        žg           push current year
        žh           push [0-9]
        ži           push [a-zA-Z]
        žj           push [a-zA-Z0-9_]
        žk           push [z-aZ-A]
        žl           push [z-aZ-A9-0_]
        žm           push [9-0]
        žn           push [A-Za-z]
        žo           push [Z-Az-a]
        žp           push [Z-A]
        žq           push pi
        žr           push e
        žs           pop a, push pi to a digits (max. 100000)
        žt           pop a, push e to a digits (max. 10000)
        žu           push ()<>[]{}
        žv           push 16
        žw           push 32
        žx           push 64
        žy           push 128
        žz           push 256


8

C,25 21字节

感谢pseudonym117节省了4个字节。

main(i){putchar(&i);}

编译为gcc -o test lol.c(是的,我的文件名很原始...),然后运行./test

它按其说的做:打印与i运行时定义的的内存地址相对应的字符,因此它应是不确定的。


1.您可以跳过,&因为未定义堆栈上变量的值吗?2.堆栈中的事物数是常数,如果i常数,则存储器地址也是吗?
莱利

2
i变成通常所说的argc,所以您是对的,除非有更多参数,否则它将始终为1。我不敢相信我没有记住这一点。我仍然不确定为什么位置会更改,但是如果可以,它会起作用。
莱利

1
由于ASLR(一种旨在使漏洞利用者更难猜测地址的安全性功能),它在现代操作系统上发生了变化。在某些较旧的操作系统上,您将获得一致的结果。

1
您可以putcharreturn
ceilingcat '16

1
在警告您未声明参数类型的现代编译器上,您可以执行以下操作:main(){printf("%d");}
Myria

7

Python 2,29个字节

import os
print os.urandom(9)

遗憾的是,这不是第一次在智能手机上编写代码。


6

Perl,5个字节

say$$

输出进程ID和换行符。



5

Pyke,1个字节

C

在这里尝试!

输出当前时间


1
我相当确定这是确定性的。
Rɪᴋᴇʀ

@EasterlyIrk在被删除的评论mbomb中说这没关系
Blue

哦好的。对我来说似乎是确定性的,但是OP规则。
Rɪᴋᴇʀ

在我的编辑历史记录中,我有一个3字节的版本,具有适当的随机性
蓝色,

@EasterlyIrk如果当前时间是确定性的,则伪随机数也是如此,因为这是它们的种子。目标不是“随机性”。目标是非确定性。
mbomb007 '16

5

带有GCC / Clang的C89,20字节

每次使用GCC或Clang构建时,其他C解决方案仅会出现段错误。不过这个。

main(n){puts(&n+1);}

看起来像:

$ for _ in `seq 1 50`; do ./test_89; done
���z�U
�VW��U
�F��U
�v�f2V
��FV
���*=V
�6���U
�20wU
��
�+V
�6
   �U
��V�uU
�v��V
���K�U
��7�qU
�6S�jU
�&�WU
��wV
��6l�U
���U
�F�ߨU
�f���U
���s7V
�f��?V
��;B�U
�;��U
��GV
�� ��U
�vKV
�V?]wU
�����U
��.�U
�v"�XU
��uhpU
��LD�U
�����U
�6X�U
��M�.V
�69��U
��ԤV
���U
����U
�vx4.V
�֝+xU
�F��U
�֤BQV
��#�U
���1^U
����sU
��4�U
��AݗU

大量无法打印的垃圾,但不确定!


为什么“ main(n){puts(&n + 1);}”而不是“ main(n){puts(&n + 1;}}”?
RosLuP '16

@RosLuP您的第二个选项(对于偶然的观察者来说似乎很明显)将字节的值设置为n(当n为1时,puts其地址为1,当n为2时,puts其地址为2)。将n的地址加1(应指向4字节宽)int,将得到一个垃圾地址,其中将存储一个垃圾值,并在其中存储一定数量的字节,直到下一个NUL字节为止。这种行为在GCC和Clang之间是可重现的,完全超出了我。我想我会问StackOverflow。
2016年

我以这种方式阅读“ puts(&n)”:它给看跌期权的地址n,假设n = 0x01020304看跌期权将以字符04 03 02 01或相反的
格式

1
请记住,您n仍然使用一般测试用例中通常调用的argc内容进行了初始化0,因此使用时&nputs将获得一个确定性的指向'\ 0'字节的指针,从而导致一个空字符串(假设指针大小==整数大小以及所有其他内容) 。&n+1但是通常是所谓的地址argv(至少在以相反顺序在堆栈上传递参数而不是在寄存器上并且堆栈从高地址到低地址传递的ABI上),假定ASLR,每个指针应该是不同的指针时间。
Guntram Blohm

@GuntramBlohm你是对的,这很有趣,尽管对我来说指针是8个字节,整数是4个字节。
cat

5

PHP,12个字节

<?=uniqid();

583f4da627ee3根据当前时间(以微秒为单位)输出唯一的ID 。


<?=time();<-10个字节。
Ismael Miguel

@IsmaelMiguel的uniqid()待定数量比time(); 1,000'000 倍还多;)
Mario

我不是说对面。但是提出另一个答案。您可以自由选择那个。
Ismael Miguel

@IsmaelMiguel已经有人给了相同的答案……
Mario

5

Groovy,9个字节

{print{}}

输出:

Script1$_run_closure1@2c8ec01c

因为它输出闭包的内存地址,所以它是不确定的。


而且我认为Kotlin是通向最短JVM解决方案的途径。
F. George

尝试将其放入文件并运行时groovy Script1.groovy,出现错误:Ambiguous expression could be either a parameterless closure expression or an isolated open code block;。我该如何使用?
圣保罗Ebermann

将其分配给闭包变量,然后调用它。
魔术八达通n

5

Emotinomicon,15个字节

😀😅🎲⏬

说明:

😀😅🎲⏬
😀      push 0. Stack: [0]
  😅    push 1. Stack: [1]
    🎲  random[pop;pop]. Stack: [1 or 0]
      ⏬output

该语言的名称为Emotinomicon
acrolith

@daHugLenny我怎么错过了:)
RomanGräf'16

5

Windows上的Borland C,12个字节

m(){puts();}

我改写它是因为他们说可以使用一个功能。编译器没有检查该参数,因此对其进行编译。但是看一个地址“没人知道”,然后开始打印该地址的哪一点,直到找到字节0x00。如果该地址的空间不足以保留给程序使用,请在此处打印一些内容


这不会给出不确定的输出,只是每次都出现段错误。
2016年

或者,如果得到的不是段错误,则使用什么编译器?
2016年

@cat是一个Borland C编译器+ Windows7 Os。在我看来:上面的代码获取栈顶的地址(在这种情况下,函数main()中有返回的地址)并从主空间代码中的该地址读取...因此,这取决于编译器的输出。但是我不知道100%...这可能是因为您的
操作系统

1
@RosLuP:它只会打印堆栈内存(或第二个arg传递寄存器中的任何垃圾)(对于x86-64和大多数RISC调用约定,它们通过寄存器中的前几个arg)。它不会打印堆栈的地址。在x86-64中,可能会打印出来argv,因为编译器可能会调用main的第二个arg仍在该寄存器中的printf。这正是针对Linux的gcc6.2所发生的情况:请参见Godbolt编译器资源管理器上的source + asm:main之前没有接触过RSI call printf
彼得·科德斯

1
@RosLuP:argv在堆栈上,但不在最顶层。但是,其地址受堆栈ASLR影响,因此可以正常工作。这样做会效果不佳-m32。您可能始终会为零,因为main必须保持堆栈对齐,因此格式字符串上方的堆栈插槽可能是从未被触及的新鲜堆栈内存(并且可能始终为零,因为内核通过将页面清零来避免信息泄漏提供充满旧数据的用户空间页面)。
彼得·科德斯

5

婴儿语言,0字节



我之所以没有提交此邮件,是因为我认为它早于问题提交。我错了; 该语言确实有及时创建的口译员。这也可能是我所见过的最不作弊的0字节解决方案(假设已指定0字节程序完全按照程序的要求进行操作,而不是为了欺骗高尔夫挑战而设计)。

婴儿语言被指定为忽略它给出的程序并随机执行某些操作。(在Esolang页面上链接的解释器生成了一个随机的合法BF程序并运行该程序。)这似乎完全可以应对这一挑战。

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.