Nota: Esto está relacionado con una variación del juego Rummikub
Antecedentes y reglas
Rummikub es un juego basado en fichas. Hay cuatro colores: rojo, naranja, azul y negro. Para cada color hay 13 fichas (etiquetadas del 1 al 13), y también hay 2 comodines que son independientes del color, por lo tanto, hay 54 piezas en total. En esta variación de Rummikub, cada jugador recibe 14 fichas y debe obtener una ficha más y soltar otra cada ronda, de modo que el recuento de fichas sea constante. Los jugadores no ven las fichas del otro. El objetivo es agrupar las fichas, de modo que todas las piezas pertenezcan al menos a un grupo (ver más abajo). Cuando un jugador tiene todas las piezas agrupadas, sueltan su tablero de fichas y revelan sus piezas. Luego, los demás verifican si todas las combinaciones son válidas, y si lo son, el jugador gana la ronda.
¿Cómo se pueden agrupar los mosaicos?
Solo hay dos tipos de grupos:
Grupos multicolores :
- Se componen de 3 o 4 fichas.
- Solo contienen fichas con el mismo número.
- Todos los azulejos son de diferentes colores.
- Ejemplo:
RED 9, BLUE 9, BLACK 9
.
Grupos monocolor :
- Se componen de al menos 3 fichas.
- No pueden contener más de 13 fichas.
- Solo contienen fichas con diferentes números consecutivos, en orden ascendente.
- Todos los azulejos tienen el mismo color.
- Las baldosas etiquetadas con
1
pueden no ser lugares después de las baldosas etiquetadas13
. - Ejemplo:
RED 5, RED 6, RED 7
.
Espera, ¿qué hacen los comodines?
Los comodines pueden sustituir cualquier pieza del juego. Por ejemplo, nuestro primer ejemplo puede ser JOKER, BLUE 9, BLACK 9
, RED 9, JOKER, BLACK 9
o RED 9, BLUE 9, JOKER
. Lo mismo se aplica a nuestro otro ejemplo. Sin embargo, uno no puede colocar dos comodines en el mismo grupo, por lo que cosas como JOKER, ORANGE 8, JOKER
están prohibidas.
Tarea
Dado un grupo de mosaicos Rummikub, determine si es válido. Se le garantiza que no aparecerán mosaicos duplicados, excepto los 2 comodines y que los mosaicos que reciba como entrada son válidos (por ejemplo, cosas como 60
no aparecerán).
De entrada y salida
Puede tomar la entrada y proporcionar la salida por cualquier método estándar.
Algunos formatos de entrada válidos: lista de cadenas, lista de tuplas, listas anidadas, cadenas o cualquier otra cosa que considere adecuada. Los colores pueden tomarse como Cadenas (por ejemplo:) "Blue","Red", etc.
, como abreviaturas de Cadena (haga que las baldosas Azul y Negra sean distinguibles) o como enteros que correspondan a un color. Cuando se trata de comodines, debe mencionar la forma en que su programa los recibe como entrada. Si elige cadenas, puede tener algo como RED 9, JOKER, ...
, si elige tuplas que puede tener (9,"RED"), ("JOKER")
o algo equivalente. Si ayuda, puede recibir un color para ese Joker (que no debería afectar la salida de su programa). Por ejemplo, puede tener ("JOKER","RED")
o ("JOKER","BLUE")
, pero eso no debería influir en la salida de ninguna manera.
Con respecto a la salida, se aplican las reglas estándar para un problema de decisión .
Ejemplos trabajados
Tomemos un ejemplo, que con suerte hará que sea más fácil de entender. Dado un grupo de la siguiente manera, donde cada tupla representa un mosaico:
[(9, "ROJO"), (9, "NARANJA"), ("JOKER"), (9, "NEGRO")]
Esto debería devolver un valor verdadero, porque la entrada es válida. En este caso, el Joker sustituye (9, "BLUE")
, y forman un grupo multicolor.
Si le dieran el siguiente grupo:
[(9, "AZUL"), (9, "NARANJA"), (9, "ROJO"), (9, "NEGRO"), ("JOKER")]
Sería inválido y, por lo tanto, su programa debería devolver un valor falso, porque no queda nada para que el comodín lo sustituya, porque el número máximo de tarjetas en un grupo multicolor es 4.
Casos de prueba adicionales
Estos son para un conjunto de pruebas extendido que cubre casi todas las situaciones posibles:
Entrada -> Salida [(1, "AZUL"), (2, "AZUL"), (3, "AZUL"), (4, "AZUL"), (5, "AZUL"), (6, "AZUL")] - > veraz [(6, "AZUL"), (6, "ROJO"), (6, "NEGRO)] -> verdad [(5, "NEGRO"), (6, "NEGRO"), (7, "NEGRO"), (8, "NEGRO"), (9, "NEGRO"), (10, "NEGRO"), ( "JOKER"), (12, "BLACK")] -> verdad [("JOKER"), (3, "AZUL"), (3, "ROJO")] -> verdad [(8, "NEGRO"), (2, "ROJO"), (13, "AZUL")] -> falso [(4, "RED"), (3, "RED"), (5, "RED")] -> falsedad [(5, "NEGRO"), (6, "NEGRO)] -> falsedad [("JOKER"), (5, "RED"), ("JOKER")] -> falsedad [(4, "ROJO"), (5, "ROJO"), (6, AZUL ")] -> falsedad [(4, "RED"), ("JOKER"), (5, "RED")] -> falsedad [(12, "NEGRO"), (13, "NEGRO), (1," NEGRO ")] -> falsedad
Este es el código de golf , por lo que gana el código más corto en bytes en cada idioma.
fuente
Respuestas:
APL (Dyalog) , 58 bytes
Toma la lista de colores (1-4) como argumento derecho y la lista de números como argumento izquierdo. El número de un Joker se denota, lo
(⍳4)
que equivale(1 2 3 4)
a indicar que podría ser cualquiera de esos. Del mismo modo, su color se denota(⍳13)
para indicar que podría ser cualquiera de los números del 1 al 13.Pruébalo en línea!
Algoritmo
Hay tres condiciones, de las cuales las dos últimas tienen dos condiciones cada una:
Y TAMBIÉN
un solo número Y
colores únicos
O
para que la carrera sea válida.
Orden de lectura
3≤
3 es menor o igual que el≢⍺
número de fichas∧
ys⍵
todos los numeros son iguales∧
y⍺≡∪⍺
los colores son únicos∨
o1∊
1 está entre≢∘∪¨
la cantidad de colores⊃,¨/
expandidos únicos⍺
∧
y∨/
existe al menos uno∊
entre todos los⊃,¨/⍵
números expandidos⍷¨⊂
que se encuentran en⍳13
1 a 13Explicación completa del código
{
...}
función anónima donde⍺
se deja argumento y⍵
es argumento correcto3.2.
⍳13
los números del 1 al 13(
…)⍷¨
Encuentre las posiciones iniciales de cada una de las siguientes carreras:,¨/⍵
une cada elemento de los números (crea una carrera para cada valor de Joker)⊃
revelar (porque/
reduce el rango)∊
ϵ nlist (aplanar)∨/
O reducción (es decir, ¿hay alguna verdad?)(
...)∧
Y:3.1
(
...)⍺
el resultado de aplicar la siguiente función en la lista de colores:s←{
...}
s (por s AME), que es la siguiente función anónima (⍵
es su argumento):,¨/⍵
une cada elemento (crea una carrera para cada valor Joker)⊃
revelar (porque/
reduce el rango)≢∘∪¨
el número de elementos únicos en cada lista1∊
es uno un miembro? (es decir, ¿hay listas todas iguales?)(
...)∨
O:2.2.
∪⍺
los colores únicos⍺≡
son idénticos a los colores (es decir, son únicos)(
...)∧
Y:2.1.
s⍵
los números son todos iguales(
...)∧
Y1)
≢⍺
la cantidad de colores (es decir, la cantidad de mosaicos)3≤
tres es menor o igual a esofuente
Gelatina ,
41403836 bytesPruébalo en línea! (viene con un pie de página de la suite de prueba)
Toma datos como una matriz de
(color, value)
mosaicos regulares y0
comodines. Los colores se representan como enteros (aunque no estoy seguro de si eso es importante para el código actual).Salidas
1
(verdad) o0
(falsedad).Explicación
fuente
Python 2 ,
371 370 362 341 329325 bytesstr.split()
lugar delist literal
len(x)-1
J O BK B R
paraJoker, Orange, Black, Blue, Red
literalesPruébalo en línea!
fuente
BK
conb
para guardar 1 byte (TIO con casos de prueba actualizados ab
.Javascript (ES6), 286 bytes
(Tenga en cuenta que los casos de prueba anteriores contienen 2 casos de prueba adicionales que no están en la Pregunta: son verdaderos y falsos, respectivamente: consulte la versión no protegida para facilitar la lectura).
Proceso áspero:
Los comodines se indican teniendo a
0
como su valor numérico (un número negativo también funcionaría); Esto mantiene la estructura de entrada consistente (tiene un color y un valor) y no depende de tener que verificar sic=="JOKER"
, ahorrando 7 bytes.Es posible que se eliminen algunos paréntesis, podría ser posible no encajonar
q
como una matriz (lo probé y el valor simplemente permaneció 0 o causó demonios nasales ).Sin golf:
Versión en la que trabajé para obtener la lógica correcta. Las lambdas de un solo uso se alinearon; Aquí está su función correspondiente:
fuente
C # (.NET Core) , 198 bytes
Toma los colores de los mosaicos y los números en ellos como listas separadas de enteros. Los detalles de ese mapeo no importan siempre que cada color tenga un número entero diferente y los comodines se representen como 0.
Sin embargo, el formato para ingresar números es bastante especial. El número que debe ingresarse para un número
n
es, en cambio, 2 ^ n, mientras que el número utilizado para representar un comodín debe ser (2 ^ 14) -1. Esto habilita el bitu&x
a bit y para evaluar si el mosaico x tiene un valor igual a u o es un comodín.C # (.NET Core) , 200 bytes
Una solución más larga de 2 bytes que no es ecléctica con respecto a la entrada. Resulta que solo usé un caso especial para bromistas en el único lugar con el que eran difíciles de tratar no fue mucho más que la inteligente operación bit a bit de la que estaba tan orgulloso. Aquí los comodines son (0,0), otros números son los esperados y los colores se representan con 4 valores que son distintos entre sí por la comparación predeterminada de C # (específicamente, el Linq
Distinct()
operación debe considerar valores para el mismo color como 'no distinto' y valores para diferentes colores como 'distintos').Algo que podría ser útil para otros idiomas,
u*=!u++^x*x
sería equivalente au=u==x|x<1?u+1:0
en algunos idiomas; u ^ x es 0 si u == x, y 0 veces cualquier int es 0, entonces u ^ x * x sería 0 para u == x o x == 0 si C # no hizo que las operaciones bit a bit tuvieran una precedencia menor que los matemáticos C # tampoco puede interpretar ints como bools sin conversión explícita. Un lenguaje que se esfuerza más para hacer que los tipos de trabajo podría convertir los valores0
ynot 0
afalse
ytrue
antes de aplicar!
a ellos, sin embargo, y luego cuando se va de nuevo a un int interpretar!false
como 1 y!true
como 0. Dicho todo esto, no puedo garantizar otro idioma en realidad beneficiarse del resto del algoritmo, por lo que es posible que ni siquiera aparezca.fuente
Scala,
491477 caracteres,491477 bytesEste desafío fue divertido; Gracias.
Entonces,
f
en la línea 4 hay una llamada recursiva donde trato de reemplazar "JOKER" por cada otro mosaico. Ver tio para una visión más clara del código. Elegí tomar como entrada una secuencia de 2 tuplas (Int, String), llamadat
en mi código, ver tio , por lo que "JOKER" está representado por una 2-tupla (0, "JOKER").EDITAR: 14 bytes guardados gracias a los comentarios, tomo OB b R para NARANJA NEGRO AZUL ROJO.
¡Pruébelo en línea!
EDITAR: -2 bytes, borrado inútil
(
alrededor de las condiciones delcase _ if
sfuente
O,B,b,R
lugar deORANGE,BLUE,BLACK,RED
guardar bytes? No tengo idea de cómo funciona Scala, pero creo que puedes.var (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")
y las llamadas sonO
B
b
R
, para un total de 49 bytes; dondevar c=Seq("ORANGE","BLACK","BLUE","RED")
y las llamadasc(...)
totalizan 58 bytes. PERO el primer caso lo permitefor(u<-c)
en lugar defor(u<-Seq(O,B,b,R))
, por lo que el costo no es -9 sino +2. Gracias por intentarlo sin embargo.var c=Seq("O","B","b","R")
y tomar esos caracteres como entradas en lugar de cadenas completas para el color. Como se menciona en la publicación original, "Los colores se pueden tomar como ... Abreviaturas de cadena".