写一个玩俄罗斯轮盘的程序!
如果程序启动,
- 打印“我还活着!”之后,应该有六分之五的机会正常结束
- 该程序崩溃的可能性应该为六分之一。(分段错误等)
没有输入,也没有其他输出是允许的。
随机性必须是公平的:它必须具有统一的概率分布。这意味着未初始化的变量(或没有种子的RNG)MOD 6将不足。
如果该解决方案仅适用于一个专用的操作系统/平台,您将获得6字节的罚款。
最短的代码获胜,不得早于第一个有效答案后的10天之内。
写一个玩俄罗斯轮盘的程序!
如果程序启动,
没有输入,也没有其他输出是允许的。
随机性必须是公平的:它必须具有统一的概率分布。这意味着未初始化的变量(或没有种子的RNG)MOD 6将不足。
如果该解决方案仅适用于一个专用的操作系统/平台,您将获得6字节的罚款。
最短的代码获胜,不得早于第一个有效答案后的10天之内。
Answers:
6LΩiFë“IЖd!
-1个字节感谢@Emigna。
实际上,05AB1E根本不应该出错,但是由于新版本的05AB1E与旧版本相比仍然存在一些问题,因此我可以利用我的优势来为这一挑战提供错误信息。
说明:
6L # Create the list [1,2,3,4,5,6]
Ω # Get a random choice from this list
i # If it is 1:
F # Do a ranged loop, which currently results in a "(RuntimeError) Could not
# convert to integer." error when no argument is given
ë # Else:
“IЖd! # Push dictionary string "I survived!" (which is output implicitly as result)
见我这个05AB1E尖端(部分如何使用字典?)理解为什么“IЖd!
是"I survived!"
。
5ÝΩz“IЖd!
应该工作,但显然1 / 0 = 0
。
.0
旧版本的内置函数在05AB1E的旧版本中向STDERR抛出0除法错误外,我什至都不知道如何在旧版05AB1E中出错。但是,新版本仍然存在很多错误,我借此机会在这里。;)
.0
,不止一次使某人去“ Wat ...为什么要这样一个命令?”
p rand(6)<5?"I survived!":1/0
大约每6次, ZeroDivisionError
甚至有24个字符的简短版本(感谢ugoren和histocrat):
6/rand(6);p"I survived!"
如果您不接受"
输出中的,那么我还需要3个字符。第一个选项(puts
)添加换行符,第二个($><<
)不添加换行符:
6/rand(6);puts"I survived!"
6/rand(6);$><<"I survived!"
SO中存在一个有关红宝石中随机数的问题。如果种子srand
尚未被调用,则会自动调用种子为with的当前时间。(请参阅朱利安斯评论)
Primo的想法是为那些不依赖零除的解决方案提供额外的奖励。
我的第一个解决方案可以缩短为(28个字符) undefined local variable or method ``a' for main:Object (NameError)
p rand(6)<5?"I survived!":a
6/rand(6)
。
1/rand(6);p "I survived!"
p
和之间不需要空格"I survived!"
。根据我的计算,只有24个字节。
'I Survived!'⊣1÷6⊤?6
DOMAIN ERROR
由于被零除,因此打印为错误。
我能想到的最短的非零除法是23个字符。
('I Survived!'1)[~6⍷?6]
它抛出一个 INDEX ERROR
I survived
”,但打印DOMAIN ERROR
一次后,仅继续打印。即使我完全重新加载该站点,它也将永远无法生存。
v >91+"!devi"v
/?>?<v"I surv"<
/ / :
:,_@#
Befunge唯一的随机性是?
运算符,它会向您发送四个可能方向之一(1/4
机会)。通过阻断一个或两个方向,你有1/3
或1/2
机会,并通过组合这些,你会得到1/6
机会得到节目“活着”的了。
程序因零除而崩溃。我猜这将是特定于实现的(在Wikipedia上,它说程序应该询问所需的答案),但是befungee.py会崩溃或愤怒地退出:
$ for i in {1..6} ; do ./befungee.py roulette.befunge ; done
Error (1,2): integer division or modulo by zero
Error (3,2): integer division or modulo by zero
Error (1,2): integer division or modulo by zero
I survived!
Error (0,1): integer division or modulo by zero
I survived!
rand()%8
不会失去公平。除法崩溃为t=0
,为1和2给出真(重试),为3..7给出假(存活)。
编辑:以前的版本使用一个临时变量,最终完全不需要。2/(rand()%8)
实现两个必要条件。
main(){
for(srand(time(0));2/(rand()%8););
puts("I survived!");
}
if 1/cast(ceiling(rand()*6)-1as int)<2print'I Survived!'
信用肖恩·柴郡(Sean Cheshire)称不必要的演员表
if 1/ceiling(rand()*6-1)<2print'I Survived!'
归功于肖恩·柴郡(Sean Cheshire)的个人信息,建议将天花板改为地板。
if 1/floor(rand()*6)<1print'I Survived!'
死亡错误消息:消息8134,级别16,状态1,第3行除以零错误。
-1
并且ceiling
不需要。cast
将会截断
Javascript,42岁
(Math.random()*6|0)?alert('i survived!'):b
按位或底数相乘的结果,因此得到0到5之间的值。0隐式转换为false,因此在6个案例中的5个案例中,在第6个案例b
中引用了某个警报时,警报出现,从而使该过程崩溃。
使用通常的零除法:
Perl 5.8版本
1/(int rand 6)&&print "I survived!"
Perl 5.10版本
1/(int rand 6)&&say "I survived!"
失败时,将显示:
Illegal division by zero at -e line 1.
使用bless函数,该函数用于在perl中创建对象。
Perl 5.8版本
print (int rand 6?"I survived!":bless me);
Perl 5.10版本
say (int rand 6?"I survived!":bless me);
失败时,将显示:
Can't bless non-reference value at -e line 1.
&&
和多余的空间。使用~~
而不是int
强制积分值。结果是这样的:1/~~rand 6;print"I survived!"
,6rand/;'I survived!'
像大多数答案一样,此错误中有零分之一的可能性因ZeroDivisionError崩溃。我不使用零除就可以管理的最短解决方案是23个字符:
5,6rand=+;'I survived!'
与一起崩溃的几率是1/6 undefined method `+' for nil:NilClass (NoMethodError)
。
(Ps。在开发此代码时,我发现了GolfScript解释器中可能存在的错误:诸如此类的代码0,1>
似乎nil
在堆栈上留下了一个值,如果您尝试使用该值执行任何操作,则将其弹出,然后将其崩溃,扔掉它与;
不幸的是,事实证明我确实需要使用的值以某种方式引发崩溃意味着,即使利用这个bug没帮我把下面23个字符)。
5,5>
离开[]
堆栈,这可能是应该做的,但是4,5>
离开nil
。如果不删除它,则解释器实际上在尝试输出时会崩溃。一个有趣的副作用是,它4,6rand>+;'I survived!'
成为有效的解决方案。可能应该有人告知“恶毒”。
<?rand(0,5)?:~[]?>I survived!
需要短数组语法的PHP 5.4+,无效的操作员想法从@primo被无耻地偷走了。
如前所述,rand()
在首次使用时会自动播种。
rand()%6
也不是均匀分布的32768 = 2 (mod 6)
。但是,rand(0,5)||~$a
对于30个字节来说,它将是可用的,并且还将与所有PHP版本一起使用(三元组中的第二个表达式仅在5.3.0+中是可选的)。
ifelse(!is.na(sample(c(NA,1:5),1)),'I Survived!',)
ifelse(floor(runif(1,0,5))>0,'I Survived!',)
ifelse(floor(runif(1,0,5)),'I Survived!',)
ifelse(sample(0:5,1),'I Survived!',)
死亡错误消息:
ifelse(!is.na(1 / sample(c(NA,1:5),1)),“ I Survived!”,)中的错误:参数“ no”丢失,没有默认值
if(1/0)"I Survived!"
仍然可以打印,我
startTmr→rand:1/(1<randInt(1,6:"I survived!
正如挑战所指出的,没有输入。如果成功,则
输出I survived!
,DIVIDE BY 0
否则错误。
该DIVIDE BY 0
差错屏幕看起来如下:
ERR:DIVIDE BY 0
1:Quit
2:Goto
程序调用后2
显示选择任一选项(如果选择则返回主屏幕)Error
。
例子:
prgmCDGFE
Error
prgmCDGFE
I survived!
prgmCDGFE
I survived!
prgmCDGFE
Error
说明:
startTmr→rand:1/(1<randInt(1,6:"I survived! ;full program
startTmr→rand ;store the current time into "rand"
; this is necessary because "rand" is 0 after
; factory reset, the default state for TI-BASIC
; submissions
randInt(1,6 ;get a random integer in [1,6]
1< ;is greater than 1? 1 if true, 0 if false
1/( ;divide 1 by the result
; throws "DIVIDE BY 0" error if result was
; false
"I survived! ;leave this string in "Ans"
;implicitly print "Ans"
笔记:
TI-BASIC是一种标记化语言。字节数不不等于字符数。
小写字母每个为两个字节。
startTmr
是仅在TI-84 +和TI-84 + SE计算器上的命令。所述计算器具有不同的操作系统。
这是一个简短的53字节python索引超出范围的程序:
import time
[0][time.time()%6<1]
print("I survived!")
import os
1/(ord(os.urandom(1))%6)
print"I survived!"
ZeroDivisionError
当ord(os.urandom(1))%6
评估为0时
import os
print(["I survived!"]*5)[ord(os.urandom(1))%6]
IndexError
当ord(os.urandom(1))%6
评估为5
import random as r
然后使用r.randint
import os
,然后将其ord(os.urandom(1))%6
用作您的随机整数。
print
。
我不喜欢Sean Cheshire的数字输出(尽管仍然是一个很好的答案,但从技术上讲,它No input, and no other outputs are allowed.
在规格上不合格...),而且他使用/0
,所以这是我的选择:
?Mid("I Survived!",IIf(Int(6*Rnd),1,0))
Run-time error '5': Invalid procedure
尝试到达字符0时,此解析为a (VBA是基于1的索引)。
n="I Survived!":If Int(6*Rnd) Then ?n Else ?-n
Run-time error '13': Type mismatch
将否定开关应用于字符串时,此解析为a 。
6ö
ªí
`I s¨viv!
-1个字节感谢@Shaggy!
抛出TypeError: U.í is not a function
时的范围内的随机数[0,6)
是0
。
N.í()
向v1.4.6 添加了一种方法。
N.í()
是我“抛出”错误的“去”(过去是N.y()
)。还有其他几种获取错误的方法,但是它们很少有用。
randrange(5)
可以实现为randrange(MAX_INT)%6
。