Schreiben Sie ein Programm, das russisches Roulette spielt!
Wenn das Programm gestartet wird,
- Es sollte eine 5 zu 6 Chance geben, dass es normal endet, nachdem "Ich habe überlebt!" gedruckt wurde.
- Es sollte eine 1 zu 6 Chance geben, dass das Programm abstürzt. (Segmentierungsfehler usw.)
Keine Eingabe und keine anderen Ausgaben sind zulässig.
Die Zufälligkeit muss fair sein: Sie muss eine gleichmäßige Wahrscheinlichkeitsverteilung haben. Dies bedeutet, dass eine nicht initialisierte Variable (oder ein RNG ohne Startwert) MOD 6 nicht ausreicht.
Wenn die Lösung nur mit einem dedizierten Betriebssystem / einer dedizierten Plattform funktioniert, erhalten Sie eine 6-Byte-Strafe für die Bewertung.
Der kürzeste Code gewinnt, frühestens 10 Tage nach der ersten gültigen Antwort.
randrange(5)
könnte Python als implementiert werdenrandrange(MAX_INT)%6
.Antworten:
05AB1E ,
1312 Bytes-1 Byte dank @Emigna .
05AB1E sollte eigentlich überhaupt nicht fehleranfällig sein, aber da die neue Version von 05AB1E im Vergleich zur Vorgängerversion noch einige Probleme aufweist, kann ich das zu meinem Vorteil nutzen, um bei dieser Herausforderung Fehler zu machen.
Probieren Sie es online aus.
Erläuterung:
Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum
“IЖd!
ist"I survived!"
.quelle
5ÝΩz“IЖd!
aber anscheinend so zu funktionieren1 / 0 = 0
..0
das in einer alten Version von 05AB1E eine Division durch 0-Fehler an STDERR warf, weiß ich nicht einmal, wie man Fehler in der alten 05AB1E macht . Die neue Version hat aber immer noch einige Fehler, die ich hier zu meiner Gelegenheit genutzt habe. ;).0
, bei mehr als einer Gelegenheit brachte es jemanden dazu zu sagen: "Wat ... Warum ist das ein Befehl?"PHP 38 Bytes
Das Platzieren von
+
vor einer nicht numerischen Zeichenfolge wird zu ausgewertet0
. Sollterand(0,5)
zurückkehren5
,$s[rand(0,5)]
ist dies die leere Zeichenfolge (da sie$s
nur fünf Zeichen lang ist) und anschließend$$s[rand(0,5)]
eine nicht initialisierte Variable. Der Versuch, die Inversion durchzuführen, wird bei nicht unterstütztem Operandentyp angehalten. Jeder andere Wert0-4
wird zurückgegebens
und$s
Sie werden überleben , da er definiert ist.Hinweis: Ab der PHP-Version 4.2.0 wird der Zufallszahlengenerator automatisch gesetzt .
quelle
R 30
Einmal von sechs wird ein Fehler ausgegeben:
Error: object 'Z' not found
quelle
Ruby, 24-28
Ca. alle 6 mal gibt es eine
ZeroDivisionError
Es gibt sogar eine kürzere Version mit 24 Zeichen (Dank an ugoren und histocrat):
Wenn Sie das
"
in der Ausgabe nicht akzeptieren , dann brauche ich noch 3 Zeichen. Die erste Option (puts
) fügt eine neue Zeile hinzu, die zweite ($><<
) macht keine neue Zeile:Es gibt eine Frage zu Zufallszahlen in Ruby bei SO . Der Startwert mit
srand
wird automatisch mit dem Startwert aus der aktuellen Zeit aufgerufen, wenn er nicht bereits aufgerufen wurde. (siehe Julians Kommentar )Primo hatte die Idee für einen zusätzlichen Bonus für solche Lösungen zu erhalten, die nicht auf einer Division durch Null beruhen .
Meine erste Lösung kann mit a (28 Zeichen) gekürzt werden
undefined local variable or method ``a' for main:Object (NameError)
quelle
6/rand(6)
.1/rand(6);p "I survived!"
p
und ist kein Leerzeichen erforderlich"I survived!"
. Nach meiner Zählung sind das nur 24 Bytes.Dyalog APL -
25222120 CharachtersDruckt
DOMAIN ERROR
aufgrund der Division durch Null als Fehler.Die kürzeste Lösung, die ich ohne Division durch Null finden konnte, sind 23 Zeichen.
Es wirft ein
INDEX ERROR
Probieren Sie es hier aus
APL-Schriftart hier
quelle
I survived
" gedruckt, aber nach demDOMAIN ERROR
einmaligen Drucken wird immer nur das gedruckt. Selbst wenn ich die Seite komplett neu lade, wird sie nie wieder überleben.1÷0
is aDOMAIN ERROR
in Dyalog but in ngn/apl it's∞
. The result from?6
is 1..6 when⎕IO←1
(default in Dyalog) and 0..5 when⎕IO←0
(only option in ngn/apl). In Dyalog, the PRNG can be seeded by setting⎕RL
. Initially it has some pre-determined default value. If you set⎕RL←0
, the PRNG is re-seeded fairly unpredictably by the OS. TryAPL is using Dyalog and does support the?
function.Python, 96
If
randrange(5)
returns 0, then python will crash due to a segmentation fault.quelle
vba, 27
used in immediate window.
On failure, an error window stating:
appears
quelle
!
in the text.Befunge - 48 chars
Befunge's only randomness is the
?
operator, which sends you heading in one of four posible directions (1/4
chance). By blocking one or two directions, you have1/3
or1/2
chance, and by combining these, you get1/6
chance to get out of the program "alive".The program crashes by doing a divive-by-zero. I guess it's implementation-specific what will happen (on Wikipedia it says the program should ask for the desired answer), but befungee.py sort of crashes, or exits angrily:
quelle
J, 18
Failing with
domain error
when trying to factorise 0.quelle
?
. You can use?.
for fixed seed.C,
676562 charsrand()%8
doesn't lose fairness. Division crashes fort=0
, gives true for 1 and 2 (retry), gives false for 3..7 (survived).EDIT: The previous version used a temporary variable, which ended up completely unneeded.
2/(rand()%8)
implements both needed conditions.quelle
T-SQL
56 4440 + 6Credit Sean Cheshire for calling out cast as unnecessary
Credit personal message from Sean Cheshire for suggestion to change ceiling to floor.
Death Err Msg: Msg 8134, Level 16, State 1, Line 3 Divide by zero error encountered.
quelle
-1
andceiling
are not needed.cast
will truncateJavascript, 42
(Math.random()*6|0)?alert('i survived!'):b
The bitwise or floors the result of the multiplication thus a value between 0 and 5 results. 0 gets implictly casted to false, so in 5 of 6 cases the alert appears in the 6th case a certain
b
is referenced, crashing the process.quelle
Using the usual divide by zero method:
Perl 5.8 Version
Perl 5.10 Version
On failure, these will display:
Using the bless function which is used for creating objects in perl.
Perl 5.8 Version
Perl 5.10 Version
On failure, these will display:
quelle
&&
, and the extra space. use~~
instead ofint
to force integral values. the result is this:1/~~rand 6;print"I survived!"
GolfScript, 21 chars
Like most of the answers, this one has a one in six chance of crashing with a ZeroDivisionError. The shortest solution I could manage without using division by zero is 23 chars:
which has a 1/6 chance of crashing with
undefined method `+' for nil:NilClass (NoMethodError)
.(Ps. While developing this, I found what might be a bug in the GolfScript interpreter: code like
0,1>
appears to leave anil
value on the stack, which will later crash the program if you try to do anything with that value except pop it off and throw it away with;
. Unfortunately, the fact that I do need to use the value somehow to trigger a crash means that even exploiting this bug didn't help me get below 23 chars.)quelle
5,5>
leaves[]
on the stack, which is probably what it should do, but4,5>
leavesnil
. If you don't remove it, the interpreter will actually crash while trying to output it. An interesting side-effect is that4,6rand>+;'I survived!'
becomes a valid solution. Someone should probably inform Flagitious.Python, 70 characters
With inspiration from grc's answer.
randrange(5) returns a value between 0 and 5.
If it returns a 0, Python crashes while attempting to exec(ute) a string of code that contains 9^5 sets of parentheses.
quelle
PHP - 30 bytes
Requires PHP 5.4+ for the short array syntax, invalid operator idea shamelessly stolen from @primo.
As stated,
rand()
is automatically seeded on first use.quelle
rand()%6
is not a uniform distribution, as32768 = 2 (mod 6)
. However,rand(0,5)||~$a
for 30 bytes is, and will additionally work with all PHP versions (the second expression in a ternary is only optional in 5.3.0+).Befunge, 38
Pretty straight-forward. Crashing is done by pushing 1s onto the stack until it overflows. I made a few attempts at cutting out those 11 commas and replacing them with some more efficient loop to print everything, but couldn't get it under 11 characters.
Note that counting characters in Befunge is a little tricky... For instance there's only one character on the third line, but I'm counting an extra one there since execution could travel through that location.
quelle
CMD Shell (Win XP or later), 40 +6
I'm only doing this one because DOS is not something that should even be thought of for code golf, and the whitespace is important
On failure, it will print
quelle
R,
50 44 4236Death Err Message:
quelle
if(1/0)"I Survived!"
still printed I SurvivedEmacs-Lisp, 42 characters
quelle
Javascript, 40 chars
In Javascript the divide-by-zero trick doesn't even work: it just returns Infinity. Therefore, referencing a non-existing variable:
Not so short, though fun :)
quelle
PowerShell, 40 Chars
On Failure: "Attempted to divide by zero."
quelle
TI-BASIC (TI-84+/SE), 36 bytes
There is no input, as the challenge specifies.
Output is
I survived!
if successful, aDIVIDE BY 0
error otherwise.The
DIVIDE BY 0
error screen looks like the following:Selecting either option (and returning to home screen if
2
is selected) showsError
after the program call.Examples:
Explanation:
Notes:
TI-BASIC is a tokenized language. Byte count does not equal character count.
Lowercase letters are two bytes each.
startTmr
is a command only on the TI-84+ and TI-84+ SE calculators. Said calculators have different operating systems.quelle
Python, 53 bytes
Here's a short 53 byte python index out of range program:
quelle
Java, 149
Fails with an "Array out of bounds" error. Managed to shave a few characters by using anonymous Random object (no imports).
quelle
Groovy, 39
Picks a random number between 0 and 5 inclusive. If 0, throws a divide by zero exception.
quelle
Python (56), Haskell (77)
This crashes with an IndexError when the generated number is 1:
The Haskell solution has the same idea:
quelle
Python,
59 5553,65 5956ZeroDivisionError
whenord(os.urandom(1))%6
evaluates to 0IndexError
whenord(os.urandom(1))%6
evaluates to 5quelle
import random as r
then user.randint
import os
, then useord(os.urandom(1))%6
as your random int.print
.VBA - 39/46
I don't love Sean Cheshire's numeric output (though still a good answer, it technically fails the
No input, and no other outputs are allowed.
from the spec...), plus he uses/0
, so here are my alternatives:This resolves to a
Run-time error '5': Invalid procedure
when trying to reach character 0 (VBA is 1-based indexing).This resolves to a
Run-time error '13': Type mismatch
when applying a negative switch to a string.quelle
Japt v1.4.5, 16 bytes
Try it
-1 byte thanks to @Shaggy!
Throws
TypeError: U.í is not a function
when a random number in the range[0,6)
is0
.quelle
N.í()
method to v1.4.6.N.í()
is my "go to" for throwing an error (it used to beN.y()
). There are a few other ways of getting an error but they're rarely useful.