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.


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!".


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 .


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


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

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


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.


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


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!

5

J, 18

'I survived!'[q:?6

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


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

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.


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.


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.

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


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.


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 .


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.


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.


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


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!")
    )

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



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.


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!")

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


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.


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)

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


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.


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.



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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.