Jeu de hasard du festival de la mi-automne


11

Demain, c'est le festival de la mi-automne, et dans l'esprit de cette fête, je présenterai un jeu de hasard auquel nous (les gens de Xiamen ) jouons pendant les vacances!

Règles

Le jeu se joue avec six dés à 6 faces. Différentes combinaisons de nombres ont des rangs différents, avec un accent particulier sur les quatre et les uns. Votre travail consiste à écrire un programme / une fonction qui classera la main, compte tenu d'un lancer de 6 dés. Voici les classements (j'ai un peu modifié / simplifié les règles):

rangs

Je suppose que seuls les Chinois peuvent relever ce défi! D'accord, voici quelques explications en anglais.

  • 0: 4 fours et 2 uns.
  • 1: 6 fours.
  • 2: 6 unités.
  • 3: 6 de toute nature sauf les quatre et les uns.
  • 4: 5 fours.
  • 5: 5 de toute nature, à l'exception des quatre.
  • 6: 4 fours.
  • 7: Droit. (1-6)
  • 8: 3 fours.
  • 9: 4 de toute nature sauf 4.
  • 10: 2 quatre.
  • 11: 1 quatre.
  • 12: Rien.

Contribution

6 numéros, un tableau de 6 chiffres ou une chaîne de 6 chiffres qui représentent les valeurs des 6 lancers de dés de 1 à 6

Production

Votre programme / fonction peut renvoyer / afficher n'importe quoi pour indiquer le rang, tant que chaque rang est indiqué par une sortie et vice versa. Ex. Utilisation des chiffres 0-12, 1-13, etc.

Exemples (en utilisant 0-12 comme sorties)

[1,1,1,1,1,1]->2
[1,4,4,4,1,4]->0
[3,6,5,1,4,2]->7
[1,2,3,5,6,6]->12
[3,6,3,3,3,3]->5
[4,5,5,5,5,5]->5

Il s'agit de code-golf, donc le nombre d'octets le plus court l'emporte!


(J'aurais mis cela dans le bac à sable, mais je voulais que le moment soit bien choisi. J'ai essayé d'être aussi complet que possible, veuillez me faire savoir si des clarifications sont nécessaires.)
Quintec

@Shaggy Donc, l'OP dit que la sortie 0-12 ou 1-13 à la place
Shieru Asakoto

@Shaggy Comme je l'ai dit dans la question, la sortie ne doit pas nécessairement correspondre au numéro d'étiquette. Le nombre sauté et les écarts aléatoires dans l'image sont pour simplifier un peu les règles - il n'y a vraiment pas de règles définies pour cette tradition, c'est juste mon interprétation.
Quintec

Cela ne devrait-il pas être [1,2,3,5,6,6]->13??
J.Doe

@ J.Doe Les exemples / cas de test utilisent les indices comme résultat au lieu des valeurs. Contrairement aux valeurs, le 10n'est pas ignoré.
Kevin Cruijssen

Réponses:


2

Fusain , 55 octets

≡⌈Eθ№θι⁶I⁻²⌕14§θχ⁵I⁻⁵⁼⁵№θ4⁴⎇⁼№θ4⁴§60⁼№θ1²9¹7I⁻¹²⌊⊘X²№θ4

Essayez-le en ligne! Le lien est vers la version détaillée du code. Ne saute pas 10. Explication:

≡⌈Eθ№θι

Calculez la fréquence la plus élevée de n'importe quel chiffre.

⁶I⁻²⌕14§θχ

S'il y a un 6 d'une sorte, soustrayez la position du chiffre dans la chaîne 14de 2. Cela donne 1 pour 6 4s, 2 pour 6 1s et 3 pour 6 de toute autre chose.

⁵I⁻⁵⁼⁵№θ4

S'il y a un 5 d'une sorte, alors le résultat est 5 à moins qu'il y ait 5 4, auquel cas 1 est soustrait.

⁴⎇⁼№θ4⁴§60⁼№θ1²9

S'il y a un 4 d'une sorte, alors s'il y a 4 4 alors le résultat est 6 à moins qu'il y ait 2 1 auquel cas le résultat est 0, sinon le résultat est 9.

¹7

Si tous les chiffres sont différents, le résultat est 7.

I⁻¹²⌊⊘X²№θ4

Sinon, le résultat est 12 - (4 >> (3 - # de 4s)).


Il semble que ce soit la meilleure pratique d'accepter la réponse la plus courte, alors c'est ce que je vais faire :) Malheureusement, peu de gens ont vu et voté votre réponse ...
Quintec

@Quintec Ce n'est pas un problème; les gens sont censés voter des réponses en fonction de l'ingéniosité de l'algorithme ou d'un autre facteur qui leur fait apprécier la réponse.
Neil

10

JavaScript (ES6), 88 octets

a=>a.map(o=n=>[x=o[n]=-~o[n],6,,,21,9,8^o[1]][a=x<a?a:x])[5]|[,1,4,5,o[1]&2|8,2,4][o[4]]

Essayez-le en ligne! ou Testez tous les rouleaux possibles!

Génère un entier selon le mappage suivant:

 Rank | Output       Rank | Output
------+--------     ------+--------
   0  |  31            7  |   7
   1  |  12            8  |   5
   2  |  14            9  |  21
   3  |   8           10  |   4
   4  |  11           11  |   1
   5  |   9           12  |   0
   6  |  29

Comment?

Méthode

La sortie est calculée en effectuant un OR au niveau du bit entre:

  • F
  • M

Exceptions:

  • F=44b4a
  • M=66b6a

Table

FM

F01234a4b56MOR014581024166767141466200145810243001458102442121212121293123215999131391111136a889121381010126b141415141514141414

M3M3MF=3

Exemple

M=1F=1

6 OR 1=7

77

Commenté

a =>                   // a[] = input array, reused as an integer to keep track of the
  a.map(               //       maximum number of occurrences of the same dice (M)
    o =                // o = object used to count the number of occurrences of each dice
    n =>               // for each dice n in a[]:
    [                  //   this is the lookup array for M-bitmasks:
      x =              //     x = o[n] = number of occurrences of the current dice
        o[n] = -~o[n], //     increment o[n] (we can't have M = 0, so this slot is not used)
      6,               //     M = 1 -> bitmask = 6
      ,                //     M = 2 -> bitmask = 0
      ,                //     M = 3 -> bitmask = 0
      21,              //     M = 4 -> bitmask = 21
      9,               //     M = 5 -> bitmask = 9
      8 ^ o[1]         //     M = 6 -> bitmask = 14 for six 1's, or 8 otherwise
    ][a =              //   take the entry corresponding to M (stored in a)
        x < a ? a : x] //   update a to max(a, x)
  )[5]                 // end of map(); keep the last value
  |                    // do a bitwise OR with the second bitmask
  [                    // this is the lookup array for F-bitmasks:
    ,                  //   F = 0 -> bitmask = 0
    1,                 //   F = 1 -> bitmask = 1
    4,                 //   F = 2 -> bitmask = 4
    5,                 //   F = 3 -> bitmask = 5
    o[1] & 2 | 8,      //   F = 4 -> bitmask = 10 if we also have two 1's, 8 otherwise
    2,                 //   F = 5 -> bitmask = 2
    4                  //   F = 6 -> bitmask = 4
  ][o[4]]              // take the entry corresponding to F (the number of 4's)

5

R , 100 octets

Encodez la partition sous forme de groupe de conditions indexées. Plus simple que ma première approche de stringy-regex.

Modifier le bug corrigé et classer maintenant tous les rouleaux.

function(d,s=sum(d<2))min(2[s>5],c(11,10,8,6-6*!s-2,4,1)[sum(d==4)],c(7,12,12,9,5,3)[max(table(d))])

Essayez-le en ligne!



2

Python 2 ,  148  119 octets

-27 octets grâce aux ovs (1. utilisation de .countpermettre mapà a d'être utilisé; 2. suppression du redondant 0dans la tranche; 3. utilisation d'un inplutôt que d'un max; 4. raccourci (F==4)*O==2à F==4>O==2[depuis le golf F>3>O>1]])

C=map(input().count,range(1,7))
O,F=C[::3]
print[F>3>O>1,F>5,O>5,6in C,F>4,5in C,F>3,all(C),F>2,4in C,F>1,F,1].index(1)

Essayez-le en ligne!


@ovs oh heh .count> _ <nice
Jonathan Allan

Une dernière suggestion: comme il dn'en faut qu'une, elle est plus courte en tant que programme complet .
2018

Version Python 3 : 131 octets
Adirio

@ovs - merci pour tout votre golf. Enregistré deux autres pour démarrer.
Jonathan Allan

Je dois aimer le chaînage conditionnel en python! De plus, la spécification ne saute pas le numéro 10
Quintec

1

Pyth, 60 octets

eS[@[ZhZ2 4*6hq2hJuXtHG1Qm0Q8hT)@J3*5hSJ*Tq6hJ*<3KeSJ@j937TK

Mappe au rang inversé, 0-12. Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .

Le mappage complet utilisé est le suivant:

12: 4 fours and 2 ones.
11: 6 fours.
10: 6 ones.
 9: 6 of any kind except fours and ones.
 8: 5 fours.
 7: 5 of any kind except for fours.
 6: 4 fours.
 5: Straight. (1-6)
 4: 3 fours.
 3: 4 of any kind except 4.
 2: 2 fours.
 1: 1 four.
 0: Nothing.

Cela fonctionne en mappant les valeurs des dés aux fréquences, puis en calculant la valeur de plusieurs règles et en prenant le maximum de l'ensemble.

Implicit: Q=eval(input()), Z=0, T=10

JuXtHG1Qm0Q   Input mapping
 u     Q      Reduce each element of the input, as H, ...
        m0Q   ...with initial value, G, as an array of 6 zeroes (map each roll to 0)
   tH           Decrement the dice roll
  X  G1         Add 1 to the frequency at that point
J             Store the result in J

@[ZhZ2 4*6hq2hJuXtHG1Qm0Q8hT)@J3   Rule 1 - Values for sets including 4
  Z                               *0
   hZ                             *1 (increment 0)
     2                            *2
       4                          *4
              JuXtHG1Qm0Q          Input mapping (as above)
             h                     First value of the above - i.e. number of 1's
           q2                      1 if the above is equal to 2, 0 otherwise
        *6h                       *Increment and multiply by 6
                                   Maps to 12 if there are 2 1's, 6 otherwise
                         8        *8
                          hT      *11 (increment 10)
 [                          )      Wrap the 7 starred results in an array
                             @J3   Get the 4th value of the input mapping - i.e. number of 4's
@                                  Get the value at that position in the array

*5hSJ   Rule 2 - Straight
  hSJ   Smallest frequency in input mapping (first, sort, J)
        For a straight, smallest value will be 1, 0 otherwise
*5      Multiply by 5

*Tq6hJ   Rule 3 - 6 1's
    hJ   Frequency of 1's (first value from input mapping)
  q6     1 if the above == 6, 0 otherwise
*T       Multiply by 10

*<3KeSJ@j937TK   Rule 4 - 4,5,6 of a kind, other than 4's
   KeSJ          Get the max frequency from input mapping, store in K
        j937T    [9,3,7]
       @     K   Get the element at K'th position in the above (modular indexing)
 <3K             1 if 3<K, 0 otherwise
*                Multiply the previous 2 results

eS[   Wrapping it all up!
  [   Wrap all the above rules in an array
eS    Take the max value of the above, implicit print

1

Rétine , 137 126 octets

4
A
O`.
^11A+
0
1+$
2
^A+
1
(.)\1{5}
3
^.A+
4
.?(.)\1{4}.?
5
^..A+
6
12356A
7
.+AAA$
8
.*(.)\1{3}.*
9
.+AA$
10
.+A$
11
.{6}
12

-11 octets grâce à @Neil .

La sortie est indexée 0 ( 0..12).

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

Remplacez tous les 4 par un «A»:

4
A

Triez tous les chiffres d'entrée (les A seront à l'arrière):

O`.

Toutes les deux lignes, l'entrée est remplacée par la sortie attendue:

Regex         Replacement  Explanation

^11A+         0            starts with "11", followed by any amount of A's
1+$           2            ends with any amount of 1s
^A+           1            starts with any amount of A's
(.)\1{5}      3            six of the same characters
^.A+          4            starts with any character, followed by any amount of A's
.?(.)\1{4}.?  5            five of the same characters,
                           with optionally a leading or trailing character
^..A+         6            starts with any two characters, followed by any amount of A's
12356A        7            literal "12356A" match
.+AAA$        8            any amount of leading characters, ending with three A's
.*(.)\1{3}.*  9            four of the same characters,
                           with optionally any amount of leading/trailing chars
.+AA$         10           any amount of leading characters, ending with two A's
.+A$          11           any amount of leading characters, ending with a A
.{6}          12           any six characters

1
Très intelligent, mais je pense que vous pouvez aller plus loin et le remplacer 4par quelque chose en dehors de la plage 1-6pour obtenir un tri automatique à une extrémité (je ne sais pas si cela fait une différence à quelle extrémité vous triez).
Neil

@Neil Ah, c'est intelligent aussi! Merci.
Kevin Cruijssen

1

05AB1E , 57 55 octets

4¢4@U.M¢©5-Di14¹нk2αë>Di5X-ë>i9X3*-¹1¢2Ê*ë®i7ë¹4¢o;ï12α

Réponse de Port of @Neil Charcoal , car mon approche initiale était déjà à 60 octets et je n'avais pas encore fini. Ma réponse actuelle peut probablement être encore plus jouée.

Saisie sous forme de liste de chiffres.

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

4¢              # Count the amount of 4s in the (implicit) input-list
  4@            # Check if it's larger than or equal to 4
                # (results in 1 for truthy; 0 for falsey)
    U           # Pop and store that result in variable `X`
.M              # Push the most frequent number in the (implicit) input-list
  ¢             # Pop and push the count of that number in the (implicit) input-list
   ©            # Store it in the register (without popping)
5-Di            # If the maximum count - 5 is exactly 1 (so the maximum count is 6):
    14          #  Push 14
      ¹н        #  Push the first digit of the input-list
        k       #  Get its index in 14, resulting in -1, 0, or 1
         2α     #  Take the absolute difference with 2
                #  (This covers cases 1, 2, and 3)
ë>Di            # Else-if the maximum count - 5 + 1 is exactly 1 (so the maximum count is 5):
    5           #  Push 5
     X-         #  And subtract variable `X`
                #  (This covers cases 4 and 5)
ë>i             # Else-if the maximum count - 5 + 2 is exactly 1 (so the maximum count is 4):
   9            #  Push 9
    X3*         #  Multiply variable `X` by 3
       -        #  And subtract it from the 9
        ¹1¢     #  Count the amount of 1s in the input-list
           2Ê   #  Check if it's NOT equal to 2 (1 if truthy; 0 if falsey)
             *  #  Multiply it with the 9 or 6
                #  (This covers cases 0, 6, and 9)
ë®i             # Else-if the maximum count is 1:
   7            #  Push a 7
                #  (This covers case 7)
ë               # Else (maximum count is 2 or 3):
 ¹4¢            #  Count the amount of 4s in the input-list
    o           #  Take 2 to the power this count
              #  Halve and floor it
       12α      #  And take the absolute difference with 12
                #  (This covers cases 8, 10, 11, and 12)
                # (Output the top of the stack implicitly as result)

0

Ruby , 100 octets

->a{%w(^2.*4$ 6$ ^6 6 5$ 5 4$ ^1*$ 3$ 4 2$ 1$ .).index{|b|/#{b}/=~([1,*a,4].map{|c|a.count(c)}*'')}}

Essayez-le en ligne!

Comment ça fonctionne:

Comptez les occurrences de chaque nombre dans le tableau, ajoutez le nombre de 1 et ajoutez le nombre de 4.

Après cela, essayez de faire correspondre différents motifs d'expression régulière.

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.