您需要产生不确定的输出。
在这种情况下,这将被定义为表示输出将不会总是相同的结果。
规则:
始终具有相同种子的伪随机数生成器不计算在内。
您可以依靠程序在每次执行的不同(未知)时间运行。
您的代码的进程ID(如果解释器未固定)可以认为是不确定的。
您可能依赖于基于网络的随机性。
您的代码可能不接受非空输入。相关meta post。
不需要暂停程序,但是必须显示输出。
您需要产生不确定的输出。
在这种情况下,这将被定义为表示输出将不会总是相同的结果。
规则:
始终具有相同种子的伪随机数生成器不计算在内。
您可以依靠程序在每次执行的不同(未知)时间运行。
您的代码的进程ID(如果解释器未固定)可以认为是不确定的。
您可能依赖于基于网络的随机性。
您的代码可能不接受非空输入。相关meta post。
不需要暂停程序,但是必须显示输出。
Answers:
#
哇!没想到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]
int a(){return hashCode();}
因为Java。
toString
在先前版本中使用过@carusocomputing ,但是返回类型String
比更长int
。保存字节!:]
hashCode()
是的缩写this.hashCode()
,因此只能用作实例方法,不能用作静态方法。在这种情况下,您需要其他代码才能在调用方中创建对象。这在这里很重要,因为它是创建负责确定性的对象的代码。
()->hashCode()
14个字节。只是说说;)
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
我能想到的任何功能都要短。
空程序仍会产生输出。执行的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
并在前面写入包含当前时间的字符串。
v
!
@
要么打印0
要么什么都不打印(每次打印50%的机会)。
在一个非常特殊的情况下,迷宫表现出随机的行为:
如果满足所有这些条件,则将随机(均匀地)选择IP移动的方向。最重要的是,这三个条件在常规控制流中是不可能满足的,这意味着除非您在运行时修改源代码。
(这似乎有些武断,但这实际上是我在这些条件下可以找到的最一致的行为,因为通常IP的方向始终取决于先前的方向,其邻居和堆栈顶部的符号,并且这似乎是在语言中包含随机性来源的一种优雅方式。)
借助源代码轮换说明(<^>v
),可以将IP置于这种情况。在顶部可以看到一个这样的例子。IP最初指向东方,并从顶部开始。该v
旋转当前列,使我们得到:
@
v
!
IP随此旋转而移动,因此它仍在v
指向东的上。现在已满足所有条件,因此IP会随机增加或减少。如果上升,程序将立即终止。如果下降,则打印零,再次旋转列,然后终止。
还有其他三个程序使用此程序(一个也可以打印0
,一个可以打印00
,另一个可以打印000
):
v
@
!
"
>@!
"
>!@
(实际上,还有三个以上的程序,因为您还可以使用.
而不是!
打印空字节,或者用"
各种各样的命令替换它,但是我相信它们的工作原理基本相同。)
?.@
在?
以随机方向发送执行。如果它上升或下降,则会循环回到?
并重新滚动。如果左移,该程序将环绕到,@
并退出而不打印任何内容。如果正确,它将打印0
(.
堆栈为空时产生的输出),然后在上退出@
。
op 8
通过键入服务器的控制台或命令块并赋予其电源来使用。可以在聊天界面前添加来运行/
。
通常这不会执行任何操作,但是如果服务器上有一个用户名“ 8”的播放器,则会为他们提供操作员权限。请注意,尽管Minecraft通常要求用户名的长度为3个字符,但在此限制之前创建了一些名称长度较短的帐户。
在没有以下用户名之一的情况下,可以证明该版本是不确定的版本,否则有给用户操作员权限的风险:
me @r
向所有人显示一条消息,该消息是随机播放器的用户名。该op
命令仅使用字符串文字,而不使用任何返回字符串的脚本。
me
对于第一个示例,该命令实际上并不起作用,它将显示"<your-username> 8"
。从命令块运行时,它不是确定性的,因为所有命令块都具有相同的“用户名”,但是从聊天界面运行它需要/
额外的一个字节。
/
字节数不包括在内吗?
help
在命令块中,该命令块为4个字节(并且不需要盗版游戏)。
w
我知道这是最短的解决方案,它可以通过调用外部可执行文件来实现。procps
是负责报告有关当前系统状态(ps
和好友)信息的负责任软件包,默认情况下已安装在大多数Linux发行版中;w
是其中名称最短的命令,它返回有关已登录用户的信息,还返回一些不确定性信息,例如正常运行时间。
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”的属性。
Date
返回当前日期/时间的函数。我认为这是最短的...
由于这似乎引起人们对其有效性的困惑,因此我将尽力进行解释。
在JavaScript中,如果可以将函数条目分配给变量并像函数一样调用,则该函数条目有效。例如,此函数是有效的条目:
function(){return Date()}
因为它是可以分配给变量的函数,如下所示:
f=function(){return Date()}
然后f()
根据需要运行多次。每次,它都会返回当前日期/时间字符串,OP已将其确定为不确定的日期/时间字符串。
此ES6箭头功能也有效:
_=>Date()
可以将其分配给f=_=>Date()
,然后f()
像另一个一样运行。
现在,这是另一个有效条目:
Date
为什么?因为就像其他两个条目一样,可以使用分配它f=Date
,然后使用调用它f()
,并返回与其他两个完全相同的东西。试试吧:
Date()
调用该函数?
Date
是一个函数,当不带任何输入调用时,它会生成当前日期/时间。_=>Date()
是一个完全相同的事情Date
的有效输入,有效输入也是如此。
Date
浏览器的JavaScript控制台会产生确定性的输出,它始终会产生以下内容:function Date() { [native code] }
。您可能是Date()
6个字节。
print id(1)
id(0)
不过,我有。:)
O0
说明:
0 0
O Random float in [0, 1)
那就是,当O
有0
作为它的参数,它只是返回之间的随机浮动0
和1
,排他的。
另外,这似乎有点复古(由于34718 / mbomb007):
OT
说明:
T 10
O Random integer in [0, 10]
(划掉4 仍然看起来像4)
ps
这是别名Get-Process
,它将以表格的形式输出当前进程列表,包括句柄,私有内存,CPU时间等。
通过如下方式执行它:
C:\Tools\Scripts\golfing>powershell.exe "ps"
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秒)打印经过的时间。
žd
从执行机器的内部时钟输出当前的微秒。
或者你可以做这样的事情...
A.r
输出随机改组的小写字母。
或者这也可以:
A.R
从字母表中输出随机字母。
或者这也可以,并且更酷:
"ž"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
感谢pseudonym117节省了4个字节。
main(i){putchar(&i);}
编译为gcc -o test lol.c
(是的,我的文件名很原始...),然后运行./test
。
它按其说的做:打印与i
运行时定义的的内存地址相对应的字符,因此它应是不确定的。
&
因为未定义堆栈上变量的值吗?2.堆栈中的事物数是常数,如果i
常数,则存储器地址也是吗?
i
变成通常所说的argc
,所以您是对的,除非有更多参数,否则它将始终为1。我不敢相信我没有记住这一点。我仍然不确定为什么位置会更改,但是如果可以,它会起作用。
putchar
用return
main(){printf("%d");}
say$$
输出进程ID和换行符。
每次使用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
大量无法打印的垃圾,但不确定!
puts
其地址为1,当n为2时,puts
其地址为2)。将n的地址加1(应指向4字节宽)int
,将得到一个垃圾地址,其中将存储一个垃圾值,并在其中存储一定数量的字节,直到下一个NUL字节为止。这种行为在GCC和Clang之间是可重现的,完全超出了我。我想我会问StackOverflow。
n
仍然使用一般测试用例中通常调用的argc
内容进行了初始化0
,因此使用时&n
,puts
将获得一个确定性的指向'\ 0'字节的指针,从而导致一个空字符串(假设指针大小==整数大小以及所有其他内容) 。&n+1
但是通常是所谓的地址argv
(至少在以相反顺序在堆栈上传递参数而不是在寄存器上并且堆栈从高地址到低地址传递的ABI上),假定ASLR,每个指针应该是不同的指针时间。
<?=time();
<-10个字节。
uniqid()
待定数量比time()
; 1,000'000 倍还多;)
{print{}}
输出:
Script1$_run_closure1@2c8ec01c
因为它输出闭包的内存地址,所以它是不确定的。
groovy Script1.groovy
,出现错误:Ambiguous expression could be either a parameterless closure expression or an isolated open code block;
。我该如何使用?
😀😅🎲⏬
说明:
😀😅🎲⏬
😀 push 0. Stack: [0]
😅 push 1. Stack: [1]
🎲 random[pop;pop]. Stack: [1 or 0]
⏬output
m(){puts();}
我改写它是因为他们说可以使用一个功能。编译器没有检查该参数,因此对其进行编译。但是看一个地址“没人知道”,然后开始打印该地址的哪一点,直到找到字节0x00。如果该地址的空间不足以保留给程序使用,请在此处打印一些内容
argv
,因为编译器可能会调用main的第二个arg仍在该寄存器中的printf。这正是针对Linux的gcc6.2所发生的情况:请参见Godbolt编译器资源管理器上的source + asm:main之前没有接触过RSI call printf
。
argv
在堆栈上,但不在最顶层。但是,其地址受堆栈ASLR影响,因此可以正常工作。这样做会效果不佳-m32
。您可能始终会为零,因为main
必须保持堆栈对齐,因此格式字符串上方的堆栈插槽可能是从未被触及的新鲜堆栈内存(并且可能始终为零,因为内核通过将页面清零来避免信息泄漏提供充满旧数据的用户空间页面)。
我之所以没有提交此邮件,是因为我认为它早于问题提交。我错了; 该语言确实有及时创建的口译员。这也可能是我所见过的最不作弊的0字节解决方案(假设已指定0字节程序完全按照程序的要求进行操作,而不是为了欺骗高尔夫挑战而设计)。
婴儿语言被指定为忽略它给出的程序并随机执行某些操作。(在Esolang页面上链接的解释器生成了一个随机的合法BF程序并运行该程序。)这似乎完全可以应对这一挑战。