Simulez une partie de Craps

18

Le Craps est un jeu de dés assez simple souvent joué dans les casinos. Même si vous n'êtes pas un joueur (ce que je ne suis pas), c'est toujours un jeu assez intéressant. Voici les règles:

Au début d'une partie de Craps, il y a ce qu'on appelle le round de sortie . Le joueur lance deux d6 (dé à six faces) et les deux jets de dé sont ajoutés. Si le résultat est 7 ou 11, la personne gagne automatiquement (c'est ce qu'on appelle un naturel ). Si le résultat est 2, 3 ou 12, la personne perd automatiquement (c'est ce qu'on appelle le crapping out ). Sinon, le résultat est défini comme le point pour le point rond.

Après cela, le tour de points commence. Pendant le tour de points, le joueur doit lancer en continu 2 d6s jusqu'à ce que la personne lance un 7 ou son point du tour précédent. Si la personne obtient un 7, elle perd. S'ils roulent leur point, ils gagnent.

Défi

Implémentez un programme simple qui simule un jeu de craps. Si la personne lance un naturel ou un crap-out pendant le round de come-out, le programme devrait sortir "Natural:" ou "Crapping out:" suivi du dé et puis quitter. Sinon, il devrait afficher "Point:" suivi du point. Ensuite, pendant le round de points, il devrait sortir chaque jet de dé jusqu'à ce qu'un 7 ou le point soit atteint. Si la personne gagne, elle devrait sortir "Pass"; s'ils perdent, il devrait sortir "Don't Pass".

Implémentation de référence

Groovy, 277 octets

def a={return Math.random()*6+1};int b=a()+a();(b<4||b==12)?{println"Crapping out: "+b}():{(b==7||b==11)?{println"Natural: "+b}():{println"Point: "+b;for(;;){int x=a()+a();println x;(x==7)?{println"Don't Pass";System.exit(0)}():{if(x==b){println"Pass";System.exit(0)}}()}}()}()

Essayez-le en ligne.

Exemples de sorties

Natural: 7

Crapping out: 3

Point: 9
4
8
11
9
Pass

et

Point: 5
3
7
Don't Pass

C'est le , donc le code le plus court l'emporte.

(AVERTISSEMENT: ce défi n'est pas destiné à promouvoir le jeu en aucune façon. N'oubliez pas, la maison gagne toujours.)

un spaghetto
la source
You can't make your program shorter by picking a random number between 1 and 12 for the die roll; it must be two numbers picked between 1 and 6.- Qu'en est-il de choisir une valeur aléatoire dans [1, 12] à partir d'une distribution identique à l'ajout de deux valeurs aléatoires uniformes dans [1, 6]?
Mego
@Mego Whoa, vieux défi. Oui ce serait bien. Je pense que cet avertissement visait principalement à s'assurer que les gens réalisent qu'une distribution uniforme entre [1, 12] n'est pas la même chose qu'un 2d6. Je vais le réécrire un peu.
un spaghetto du

Réponses:

6

Rubis 164

Assez simple. Caractéristiques intéressantes:

Les cas de crapping out sont résumés comme r%12<4et les cas naturels restants sont résumés comme r%4==3.

La chaîne initiale est stockée dans cet les rouleaux suivants ne sont pris que si c'est plus tard alphabétiquement que la lettre unique ?P(qui ne se produit que pour Point.)

f=->{rand(6)+rand(6)+2}
s=0
r=f[]
print c=r%12<4?'Crapping out':r%4==3?'Natural':'Point',": #{r}
"
c>?P&&(until s==r||s==7
p s=f[]end
print s==7?"Don't ":"","Pass")
Level River St
la source
Aimez la façon dont vous vérifiez le reste au lieu de 2,3,7,11 ou 12 séparément!
Jeroen
6

Python 3, 190 octets

from random import*
r=randrange
p=print
a=r(5)+r(5)+2
c=890145//3**a%3
p(['Point:','Crapping out:','Natural:'][c],a)
if c<1:
 while 7!=c!=a:c=r(5)+r(5)+2;p(c)
 p(['Pass',"Don't pass"][c==7])

Ceci est basé sur la réponse de Celeo ; J'ai remplacé de longs conditionnels par un nombre magique qui code une LUT pour chaque numéro, j'ai réutilisé une variable et fait quelques autres golfs divers. Encore de la place pour le golf; il est probablement possible d'obtenir moins de 170.

Je n'ai pas essayé d'utiliser Python 2, donc je ne sais pas si ce serait plus court.

lirtosiast
la source
1
Voulez-vous expliquer comment vous avez obtenu ce nombre magique et comment cela fonctionne?
Karl Napf
5

C99, 366 312 293 277 octets

Ceci est mon premier post ici, donc je vais supposer que cela peut être amélioré de beaucoup.

#include<stdlib.h>
#include<time.h>
#define r rand()%6+1
#define p printf(
main(c,s){srand(time(0));s=r+r;int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d";if(a){p a,s);return 0;}p"Point:%d\n",c=s);do p"%d\n",s=r+r);while(7-s&&s-c);p(7-s)?"Pass":"Don't pass");}

Version étendue

#include<stdlib.h>
#include<time.h>
#define r rand()%6+1
#define p printf(
main(c,s){
    srand(time(0));
    s=r+r;
    int*a=s==7||s==11?"Natural:%d":2-s||3-s||12-s?0:"Crapping out:%d";
    if(a) {p a,s);return 0;}
    p"Point:%d\n",c=s);
    do p"%d\n",s=r+r);
    while(7-s&&s-c);
    p(7-s)?"Pass":"Don't pass");
}

Comme vous pouvez le voir, il existe ici une bonne redondance qui peut très probablement être supprimée.

Remerciements à @Mego pour avoir aidé à réduire ce nombre.

Chris Loonam
la source
1
Tant qu'il compile quelque part, vous êtes bon.
lirtosiast
@Mego merci d'avoir souligné cela, qui a réussi à se débarrasser de 19 octets.
Chris Loonam du
Je me suis encore débarrassé de la suppression aet de l' butilisation de la méthode de soustraction avec les opérateurs ternaires.
Chris Loonam
5

Python 2, 226 224 octets

Première passe et il y a beaucoup de code:

from random import*
r=randrange
a=r(5)+r(5)+2
if a in[7,11]:print'Natural:',a
elif a in[2,3,12]:print'Crapping out:',a
else:
 print'Point:',a
 b=0
 while b not in[7,a]:b=r(5)+r(5)+2;print b
 print'Pass'if b-7else"Don't pass"

Merci à Mego pour 2 octets!

Celeo
la source
Peu de problèmes avec cela. Il n'imprime pas "Point:" suivi du nombre si le rouleau n'était pas un naturel ou une merde. De plus, il devrait y avoir un espace entre le: et le nombre.
un spaghetto du
Oups! Correction de ne pas imprimer 'Point: #'. Dans la sortie, il y a un espace.
Celeo
Ah ok. Je n'utilise plus beaucoup Python, donc je ne savais pas comment ça marche.
un spaghetto du
J'ai joué à votre code jusqu'à 198 en Python 3, soit 192 en Python 2. Voulez-vous les suggestions, ou dois-je poster ma propre réponse?
lirtosiast
@ThomasKwa Si vous y mettez beaucoup de travail, postez-le comme une réponse distincte afin que vous puissiez obtenir des représentants.
Celeo
3

PHP 230 228 218 199 192 188 octets

186 octets sans le <?

<?$a=rand(1,6)+rand(1,6);$a%4==3?die("Natural: $a"):$a%12<4?die("Crapping out: $a"):print"Point: $a
";while(1){($b=rand(1,6)+rand(1,6))==7?die("Don't Pass"):$b==$a?die("Pass"):print"$b
";}

Première tentative de code golf! Vous ne savez pas si l'utilisation </br>serait autorisée? Comme cela ne fonctionnerait pas dans une console (comme une nouvelle ligne). Faites-moi savoir si cela n'est pas autorisé et modifiera mon code.

EDIT (16-8-16): Après m'être amélioré au codegolf, j'ai remarqué quelques améliorations possibles. Cela fonctionne toujours en utilisant l'interface de ligne de commande. Remplacé </br>par une entrée difficile.

Jeroen
la source
Naturel est orthographié "Naturel" et non "Naturel".
Kritixi Lithos du
Je l'ai changé. Merci
Jeroen
2

Javascript 262

var r=(x=>Math.floor(Math.random()*6+1)),a=r()+r();if(a<4||a==12){alert("Crapping out: "+a)}else if(a==7||a==11){alert("Natural: "+a)}else{alert("Point: "+a);while(1){var b = r()+r();if(b==a){alert("pass");break}if(b==7){alert("dont't pass");break}alert(""+b)}}
user902383
la source
1

Perl 5 , 140 octets

sub d{1+int rand 6}say$"=($p=&d+&d)%12<4?"Crapping out":$p%4-3?Point:Natural,": $p";if($"gt O){say$_=&d+&d until/7|$p/;say"Don't "x/7/,Pass}

Essayez-le en ligne!

Xcali
la source
1

PowerShell , 181 183 179 178 167 165 octets

-10 octets grâce à mazzy
-2 octets grâce à Xcali

switch -r($z=&($x={(random 6)+(random 6)+2})){'7|11'{"Natural: $z"}'2|3'{"Crapping out: $z"}default{"Point: $z"
do{($m=&$x)}until($m-in7,$z)"Don't "*!($m-7)+'Pass'}}

Essayez-le en ligne!

Version déroulée:

#Switch using regex on $z which is...
#&($x={...}) first assigns $x to a scriptblock then calls it, saving the return to $z
switch -r($z=&($x={(random 6)+(random 6)+2})){
    '7|11' {"Natural: $z"}
    '2|3' {"Crapping out: $z"}
    default{
        "Point: $z"

        #Call the diceroll scriptblock until you Pass,
        #while pushing each roll to output
        do{($m=&$x)}
        until($m-in7,$z)
        "Don't "*!($m-7)+'Pass'
    }
}

Il y a quelques points de friction de moins maintenant que la logique de création de liste a été reconstruite dans un commutateur. Je pense que c'est toujours une bonne approche. +2 octets corrigeant un bogue.

Veskah
la source
1
impressionnant! raccourcir jusqu'à 178 octets
mazzy
Je pense que la condition -notin (7,$z)n'est pas pertinente pour la règle During the point round, the player must continuously roll ... the previous round. Maintenant, la boucle se termine à $mégalité 7ou au premier tour.
mazzy
1
@mazzy C'est un problème de formulation dans la question. Il n'y a que deux tours. Vous définissez le point une seule fois dans le Come-outtour et c'est votre numéro cible pour tout le Pointtour. Le previous roundfait référence au Come-outtour
Veskah
1
Merci. 168 octets
mazzy
2
Vous devriez pouvoir en retirer deux de plus en retirant le 1?de votre regex de craps.
Xcali
0

R, 197 octets

 r=sum(sample(6,2,T));if(r%%12<4)cat("Crap Out",r)else if(r%%4==3)cat("Natural",r)else{cat("Point",r);while(T){cat("",q<-sum(sample(6,2,T)));if(q==7){cat(" Don't");break};if(q>r)break};cat(" Pass")}

Non golfé

r=sum(sample(6,2,T))
if (r%%12<4)  {
    cat("Crap Out",r) 
} else if (r%%4==3) {
    cat("Natural",r)
} else { 
    cat("Point",r)
    while (T) {
        q = sum(sample(6,2,T))
        cat("",q)
        if (q==7) {
            cat(" Don't")
            break
        }
        if (q>r) break
    }
    cat(" Pass")
}
user5957401
la source
0

Pyth , 108 octets

p|K?}J+OS6OS6,7 11"Natural"?}J[2 3 12)"Crapping out"k"Point"+": "JI!KW!}Z,7JIq7=Z
+OS6OS6=K"Don't "))+K"Pass

Essayez-le en ligne!

Premier passage, on peut sans doute trouver quelques économies.

Sok
la source
0

Enchantements runiques , 151 octets

R}}6'RA6'RA2++{{B͍
00B:7=S:b={+?\"Natural: "@>
pping out: "@\:2=}:3=}:c={{++?/"Cra
{:}≠   ?\ 6?;$$k\/ak$00B:$:7≠?\
"Don't "R"Pass"a/\$:$" :tnioP"\

Essayez-le en ligne!

Après avoir corrigé un bug concernant les nombres aléatoires (il se réensemencait à chaque fois 'RA appel, et la graine était l'heure du système, ce qui entraînait des exécutions massives de valeurs répétées), cela fonctionne correctement.

Explication

L'entrée est sur la deuxième ligne, car la première ligne jusqu'à est une fonction pour lancer deux dés et les additionner.

Flux de programme, avec quelques redirections enveloppantes et enroulées déroulées pour plus de lisibilité

   R}}6'RA6'RA2++{{B͍                      Roll 2, sum, return
   >00B:7=S:b={+?\                        Entry, make first roll, compare to 7 and 11.
                  "Natural: "@            If true, print "Natural: " and the value, else go down
                 \:2=}:3=}:c={{++?/       Compare to 2, 3, and 12.
"Crapping out: "@                         If true, print "Crapping out: " and the value, else go up
                     \$:$" :tnioP"\       Print "Point: " and value (IP is travelling RTL)
                     /ak$00B:$            Print newline, roll, print
:7≠?\                                     Compare to 7
    \"Don't "R"Pass"ak$$;                 If equal, print a newline and "Don't Pass"
     {:}≠   ?\                            Else compare to initial roll.
             R"Pass"ak$$;                 If equal, print a newline and "Pass"
              6?......ak$00B              Else return to roll loop by printing a newline
                                              and rolling again (. are skipped instructions)

Il n'y a que 4 instructions NOP ( {:}≠...?\.6?) qui seraient très difficiles à supprimer en raison de l'espace requis sur les autres lignes (à savoir la longueur de la "Don't "chaîne).

Draco18s ne fait plus confiance à SE
la source