Juego de apuestas del Festival del Medio Otoño


11

¡Mañana es el festival del Medio Otoño, y en el espíritu de esas vacaciones, presentaré un juego de apuestas que nosotros (la gente de Xiamen ) jugamos durante las vacaciones!

Reglas

El juego se juega con seis dados de 6 lados. Las diferentes combinaciones de números tienen diferentes rangos, con un énfasis especial en los cuatro y los unos. Su trabajo es escribir un programa / función que clasifique la mano, dado un lanzamiento de 6 dados. Aquí están los rangos (he modificado / simplificado un poco las reglas):

rangos

¡Creo que solo los chinos pueden hacer este desafío! Bien, bien, aquí hay algunas explicaciones en inglés.

  • 0: 4 cuatro y 2 unos.
  • 1: 6 cuatros.
  • 2: 6 unos.
  • 3: 6 de cualquier tipo, excepto cuatros y unos.
  • 4: 5 cuatros.
  • 5: 5 de cualquier tipo, excepto para los cuatro.
  • 6: 4 cuatros.
  • 7: derecho. (1-6)
  • 8: 3 cuatro.
  • 9: 4 de cualquier tipo excepto 4.
  • 10: 2 cuatros.
  • 11: 1 cuatro.
  • 12: nada.

Entrada

6 números, una matriz de 6 números o una cadena de 6 números que representan los valores de los 6 dados del 1 al 6

Salida

Su programa / función puede devolver / emitir cualquier cosa para indicar el rango, siempre que cada rango esté indicado por una salida y viceversa. Ex. Usando los números 0-12, 1-13, etc.

Ejemplos (usando 0-12 como salidas)

[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

Este es el código de golf, por lo que gana el conteo de bytes más corto.


(Hubiera puesto esto en la caja de arena, pero quería que el momento fuera el correcto. Traté de ser lo más minucioso posible, por favor avíseme si se necesitan aclaraciones).
Quintec

@Shaggy Entonces, el OP dice que la salida 0-12 o 1-13 en su lugar
Shieru Asakoto

@ Shaggy Como dije en la pregunta, la salida no necesariamente tiene que corresponder con el número de etiqueta. El número omitido y las brechas aleatorias en la imagen son para simplificar un poco las reglas: realmente no hay reglas definitivas para esta tradición, esta es solo mi interpretación.
Quintec

¿No debería ser [1,2,3,5,6,6]->13?
J.Doe

@ J.Doe Los ejemplos / casos de prueba utilizan los índices como resultado en lugar de los valores. A diferencia de los valores, 10no se omite.
Kevin Cruijssen

Respuestas:


2

Carbón , 55 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. No se salta 10. Explicación:

≡⌈Eθ№θι

Calcule la frecuencia más alta de cualquier dígito.

⁶I⁻²⌕14§θχ

Si hay un 6 de un tipo, reste la posición del dígito en la cadena 14de 2. Esto da como resultado 1 para 6 4s, 2 para 6 1s y 3 para 6 de cualquier otra cosa.

⁵I⁻⁵⁼⁵№θ4

Si hay un 5 de un tipo, entonces el resultado es 5 a menos que haya 5 4s, en cuyo caso se resta 1.

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

Si hay un 4 de un tipo, entonces si hay 4 4s, entonces el resultado es 6 a menos que haya 2 1s, en cuyo caso el resultado es 0, de lo contrario, el resultado es 9.

¹7

Si todos los dígitos son diferentes, entonces el resultado es 7.

I⁻¹²⌊⊘X²№θ4

De lo contrario, el resultado es 12 - (4 >> (3 - # de 4s)).


Parece ser la mejor práctica para aceptar la respuesta más corta, lo que es lo que voy a hacer :) Por desgracia no hay muchas personas sierra y upvoted su respuesta ...
Quintec

@Quintec Eso no es un problema; se supone que las personas votan las respuestas basadas en el ingenio del algoritmo u otro factor que les hace apreciar la respuesta.
Neil

10

JavaScript (ES6), 88 bytes

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]]

Pruébalo en línea! o Prueba todos los rollos posibles!

Emite un número entero de acuerdo con la siguiente asignación:

 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

¿Cómo?

Método

La salida se calcula realizando un OR bit a bit entre:

  • F
  • M

Excepciones:

  • F=44b4a
  • M=66b6a

Mesa

FM

F01234a4b56MOR014581024166767141466200145810243001458102442121212121293123215999131391111136a889121381010126b141415141514141414

M3M3MF=3

Ejemplo

M=1F=1

6 OR 1=7

77

Comentado

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 bytes

Codifique la puntuación como un grupo de condicionales indexados. Más simple que mi primer enfoque fibroso-regex.

Edición: error corregido y ahora clasifica todas las tiradas.

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

Pruébalo en línea!



2

Python 2 ,  148  119 bytes

-27 bytes gracias a los ovs (1. uso de .countpermitir mapque se use a; 2. eliminación de redundantes 0en el corte; 3. uso de un en inlugar de un max; 4. acortado (F==4)*O==2a F==4>O==2[desde golfed hasta 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)

Pruébalo en línea!


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

Una última sugerencia: como dsolo se necesita una, esta es más corta como un programa completo .
ovs


@ovs: gracias por todo tu golf. Salvó otros dos para arrancar.
Jonathan Allan

¡Tengo que amar el encadenamiento condicional de Python! Además, la especificación ahora no omite el número 10
Quintec

1

Pyth, 60 bytes

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

Mapas para revertir rango, 0-12. Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .

La asignación completa utilizada es la siguiente:

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.

Esto funciona asignando los valores de los dados a las frecuencias, luego calculando el valor de varias reglas y tomando el máximo del conjunto.

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

Retina , 137126 bytes

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 bytes gracias a @Neil .

La salida está indexada a 0 ( 0..12).

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

Reemplace cada 4 con una 'A':

4
A

Ordene todos los dígitos de entrada (las A estarán en la parte posterior):

O`.

Cada dos líneas reemplaza la entrada con la salida esperada:

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
Muy inteligente, pero creo que puede ir un paso más allá y reemplazarlo 4con algo fuera del rango 1-6para que se clasifique automáticamente en un extremo (no estoy seguro de si hace una diferencia en qué extremo se clasifica).
Neil

@Neil Ah, ¡eso también es inteligente! Gracias.
Kevin Cruijssen

1

05AB1E , 57 55 bytes

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

Puerto de la respuesta de carbón de @Neil , porque mi enfoque inicial ya estaba en 60 bytes y aún no había terminado. Sin embargo, mi respuesta actual probablemente se pueda jugar un poco más.

Ingrese como una lista de dígitos.

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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 bytes

->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)}*'')}}

Pruébalo en línea!

Cómo funciona:

Cuente las ocurrencias de cada número en la matriz, anteponga el número de 1s y agregue el número de 4s.

Después de eso, intenta combinar con diferentes patrones de expresiones regulares.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.