俄罗斯轮盘


28

写一个玩俄罗斯轮盘的程序!

如果程序启动,

  • 打印“我还活着!”之后,应该有六分之五的机会正常结束
  • 该程序崩溃的可能性应该为六分之一。(分段错误等)

没有输入,也没有其他输出是允许的。

随机性必须是公平的:它必须具有统一的概率分布。这意味着未初始化的变量(或没有种子的RNG)MOD 6将不足。

如果该解决方案仅适用于一个专用的操作系统/平台,您将获得6字节的罚款。

最短的代码获胜,不得早于第一个有效答案后的10天之内。


1
即使在文档中没有明确保证,我们也可以依靠底层运行时来公平吗?例如,Python randrange(5)可以实现为randrange(MAX_INT)%6
ugoren

为了激发创造力,您可以考虑对那些依赖零除的解决方案给予奖励。
primo 2012年

或许说,奖金应该涉及分割得分2
乔Z.

1
@JoeZeng:那太过分了。通常,您只需花几个字符就可以使它成为一个不同的错误,例如空指针引用等。
vsz 2013年

我懂了。我在为代码高尔夫球拼图创建评分条件方面经验不足,因此我仍在学习类似的知识。
Joe Z.

Answers:


4

05AB1E13 12 字节

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
魔术章鱼缸

1
@MagicOctopusUrn是的,05AB1E几乎从不会出错。除了.0旧版本的内置函数在05AB1E的旧版本中向STDERR抛出0除法错误外,我什至都不知道如何在旧版05AB1E中出错。但是,新版本仍然存在很多错误,我借此机会在这里。;)
Kevin Cruijssen,

1
我想念旧的东西.0,不止一次使某人去“ Wat ...为什么要这样一个命令?”
魔术章鱼缸

11

PHP 38字节

<?~$$s[rand(+$s=sssss,5)]?>I survived!

将a +放在非数字字符串前的取值为0。应该rand(0,5)返回5$s[rand(0,5)]将为空字符串(因为$s只有五个字符),随后$$s[rand(0,5)]将为未初始化的变量。尝试进行反转将在不支持的操作数类型上停止。任何其他值0-4将返回s,并且由于$s已定义,您将生存下来。

注意:自php版本4.2.0起,随机数生成器会自动生成种子


6

R 30

"I survived!"[6*runif(1)<5||Z]

六分之一的时间,它将引发错误: Error: object 'Z' not found


6

Ruby,24-28岁

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)
ugoren

Ruby是否会自动为其RNG播种?
vsz 2012年

您可以通过删除控制流来修剪另外三个字符:1/rand(6);p "I survived!"
histocrat

@ugoren / histocrat感谢您的提示,我调整了解决方案。
knut

另一个字节供您使用:p和之间不需要空格"I survived!"。根据我的计算,只有24个字节。
primo 2012年

6

Dyalog APL- 25 22 21 20角色

'I Survived!'⊣1÷6⊤?6

DOMAIN ERROR由于被零除,因此打印为错误。

我能想到的最短的非零除法是23个字符。

('I Survived!'1)[~6⍷?6]

它抛出一个 INDEX ERROR

在这里尝试

APL字体在这里


我想接受它,但是它似乎没有用。几次打印“ I survived”,但打印DOMAIN ERROR一次后,仅继续打印。即使我完全重新加载该站点,它也将永远无法生存。
vsz

@vsz多么奇怪...它可以在我的Dyalog APL WS中工作,我记得完成后使用TryAPL对其进行了测试。它仍然可以在我的解释器上使用,但不能在网站上使用。如果这样做有帮助:dl.dropbox.com/u/9086539/apl.png
MrZander 2013年

1
1÷0DOMAIN ERROR在Dyalog中是,但在ngn / apl中是?6⎕IO←1(当Dyalog中为默认值)时,结果为1..6;当(当ngn ⎕IO←0/ apl中仅此选项)时,结果为0..5 。在Dyalog中,可以通过设置PRNG作为种子⎕RL。最初,它具有一些预定的默认值。如果设置⎕RL←0,则PRNG被操作系统相当不可预测地重新播种。TryAPL 正在使用Dyalog,并且支持该?功能
ngn 2014年

1
当时很有可能发生了一些变化,我们偶尔会在TryAPL背后更新软件或尝试网站的功能。我隶属于吗?如果我告诉你,我将不得不杀死你……好吧,概率为1÷6 :)
ngn 2014年

1
顺便说一句,这里是一个18个字符的解决方案:'我活了下来!' ⊣÷⍟6?
NGN

5

Python,96

from ctypes import*
from random import*
randrange(5)or pointer(c_int())[9**9]
print'I survived!'

如果randrange(5)返回0,则python将由于分段错误而崩溃。



5

Befunge-48个字符

 v >91+"!devi"v
/?>?<v"I surv"<
 / / :
   :,_@#

Befunge唯一的随机性是?运算符,它会向您发送四个可能方向之一(1/4机会)。通过阻断一个或两个方向,你有1/31/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!

5

J,18

'I survived!'[q:?6

domain error尝试分解0时失败。


J是否会自动为其RNG播种?
vsz 2013年

@vsz是的,使用?。您可以使用?.固定种子。
randomra

4

C,67 65 62字符

rand()%8不会失去公平。除法崩溃为t=0,为1和2给出真(重试),为3..7给出假(存活)。
编辑:以前的版本使用一个临时变量,最终完全不需要。2/(rand()%8)实现两个必要条件。

main(){
        for(srand(time(0));2/(rand()%8););
        puts("I survived!");
}

是的 “不允许其他输出”
vsz 2012年

@vsz,以某种方式错过了它。但是无论如何,使用gcc / Linux不会打印任何内容。另外,严格遵守该标准是不可能的,因为未定义的行为可能会打印任何内容。
ugoren

@vsz,现在已修复-在任何情况下都没有额外的输出。也可以进行优化,并且缩短2个字符。
ugoren

4

T-SQL 56 44 40 + 6

 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
-1并且ceiling不需要。cast将会截断
SeanC

我测试,如果不违反均匀分布的要求被删除上限,文档说兰特()返回到1之间浮动值0
freewary

我想知道是否可以从我的第一个条目中删除上限。我无法从T-SQL文档中确定rand()函数是否会返回1。因此,我运行了大约5,000万次循环来测试rand()函数,但从未执行过返回1的循环。但是,从我的第一个条目中删除上限仍然是47个字节,因此我的第二个条目仍然更短。保持天花板并除去石膏。
Freewary 2012年

我怀疑您已经对该脚本进行了20多次测试。这并不总是总是返回预期结果。1/6将失败,并且不返回输出。此语法将起作用:0 / floor(rand()* 6)= 0
t-clausen.dk

3

Javascript,42岁

(Math.random()*6|0)?alert('i survived!'):b

按位或底数相乘的结果,因此得到0到5之间的值。0隐式转换为false,因此在6个案例中的5个案例中,在第6个案例b中引用了某个警报时,警报出现,从而使该过程崩溃。


3

使用通常的零除法:

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.

3
一些建议:摆脱括号,逻辑&&和多余的空间。使用~~而不是int强制积分值。结果是这样的:1/~~rand 6;print"I survived!"
ardnew

3

GolfScript,21个字符

,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!'成为有效的解决方案。可能应该有人告知“恶毒”。
primo 2012年

1
我报告了此错误,并且在最新版本的GolfScript解释器中已修复了该错误(以及我偶然发现的另一个错误)。
Ilmari Karonen

3

Python,70个字符

从grc的答案中得到启发。

from random import*
if randrange(5)<1:exec'()'*9**5
print'I survived!'

randrange(5)返回0到5之间的值。
如果返回0,则Python在尝试执行包含9 ^ 5套括号的代码字符串时崩溃。


3

PHP-30个字节

<?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+中是可选的)。
primo 2012年

@primo猜猜我在检查除数为零时只在寻找堆栈跟踪,没有注意到它仍在打印。我知道三元速记是5.3+,但是我对支持过期的版本真的不感兴趣:)
Leigh

我同意。目前没有有效的论据来继续使用低于5.3的值。5.4,我仍在争取两位数的修订号。
primo 2012年

1
我数了29个字节。
泰特斯

3

Befunge,38岁

v>25*"!devivrus I",,,,,,,,,,,@
?^
v
?^
<1

很简单。通过将1压入堆栈直到溢出来完成崩溃。我做了一些尝试,以剪掉这11个逗号,并用一些更有效的循环替换它们以打印所有内容,但是用11个字符以下的字符却无法解决。

请注意,对Befunge中的字符进行计数有点棘手...例如,在第三行上只有一个字符,但是由于执行可能会穿过该位置,因此我在其中计数了一个额外的字符。


我相信这是我在程序中见过的最连续逗号的记录。
Joe Z.

然后,我查看Befunge的实际工作原理,并握住我的脸。
乔Z.13年

2

CMD Shell(Win XP或更高版本),40 +6

我之所以这样做,是因为DOS甚至都不是代码高尔夫中应该考虑的东西,而空格很重要

set/a1/(%RANDOM% %% 6)&&echo I Survived!

失败时,它将打印

除以零误差。


2

R,50 44 42 36

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”丢失,没有默认值


我尝试过R,但无法使其失败- if(1/0)"I Survived!"仍然可以打印,
活着

与其他语言不同,R不会将1/0视为数学错误,并且不会停止执行,它只会返回1/0的inf值。我认为@vsz希望此轮出现重大错误。但是假设vsz将NA视为死亡错误,我可以将程序缩小到41个字符:ifelse(sample(c(NA,1:5),1),'I
Survived

2

Emacs-Lisp,42个字符

(if (= (random 6) 5) 
    z (message "I survived!")
    )

2

Javascript,40个字符

在Javascript中,除零技巧甚至不起作用:它只会返回Infinity。因此,引用一个不存在的变量:

alert(6*Math.random()|0?"I survived!":f)

没那么短,虽然很有趣:)



2

TI-BASIC(TI-84 + / SE),36字节

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计算器上的命令。所述计算器具有不同的操作系统。


2

Python,53个字节

这是一个简短的53字节python索引超出范围的程序:

import time
[0][time.time()%6<1]
print("I survived!")

大家好 请注意,在此挑战的规则中,它指出“ MOD 6将不足以解决问题”。尽管我不熟悉Python,但在我看来,您在这里使用的是Modulo。
Shaun Bebbers,

1
@ShaunBebbers语录是“这意味着未初始化的变量(或没有种子的RNG)MOD 6不足以解决这个问题,”但此meta post指出,当前时间模数足以满足PRNG的代码高尔夫
Stephen

那是我的误会
Shaun Bebbers

1

爪哇,149

public class R{public static void main(String[]s){int[]a={1,1,1,1,1};System.out.println(a[new java.util.Random().nextInt(7)]>0?"I survived!":"");}}

出现“数组超出范围”错误。通过使用匿名Random对象(无导入)来设法剃掉了几个字符。


1

Groovy,39岁

1/new Random().next(6);print"I survived!"

选择一个介于0和5之间(含0和5)的随机数。如果为0,则抛出被零除的异常。


1

Python(56),Haskell(77)

当生成的数字为1时,这会因IndexError崩溃:

来自随机导入*
打印['我还活着!'] [1 / randint(1,7)]

Haskell解决方案具有相同的想法:

导入System.Random
main = putStrLn。([[“我还活着!”] !!)。div 1 = << randomRIO(1,6)

1

蟒蛇,59 55 53,65 59 56

import os
1/(ord(os.urandom(1))%6)
print"I survived!"

ZeroDivisionErrorord(os.urandom(1))%6评估为0时

import os
print(["I survived!"]*5)[ord(os.urandom(1))%6]

IndexErrorord(os.urandom(1))%6评估为5


通过更改导入保存5个字符:import random as r然后使用r.randint
Steven Rumbalski 2013年

1
或通过将import更改为来保存8个字符import os,然后将其ord(os.urandom(1))%6用作您的随机整数。
史蒂文·鲁姆巴尔斯基

通过删除空格来节省1个字符print
史蒂芬·鲁姆巴尔斯基

1

VBA-39/46

我不喜欢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 。


1

Japt v1.4.5,16个字节

6ö
ªí
`I s¨viv!

试试吧

-1个字节感谢@Shaggy!

抛出TypeError: U.í is not a function时的范围内的随机数[0,6)0



实际上,为此使用v1.4.5可能是一个主意,以防万一ETH N.í()向v1.4.6 添加了一种方法。
毛茸茸的

更新-Japt努力不使程序崩溃。我试图弄清楚如何引用不存在的变量(定义了AZ),但没有考虑调用不存在的方法。
dana

是的,这N.í()是我“抛出”错误的“去”(过去是N.y())。还有其他几种获取错误的方法,但是它们很少有用。
毛茸茸的

现在,我为什么不考虑使用第三条线?:\
毛茸茸的
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.