Dipping aléatoire dés

14

Dans un dé standard (dé), les nombres sont disposés de sorte que les faces opposées s'ajoutent à sept. Écrivez le programme le plus court possible dans votre langue préférée qui génère un lancer aléatoire suivi de 9 basculements aléatoires. Un pourboire est un quart de tour des dés, par exemple, si les dés font face à 5, tous les pourboires possibles sont 1,3,4 et 6.

Exemple de sortie souhaitée:

1532131356

steenslag
la source

Réponses:

5

GolfScript, 26 caractères

0{(.6,5@--\-.,rand=).}10*;

Une version légèrement plus compressée de Joey , qui contourne essentiellement le problème de l'indexation zéro.

Howard
la source
9

Rubis, 44

c=0;10.times{$><<c=([*1..6]-[c,7-c]).sample}

J'ai trouvé l'astuce [* 1..6] par une expérience chanceuse.

steenslag
la source
1
De belles astuces ici, des trucs formidables. Me frapper la tête pour avoir manqué l'exemple de méthode Array #.
Lars Haugseth
4

JavaScript (71 caractères)

Vous devrez peut-être remplacer printpar alertou autre chose, selon votre environnement JavaScript.

for(C=L=T=0;C++<10;print(L=T))while(!(T-L&&T+L-7))T=Math.random()*6+1|0
Veuillez vous lever
la source
fusionner les boucles en incrémentant conditionnellement la boucle externe lorsqu'une valeur est trouvée: pour (b = n = 10; n; ab && a + b-7 && print (b = a, n -)) a = Math.random () * 6 + 1 | 0
imma
4

GolfScript, 28

0:|;{7,[0|7|-]-.,rand=:|}10*
Joey
la source
3

Frapper

#/!bin/bash
f=`expr $RANDOM % 6` 
f=`expr $f + 1`
printf "$f"
for ((i=0; i<9; i++))
do
   ((bad=7-$f))
   next=`expr $RANDOM % 6`
   next=`expr $next + 1`
   while [ $next -eq $bad ] || [ $next -eq $f ]
   do
      next=`expr $RANDOM % 6`
      next=`expr $next + 1`
   done
printf "$next"
f=$next
done

exemple de code: http://ideone.com/CCfro

Aman ZeeK Verma
la source
L'utilisation de ((var=expression))est très agréable - je pensais que le moyen le plus court était var=$((expression))Mais pourquoi utilisez-vous cela une seule fois et gaspillez-vous des tonnes de caractères sur expr en backticks?
Peter Taylor
Je ne fais pas beaucoup de scripts shell, mais pour une raison quelconque ((var = expr)) à certains endroits, a échoué (ouais bizarre: P) Depuis que j'ai commencé ce script, je viens de terminer en quelque sorte. :)
Aman ZeeK Verma
2

Bash avec une seule boucle: 100 99 98 96

pour ((i = 10, f = RANDOM% 6 + 1; i -;)) faire
printf $ f
((n = RANDOM% 4 + 1, m = f <4? f: 7-f, f = n <m || ++ n <7-m? n: n + 1))
terminé

http://ideone.com/XrZO7

L'idée clé est que pour choisir un nombre aléatoire dans [1, x] qui n'est pas égal à y, vous pouvez choisir un nombre aléatoire dans [1, x-1] puis incrémenter si c'est> = y. Pour ce problème, nous voulons un nombre aléatoire dans [1,6] qui n'est pas égal à f ou 7-f. Nous devons faire les deux tests dans l'ordre min (f, 7-f), max (f, 7-f).

En supposant qu'un environnement initialement vide pourrait sauver 2 caractères en ne initialisant pas i et en changeant la condition de boucle en i++<10

Peter Taylor
la source
2

Coup: 97 94 92 90 89 87

Fortement joué par Aman ZeeK Verma:

pour ((i = 10, f = 0; i -;)) faire
pour ((n = f; n == f || n + f == 7; f = RANDOM% 6 + 1)) faire:
terminé
printf $ f
terminé

http://ideone.com/QiuTx

NB: il peut être réduit de 5 caractères en changeant la première ligne en for((;i++<10;))mais cela fait des hypothèses qui ne sont pas toujours valides. Cela fonctionnerait bien dans ideone mais quelqu'un l'exécutant à partir d'un shell pourrait avoir iou fexporté vers quelque chose de non nul.

Peter Taylor
la source
J'aimerais faire une version sans la boucle intérieure, mais je crains que ce ne soit plus long.
Peter Taylor
C'est extrêmement génial, je suis trop brut pour bash je suppose :)
Aman ZeeK Verma
@Aman, la plupart n'est pas spécifique à bash. C'est juste plusieurs dizaines de raffinements avec des tests après chacun et des inversions quand j'ai cassé quelque chose. Le seul morceau qui est vraiment un truc bash est le noop, que j'ai dû rechercher. Si vous avez le temps de lire man bash, je le recommande. Une fois, je l'ai lu de bout en bout, et le simple fait d'avoir une vague idée de ce qui est possible et mérite d'être recherché m'a bien servi.
Peter Taylor
2

Windows PowerShell, 45

-join(0..9|%{($d=1..6-ne(7-$d)-ne$d|random)})

Assez banal, en fait. Je génère une liste de lancers de dés possibles 1..6, puis je sélectionne uniquement ceux qui ne sont pas égaux à sept moins le dernier lancer, puis uniquement ceux qui ne sont pas égaux au dernier lancer. Dans la liste restante, je sélectionne ensuite un élément aléatoire et je l'assigne à $d. Étant donné qu'il $dest initialement traité comme 0il lance un dé normal la première fois.

Script de test:

for($i=0;$i-lt20;$i++){
    $o=@(./tipping.ps1)
    if ($i-gt0-and$o-eq$o2) { throw "Must have random output" }
    if ($o.count-ne1) { throw "Must only have one line of output" }
    if ($o[0]-match'[^1-6]'){ throw "Invalid characters" }
    if($o[0].length-ne10){ throw "Wrong length: $($o[0].length)" }
    $r=[char[]]($o[0])|%{$_-48}
    for ($x=1;$x-lt$r.count;$x++){
        if ($r[$x-1]+$r[$x]-eq7) { throw "Not a tipping: $($r[$x-1]) and $($r[$x])" }
    }
    $o2=$o
}

Histoire:

  • 2011-02-18 11:57 (61) Première tentative.
  • 2011-02-18 11:58 (45) Je n'ai pas besoin de générer le premier numéro séparément.
Joey
la source
Je reçoisThe term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
Peter Taylor
@Peter: PowerShell v2, s'il vous plaît. L' Get-Randomapplet de commande n'existait pas dans la v1.
Joey
2

J

Cela devrait fonctionner, mais malheureusement le générateur aléatoire de J reste bloqué après la 3ème itération:

a=:>:i.6
f=:a#~1-(+&(a=])7&-)
((,(?4)&{@f@(_1&{))^:9)>:?6

6 4 5 4 5 4 5 4 5 4

Eelvex
la source
Je ne suis en aucun cas un expert J, mais il me semble de ce que j'ai souffert de la composition de ma réponse J à ce fil qui a (?4)tendance à être roulé une fois et traité comme une constante pour les itérations suivantes si vous n'y faites pas attention. J'ai travaillé autour de lui en utilisant une (?@4:)construction semblable à.
JB
2

Rubis

66 caractères

(0..9).reduce([]){|m|m<<((1..6).to_a-[d=m[-1]||0,7-d]).shuffle[0]}
Lars Haugseth
la source
2

J, 30 caractères

>:(?@4:{(i.6)-.],5&-)^:(<10)?6

6 2 3 5 4 2 4 1 3 6

Explications (lues de droite à gauche):

  • ?6 renvoie un nombre aléatoire compris entre 0 et 5
  • ^:(<10)applique une fonction 9 fois, accumulant les résultats en cours de route. La fonction est:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- renvoie un tableau du nombre d'entrée et de son complément à 5 (nous gérons actuellement des nombres à base de 0, donc la somme des faces opposées est 5)
    • (i. 6) -. les supprime de l'ensemble complet des entiers 0 à 5. Nous nous retrouvons avec toutes les positions valides après une seule opération de basculement à partir de la position d'entrée.
    • ?@4: { en choisit un au hasard.
  • >: incrémente toute la séquence pour ramener les chiffres à l'intervalle 1 à 6.
JB
la source
Belle pensée de ">:" à la fin.
Eelvex
1
@Eelvex Je n'ai aucune idée pourquoi les dés du monde réel sont de 1 à 6 alors que tout raisonnement raisonnable à leur sujet utilise de 0 à 5.: D
JB
2

GS2, 16 octets

16 2f 25 08 41 20 17 30 16 2f 31 31 25 09 19 32

Voici comment ça fonctionne

16 2f 25     # make range from 1 to 6 and push random element
08           # start block
    41       # duplicate top of stack twice
    20 17 30 # negate top of stack and add 7
    16 2f    # push range from 1 to 6
    31 31    # do set-wise difference with each of the two previous numbers
    25       # push a random element from the list
09           # end block
19 32        # repeat block 9 times
récursif
la source
Je pense que gs2 est plus récent que ce défi.
lirtosiast
1

QBasic (71 caractères)

Les deux nouvelles lignes sont nécessaires et incluses dans le nombre de caractères comme un caractère chacune.

RANDOMIZE:FOR I=0TO 9
1N=INT(RND*6)+1:IF L=N OR L+N=7THEN 1
?N:L=N:NEXT
Veuillez vous lever
la source
1

TI-BASIC, 38 34

For(I,1,9
Ans→X
Repeat Ans≠X and Ans≠7-X
randInt(1,6
End
Disp Ans
End

Solution ennuyeuse, mais elle est plus courte que la révision précédente. Je profite du fait que sur une nouvelle calculatrice, Ansest initialisé à zéro.

lirtosiast
la source
Je ne sais pas si c'est possible, mais je donnerai 50 répétitions à toute personne qui peut trouver une solution plus courte.
lirtosiast
Comment calculez-vous 34?
récursif
Chaque jeton ici est un octet en mémoire ; il est standard que TI-BASIC soit noté de cette façon. Si vous avez une calculatrice, saisissez le programme, regardez l'écran de gestion de la mémoire, puis soustrayez 9 et soustrayez la longueur du nom du programme pour obtenir la taille du code.
lirtosiast
1

Java 8, 130 octets

v->{int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));return r;}

Essayez-le ici.

En tant que programme complet avec méthode principale détaillée, ce serait 178 octets à la place:

interface M{static void main(String[]a){int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));System.out.print(r);}}

Essayez-le ici.

Semi-port de la réponse Bash de @AmanZeeKVerma .

Explication:

 v->{              // Method with empty unused parameter and String return-type
   int d=(int)(Math.random()*6+1),
                   //  Random dice-roll 1-6
       i=10,       //  Counter-integer, starting at 10
       p;          //  Temp integer to store new side
   String r=""+d;  //  Result-String, starting at the first dice-roll
   for(;i-->0;     //  Loop (1) 10 times:
       r+=d)       //    After every iteration, append the result with a random side
     for(p=d;      //   Set the new side to the current side
         p==d      //   Loop (2) as long as the new side and current side are the same
         |p+d==7;  //   or as long as both combined are exactly 7:
       d=(int)(Math.random()*6+1)
                   //    Set the new side to a random side 1-6
     );            //   End of loop (2)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result-String
}                  // End of method
Kevin Cruijssen
la source
1

MATLAB 58 octets

a=randi(6)
for i=1:9;b=1:6;b([a,7-a])=[];a=b(randi(4))
end
aaaaa dit réintégrer Monica
la source
0

> <> , 71 octets

Je suis content d'avoir pu présenter la xrandomisation par pointeur de code de <> car je ne me souviens pas l'avoir vu ici.

a&0 v
 /2v
1x3v 
>x< <<
6x4v
 \5v ~
:{:/ ^?=}
:{:/ ^?=7+}
:~$<^&;!?:-1&n

Vous pouvez l'essayer sur cet interprète en ligne (coller le code, soumettre, démarrer).

Aaron
la source
Vous obtiendrez mon vote positif une fois que vous aurez corrigé la solution.
lirtosiast
@ThomasKwa Terminé, je pourrais peut-être le jouer un peu, mais au moins c'est maintenant fonctionnel.
Aaron
0

R , 67 octets

c(3,5,1,4,2,6)[(sample(1:6,1)+cumsum(sample((-2:2)[-3],9,T)))%%6+1]

Essayez-le en ligne!

Il y a une réponse R du golfeur, mais je pense que c'est une approche différente des réponses soumises jusqu'à présent.

c(3,5,1,4,2,6)                                                     #A dice and its facets
               (sample(1:6,1)                                      #Initial dice roll
                             +cumsum(sample((-2:2)[-3],9,T)))      #9 tippings in c(-2,-1,1,2)
                                                             %%6+1 #converts to values in [0,6]
              [                                                   ]#
JayCe
la source
0

05AB1E , 23 octets

6LΩUTFX?6LʒDXÊsX+7Ê*}ΩU

Peut certainement être joué au golf, mais je ne le vois pas actuellement ..

Essayez-le en ligne.

Explication:

6LΩ              # Pick a random value from the range [1,6]
                 #  i.e. [1,2,3,4,5,6] → 3
   U             # Save this random value in variable `X`
TF               # Loop 10 times:
  X?             #  Print `X` without newline to STDOUT
  6Lʒ     }      #  Create a range [1,6] again, and filter it by:
     DXÊ         #   Check if the current value is not equal to `X`
                 #    i.e. 1 and 3 → 1 (truthy)
                 #    i.e. 3 and 3 → 0 (falsey)
     sX+         #   Sum the current value with `X`
                 #    i.e. 1 and 3 → 4
                 #    i.e. 3 and 3 → 6
        7Ê       #   And check if it's not equal to 7
                 #    i.e. 4 and 7 → 1 (truthy)
                 #    i.e. 6 and 7 → 1 (truthy)
     *           #   If both checks are truthy, keep it in the filtered list
                 #    i.e. 1 and 1 → 1 (truthy)
                 #    i.e. 0 and 1 → 0 (falsey)
           Ω     #  Pick a random value from the filtered list
                 #   i.e. [1,2,5,6] → 1
            U    #  And save it in variable `X` for the next iteration of the loop
Kevin Cruijssen
la source