Roulette russe

28

Écrivez un programme qui joue à la roulette russe!

Si le programme démarre,

  • il devrait y avoir 5 chances sur 6 de se terminer normalement après avoir imprimé "J'ai survécu!"
  • il devrait y avoir 1 chance sur 6 que le programme plante. (défaut de segmentation, etc.)

Aucune entrée et aucune autre sortie ne sont autorisées.

Le caractère aléatoire doit être juste: il doit avoir une distribution de probabilité uniforme. Cela signifie qu'une variable non initialisée (ou un RNG sans graine) MOD 6 ne sera pas suffisante.

Si la solution fonctionne avec un seul système d'exploitation / plateforme dédié, vous recevrez une pénalité de 6 octets au score.

Le code le plus court gagne, au plus tard 10 jours après la première réponse valide.

vsz
la source
1
Pouvons-nous compter sur le runtime sous-jacent pour être juste, même s'il n'est pas explicitement garanti dans la documentation? Par exemple, Python randrange(5)pourrait être implémenté en tant que randrange(MAX_INT)%6.
ugoren
Pour inspirer la créativité, vous pourriez envisager d'accorder un bonus aux solutions qui ne reposent pas sur une division par zéro.
primo
Peut-être que ce bonus devrait impliquer de diviser le score par 2.
Joe Z.
1
@JoeZeng: cela aurait été trop. Habituellement, vous pouvez en faire une erreur différente, comme une référence de pointeur nulle, etc. pour le coût de quelques caractères seulement.
vsz
Je vois. Je ne suis pas trop expérimenté dans la création de conditions de score pour les puzzles de golf de code, donc j'apprends toujours des choses comme ça.
Joe Z.

Réponses:

4

05AB1E , 13 12 octets

6LΩiFë“IЖd!

-1 octet grâce à @Emigna .

05AB1E ne devrait pas du tout pouvoir faire d'erreur, mais comme la nouvelle version de 05AB1E a toujours des problèmes par rapport à la version héritée, je peux profiter de cela pour me tromper pour ce défi.

Essayez-le en ligne.

Explication:

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)

Voir cette astuce de la mine de 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi “IЖd!est "I survived!".

Kevin Cruijssen
la source
On dirait que ça 5ÝΩz“IЖd!devrait marcher mais apparemment 1 / 0 = 0.
Urne de poulpe magique le
1
@MagicOctopusUrn Oui, 05AB1E ne fait presque jamais d'erreurs .. Mis à part le très vieux buildin .0qui envoyait une division par 0 d'erreur à STDERR dans une ancienne version de 05AB1E, je ne sais même pas du tout comment faire une erreur dans l'héritage 05AB1E . Cependant, la nouvelle version comporte encore beaucoup d’erreurs, que j’ai saisies de l’occasion ici. ;)
Kevin Cruijssen
1
L'ancien me manque .0, à plus d'une occasion cela a fait dire à quelqu'un "Wat ... Pourquoi est-ce une commande?"
Urne de poulpe magique le
11

PHP 38 octets

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

Placer un +avant une chaîne non numérique sera évalué à 0. Doit rand(0,5)revenir 5, $s[rand(0,5)]sera la chaîne vide (car $sne fait que cinq caractères), et $$s[rand(0,5)]sera par la suite une variable non initialisée. Tenter de prendre l'inversion s'arrêtera sur le type d'opérande non pris en charge. Toute autre valeur, 0-4reviendra s, et parce qu'elle $sest définie, vous survivrez.

Remarque: à partir de la version 4.2.0 de php, le générateur de nombres aléatoires est initialisé automatiquement .

primo
la source
6

R 30

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

Une fois sur six, il générera une erreur: Error: object 'Z' not found

flodel
la source
6

Rubis, 24-28

p rand(6)<5?"I survived!":1/0

Environ 6 fois, il y a un ZeroDivisionError

Il existe même une version plus courte avec 24 caractères (Merci à ugoren et histocrat):

6/rand(6);p"I survived!"

Si vous n'acceptez pas "la sortie, j'ai besoin de 3 caractères supplémentaires. La première option ( puts) ajoute une nouvelle ligne, la seconde ( $><<) ne fait aucune nouvelle ligne:

6/rand(6);puts"I survived!"
6/rand(6);$><<"I survived!"

Il y a une question sur le nombre aléatoire en rubis chez SO . La graine avec srandest automatiquement appelée avec la graine de l'heure actuelle si elle n'a pas déjà été appelée. (voir le commentaire des Julians )


Primo a eu l'idée d'un bonus supplémentaire pour les solutions qui ne reposent pas sur une division par zéro .

Ma première solution peut être raccourcie (28 caractères) avec un undefined local variable or method ``a' for main:Object (NameError)

p rand(6)<5?"I survived!":a
knut
la source
Peut être encore plus court avec 6/rand(6).
ugoren
Ruby amorce-t-il automatiquement son RNG?
vsz
Vous pouvez couper trois autres caractères en supprimant le flux de contrôle:1/rand(6);p "I survived!"
histocrat
@ugoren / histocrat Merci pour vos conseils, j'ai adapté ma solution.
knut
Un autre octet pour vous: aucun espace blanc n'est requis entre pet "I survived!". À mon avis, cela ne représente que 24 octets.
primo
6

Dyalog APL - 25 22 21 20 Charachters

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

S'imprime en DOMAIN ERRORtant qu'erreur, en raison de la division par zéro.

La solution de non-division par zéro la plus courte que j'ai pu trouver est de 23 caractères.

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

Il jette un INDEX ERROR

Essayez-le ici

Police APL ici

MrZander
la source
Je voudrais l'accepter, mais cela ne semble pas fonctionner. Quelques fois, il imprime " I survived", mais après avoir imprimé DOMAIN ERRORune fois, il continue d'imprimer uniquement cela. Même si je recharge complètement le site, il ne survivra plus jamais.
vsz
@vsz Comme c'est étrange ... Cela fonctionne dans mon Dyalog APL WS, et je me souviens l'avoir testé avec TryAPL quand j'en avais fini. Cela fonctionne toujours sur mon interprète, mais pas sur le site Web. Si cela aide: dl.dropbox.com/u/9086539/apl.png
MrZander
1
1÷0est DOMAIN ERRORen Dyalog mais en ngn / apl c'est . Le résultat de ?6est 1..6 lorsque ⎕IO←1(par défaut dans Dyalog) et 0..5 lorsque ⎕IO←0(seule option dans ngn / apl). Dans Dyalog, le PRNG peut être ensemencé par réglage ⎕RL. Initialement, il a une valeur par défaut prédéterminée. Si vous définissez ⎕RL←0, le PRNG est réensemencé de façon assez imprévisible par le système d'exploitation. TryAPL est utilise Dyalog et ne supporte la ?fonction .
ngn
1
Il est fort possible que quelque chose ait changé à l'époque, nous mettons occasionnellement à jour le logiciel derrière TryAPL ou expérimentons les fonctionnalités du site Web. Suis-je affilié? Si je vous le dis, je vais devoir vous tuer ... eh bien, avec une probabilité de 1 ÷ 6 :)
ngn
1
Au fait, voici une solution à 18 caractères: 'J'ai survécu!' ⊣ ÷ ⍟? 6
ngn
5

Python, 96

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

Si randrange(5)renvoie 0, alors python se bloquera en raison d'une erreur de segmentation.

grc
la source
5

vba, 27

?1/int(6*rnd),"I Survived!"

utilisé dans la fenêtre immédiate.
En cas d'échec, une fenêtre d'erreur indiquant:
division by zero
apparaît

SeanC
la source
Manque le !dans le texte.
steenslag
@steenslag, corrigé
SeanC
@SeanCheshire J'ai proposé une alternative à votre réponse.
Gaffi
5

Befunge - 48 caractères

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

Le seul hasard de Befunge est l' ?opérateur, qui vous envoie vous diriger dans l'une des quatre directions possibles ( 1/4chance). En bloquant une ou deux directions, vous avez 1/3une 1/2chance, et en les combinant, vous avez la 1/6chance de sortir du programme "vivant".

Le programme plante en effectuant une division par zéro. Je suppose que c'est l'implémentation qui va se passer (sur Wikipedia, il dit que le programme devrait demander la réponse souhaitée), mais befungee.py sorte de plantages, ou se termine avec colère:

$ 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!
daniero
la source
5

J, 18

'I survived!'[q:?6

Échec domain errorlors de la tentative de factorisation de 0.

randomra
la source
J amorce-t-il son RNG automatiquement?
vsz
@vsz Oui, avec ?. Vous pouvez utiliser ?.pour des graines fixes.
randomra
4

C, 67 65 62 caractères

rand()%8ne perd pas l'équité. La division plante pour t=0, donne vrai pour 1 et 2 (réessayer), donne faux pour 3..7 (survécu).
EDIT: La version précédente utilisait une variable temporaire, qui s'est révélée complètement inutile. 2/(rand()%8)met en œuvre les deux conditions nécessaires.

main(){
        for(srand(time(0));2/(rand()%8););
        puts("I survived!");
}
ugoren
la source
Cela fait. "aucune autre sortie n'est autorisée"
vsz
@vsz, en quelque sorte manqué. Mais de toute façon, avec gcc / Linux, il n'imprime rien. En outre, en respectant strictement la norme, cette exigence est impossible, car un comportement non défini peut imprimer quoi que ce soit.
ugoren
@vsz, corrigé maintenant - aucune sortie supplémentaire dans tous les cas. Fonctionne également avec l'optimisation et 2 caractères plus courts.
ugoren
4

T-SQL 56 44 40 + 6

 if 1/cast(ceiling(rand()*6)-1as int)<2print'I Survived!'

Credit Sean Cheshire pour avoir appelé les acteurs inutiles

 if 1/ceiling(rand()*6-1)<2print'I Survived!'

Message personnel de crédit de Sean Cheshire pour une suggestion de changer le plafond en plancher.

 if 1/floor(rand()*6)<1print'I Survived!'

Death Err Msg: Msg 8134, niveau 16, état 1, ligne 3 Diviser par zéro erreur rencontrée.

méfiant
la source
1
-1et ceilingne sont pas nécessaires. castsera tronqué
SeanC
Je teste si le plafond peut être supprimé sans violer l'exigence d'une distribution uniforme, les docs disent que rand () renvoie des valeurs flottantes de 0 à 1.
freewary
Je voulais savoir si le plafond pouvait être retiré de ma première entrée. Je n'ai pas pu déterminer à partir de la documentation T-SQL si la fonction rand () retournerait un 1 ou non. J'ai donc exécuté une boucle environ 50 millions de fois en testant la fonction rand (), jamais retourné un 1. Mais, supprimer le plafond de ma première entrée serait toujours de 47 octets, donc ma deuxième entrée est encore plus courte. Gardez le plafond et retirez le plâtre.
freewary
Je doute que vous ayez testé ce script plus de 20 fois. Cela ne renvoie pas toujours toujours le résultat attendu. 1 sur 6, cela échouera et ne retournera pas de sortie. Cette syntaxe fonctionnera: 0 / étage (rand () * 6) = 0
t-clausen.dk
3

Javascript, 42

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

Le bit ou les planchers le résultat de la multiplication donc une valeur entre 0 et 5 résultats. 0 est implicitement converti en faux, donc dans 5 des 6 cas, l'alerte apparaît dans le 6e cas, un certain best référencé, ce qui bloque le processus.

zaphod1984
la source
3

En utilisant la méthode habituelle de division par zéro:

Version Perl 5.8

1/(int rand 6)&&print "I survived!"

Version Perl 5.10

1/(int rand 6)&&say "I survived!"

En cas d'échec, ceux-ci afficheront:

Illegal division by zero at -e line 1.

Utiliser la fonction bless qui est utilisée pour créer des objets en perl.

Version Perl 5.8

print (int rand 6?"I survived!":bless me);

Version Perl 5.10

say (int rand 6?"I survived!":bless me);

En cas d'échec, ceux-ci afficheront:

Can't bless non-reference value at -e line 1.
xxfelixxx
la source
3
quelques suggestions: se débarrasser des parenthèses, de la logique &&et de l'espace supplémentaire. utiliser ~~au lieu de intpour forcer les valeurs intégrales. le résultat est le suivant:1/~~rand 6;print"I survived!"
ardnew
3

GolfScript, 21 caractères

,6rand/;'I survived!'

Comme la plupart des réponses, celle-ci a une chance sur six de se bloquer avec une ZeroDivisionError. La solution la plus courte que j'ai pu gérer sans utiliser la division par zéro est de 23 caractères:

5,6rand=+;'I survived!'

qui a 1/6 de chance de s'écraser avec undefined method `+' for nil:NilClass (NoMethodError) .

(Ps. En développant cela, j'ai trouvé ce qui pourrait être un bogue dans l'interpréteur GolfScript: du code comme 0,1>semble laisser une nilvaleur sur la pile, ce qui bloquera plus tard le programme si vous essayez de faire quoi que ce soit avec cette valeur, sauf le sauter et le jeter avec ;. Malheureusement, le fait que je besoin d'utiliser la valeur d'une certaine manière à déclencher un moyen de collision que même exploiteuses ce bug ne m'a pas aidé descendre en dessous de 23 caractères.)

Ilmari Karonen
la source
Cela semble définitivement être un bug. 5,5>laisse []sur la pile, ce qui est probablement ce qu'il devrait faire, mais 4,5>laisse nil. Si vous ne le supprimez pas, l'interpréteur se bloquera réellement lors de la tentative de sortie. Un effet secondaire intéressant est que cela 4,6rand>+;'I survived!'devient une solution valable. Quelqu'un devrait probablement informer Flagitious.
primo
1
J'ai signalé cela, et il a été corrigé (avec un autre bug que j'ai rencontré) dans la dernière version de l'interpréteur GolfScript.
Ilmari Karonen
3

Python, 70 caractères

Avec l'inspiration de la réponse de grc.

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

randrange (5) renvoie une valeur comprise entre 0 et 5.
S'il renvoie un 0, Python se bloque lors de la tentative d'exécution (ute) d'une chaîne de code contenant 9 ^ 5 jeux de parenthèses.

Joshua Sleeper
la source
3

PHP - 30 octets

<?rand(0,5)?:~[]?>I survived!

Nécessite PHP 5.4+ pour la syntaxe de tableau court, idée d'opérateur invalide sans vergogne volée à @primo.

Comme indiqué, rand()est automatiquement semé lors de la première utilisation .

Leigh
la source
La division par zéro ne s'arrête pas, elle ne produit qu'un avertissement, ainsi que le texte «J'ai survécu!». En outre, rand()%6n'est pas une distribution uniforme, comme 32768 = 2 (mod 6). Cependant, rand(0,5)||~$apour 30 octets est, et fonctionnera en outre avec toutes les versions de PHP (la deuxième expression dans un ternaire est uniquement facultative dans 5.3.0+).
primo
@primo Je suppose que je ne cherchais la trace de la pile que lorsque je vérifiais la division par zéro, je n'ai pas remarqué qu'elle était toujours imprimée. Je sais que la sténographie ternaire est 5.3+, mais je n'ai vraiment aucun intérêt à supporter des versions longtemps obsolètes :)
Leigh
Je suis d'accord avec ça. Il n'y a aucun argument valable pour continuer à utiliser moins de 5,3 à ce stade. 5.4, ​​je suis toujours en attente d'un numéro de révision à deux chiffres.
primo
1
Je compte 29 octets.
Titus
3

Befunge, 38

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

Assez simple. Le crash se fait en poussant les 1 sur la pile jusqu'à ce qu'elle déborde. J'ai fait quelques tentatives pour couper ces 11 virgules et les remplacer par une boucle plus efficace pour tout imprimer, mais je n'ai pas pu obtenir moins de 11 caractères.

Notez que compter les personnages dans Befunge est un peu délicat ... Par exemple, il n'y a qu'un seul personnage sur la troisième ligne, mais j'en compte un supplémentaire car l'exécution pourrait voyager à travers cet emplacement.

Joe K
la source
Je pense que c'est le record de virgules les plus consécutives que j'ai jamais vues dans un programme.
Joe Z.
Et puis je regarde comment Befunge réellement fonctionne et la paume de mon visage.
Joe Z.
2

Shell CMD (Win XP ou version ultérieure), 40 +6

Je ne fais que celui-ci parce que DOS n'est pas quelque chose qui devrait même être pensé pour le golf de code, et l'espace blanc est important

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

En cas d'échec, il s'imprime

Divisez par zéro erreur.

SeanC
la source
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!',)

Message d'erreur de mort:

Erreur dans ifelse (! Is.na (1 / sample (c (NA, 1: 5), 1)), "I Survived!",): L'argument "no" est manquant, sans valeur par défaut

méfiant
la source
J'ai essayé R, et je n'ai pas réussi à le faire échouer - if(1/0)"I Survived!"toujours imprimé I Survived
SeanC
Contrairement à d'autres langages, R ne considère pas 1/0 comme une erreur mathématique et n'arrête pas l'exécution, il renvoie simplement inf pour 1/0. Je pense que @vsz veut une erreur de rupture pour ce tour. Mais en supposant que vsz comptait NA comme l'erreur de mort, je pouvais réduire mon programme à 41 caractères: ifelse (échantillon (c (NA, 1: 5), 1), 'I Survived',)
freewary
2

Emacs-Lisp, 42 caractères

(if (= (random 6) 5) 
    z (message "I survived!")
    )
dualité
la source
2

Javascript, 40 caractères

En Javascript, l'astuce de division par zéro ne fonctionne même pas: elle renvoie simplement Infinity. Par conséquent, référencer une variable non existante:

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

Pas si court, mais amusant :)

tomsmeding
la source
2

PowerShell, 40 caractères

IF(6/(Get-Random -Max 6)){'I Survived!'}

En cas d'échec: "Tentative de division par zéro."

DBADon
la source
Bienvenue chez PPCG!
Laikoni
1
32 octets
mazzy
31 octets
Veskah
2

TI-BASIC (TI-84 + / SE), 36 octets

startTmr→rand:1/(1<randInt(1,6:"I survived!

Il n'y a aucune entrée, comme le défi le précise.
La sortie est I survived!réussie, DIVIDE BY 0sinon une erreur.

L' DIVIDE BY 0écran d'erreur ressemble à ceci:

ERR:DIVIDE BY 0
1:Quit
2:Goto

La sélection de l'une ou l'autre option (et le retour à l'écran d'accueil si 2sélectionné) afficheError après l'appel du programme.

Exemples:

prgmCDGFE
           Error
prgmCDGFE
I survived!
prgmCDGFE
I survived!
prgmCDGFE
           Error

Explication:

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"

Remarques:

  • TI-BASIC est un langage tokenisé. Le nombre d'octets n'est pas égal au nombre de caractères.

  • Les lettres minuscules sont chacune deux octets .

    • Les lettres minuscules peuvent être activées à l'aide de ce programme d'assemblage.
  • startTmrest une commande uniquement sur les calculatrices TI-84 + et TI-84 + SE. Ces calculatrices ont différents systèmes d'exploitation.

Tau
la source
2

Python, 53 octets

Voici un court programme hors index de 53 octets en python:

import time
[0][time.time()%6<1]
print("I survived!")
Alexander Wahlsten
la source
Hi and welcome. Please note that in the rules for this challenge, it states "MOD 6 will not be sufficient." Although I'm not familiar with Python, it looks to me like you are using Modulo here.
Shaun Bebbers
1
@ShaunBebbers The quote is "This means an uninitialized variable (or a RNG without seed) MOD 6 will not be sufficient," but this meta post says that current time modulo is enough for a PRNG for code-golf
Stephen
My misunderstanding then.
Shaun Bebbers
1

Java, 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!":"");}}

Fails with an "Array out of bounds" error. Managed to shave a few characters by using anonymous Random object (no imports).

Noah
la source
1

Groovy, 39

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

Picks a random number between 0 and 5 inclusive. If 0, throws a divide by zero exception.

Will Lp
la source
1

Python (56), Haskell (77)

This crashes with an IndexError when the generated number is 1:

from random import*
print['I survived!'][1/randint(1,7)]

The Haskell solution has the same idea:

import System.Random
main=putStrLn.(["I survived!"]!!).div 1=<<randomRIO(1,6)
Lambda Fairy
la source
1

Python, 59 55 53, 65 59 56

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

ZeroDivisionError when ord(os.urandom(1))%6 evaluates to 0

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

IndexError when ord(os.urandom(1))%6 evaluates to 5

Raufio
la source
Save 5 characters by changing the import: import random as r then use r.randint
Steven Rumbalski
1
Or save 8 characters by changing import to import os, then use ord(os.urandom(1))%6 as your random int.
Steven Rumbalski
Save 1 character by removing the space after print.
Steven Rumbalski
1

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:

?Mid("I Survived!",IIf(Int(6*Rnd),1,0))

This resolves to a Run-time error '5': Invalid procedure when trying to reach character 0 (VBA is 1-based indexing).

n="I Survived!":If Int(6*Rnd) Then ?n Else ?-n

This resolves to a Run-time error '13': Type mismatch when applying a negative switch to a string.

Gaffi
la source
1

Japt v1.4.5, 16 bytes

6ö
ªí
`I s¨viv!

Try it

-1 byte thanks to @Shaggy!

Throws TypeError: U.í is not a function when a random number in the range [0,6) is 0.

dana
la source
1
17 bytes
Shaggy
Actually, it might be an idea to use v1.4.5 for this, just in case ETH adds an N.í() method to v1.4.6.
Shaggy
Updated - Japt tries hard not to crash on weird programs. I was trying to figure out how to reference a variable that didn't exist (A-Z is defined), but didn't consider calling a method that didn't exist.
dana
Yeah, N.í() is my "go to" for throwing an error (it used to be N.y()). There are a few other ways of getting an error but they're rarely useful.
Shaggy
Now, why didn't I think of using a 3rd line?! :\
Shaggy