En el juego Pickomino , hay varias fichas situadas en el centro de la mesa, cada una con un número entero positivo diferente. Cada turno, los jugadores tiran dados de cierta manera y obtienen un puntaje, que es un número entero no negativo.
Ahora el jugador toma el mosaico con el número más alto que todavía es más bajo o igual a su puntaje, retira el mosaico del medio y lo agrega a su pila. Si esto no es posible porque todos los números en el medio son más altos que el puntaje del jugador, el jugador pierde la ficha más alta de su pila (que se agregó más tarde), que se devuelve al medio. Si al jugador no le quedan fichas, no pasa nada.
El reto
Simula a un jugador que juega contra ellos mismos. Obtiene una lista de las fichas en el medio y una lista de los puntajes que obtuvo el jugador. Devuelve una lista de las fichas del jugador después de que se hayan evaluado todos los turnos.
Reglas de desafío
- Puede suponer que la lista con los mosaicos está ordenada y no contiene ningún número entero dos veces.
- Puede tomar ambas listas de entrada en el orden que desee
- La salida debe mantener el orden de los mosaicos en la pila, pero puede decidir si la lista se ordena de arriba a abajo o de abajo hacia arriba.
Reglas generales
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Se recomienda agregar una explicación para su respuesta.
Ejemplo
(tomado del sexto caso de prueba)
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
El primer puntaje es 22, así que toma la ficha más alta en el medio <= 22, que es 22 en sí.
Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [22, 22, 23, 21, 24, 0, 22]
El siguiente puntaje es 22, así que toma la ficha más alta en el medio <= 22. Como 22 ya está tomado, el jugador tiene que tomar 21.
Middle: [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 21]
Remaining scores: [22, 23, 21, 24, 0, 22]
El siguiente puntaje es 22, pero todos los números <= 22 ya están tomados. Por lo tanto, el jugador pierde la ficha superior de la pila (21), que se devuelve al medio.
Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [23, 21, 24, 0, 22]
Los siguientes puntajes son 23, 21 y 24, por lo que el jugador toma estas fichas del medio.
Middle: [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21, 24]
Remaining scores: [0, 22]
El jugador revienta y anota cero. Por lo tanto, el mosaico con el número 24 (el más alto en la pila) se devuelve al medio.
Middle: [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21]
Remaining scores: [22]
El último puntaje es 22, pero todas las fichas <= 22 ya están tomadas, por lo que el jugador pierde la ficha superior en la pila (21).
Middle: [21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Final Stack and Output: [22, 23]
Casos de prueba
(con el último mosaico superior en la lista de resultados)
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [26, 30, 21]
Output: [26, 30, 21]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [35, 35, 36, 36]
Output: [35, 34, 36, 33]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23]
Output: [23]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: []
Output: []
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23, 0]
Output: []
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
Output: [22, 23]
Tiles: [1, 5, 9, 13, 17, 21, 26]
Scores: [6, 10, 23, 23, 23, 1, 0, 15]
Output: [5, 9, 21, 17, 13, 1]
Tiles: []
Scores: [4, 6, 1, 6]
Output: []
Respuestas:
Haskell ,
119111104103 bytes1 byte guardado gracias a Ørjan Johansen
Pruébalo en línea!
Asume que los mosaicos están ordenados en orden descendente.
No hay mucha fantasía aquí. El primer argumento es la pila de jugadores, el segundo sus puntajes y el tercero es la pila en el medio.
fuente
sort
es ascendente. Sin embargo, el caso de prueba TIO nunca llega a esa rama. Recomiendo encarecidamente probar todos los casos cada vez que itere de esta manera.(#)=span.(<)
.Japt, 24 bytes
Oof! ¡Eso no funcionó tan bien como pensé!
Toma la entrada en orden inverso.
Pruébelo o ejecute todos los casos de prueba en TIO
fuente
Perl 6 , 89 bytes
Pruébalo en línea!
Creo que hay algunos bytes más que se pueden sacar de esto ...
fuente
C # (compilador interactivo de Visual C #) ,
159158154 bytesLlamado
f(tiles)(scores)
Si solo
System.Void
es realmente un tipo de retorno y no solo un marcador de posición para la reflexión. Podría reemplazarif(a<1)m.Add(s.Count<1?0:s.Pop());else s.Push(a);
convar t=a>1?m.Add(s.Count<1?0:s.Pop()):s.Push(a);
, ahorrando dos bytes.Pruébalo en línea!
fuente
Ruby , 77 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) , 80 bytes
La misma lógica que la versión ES6, pero toma los mosaicos como una máscara de bits BigInt y las puntuaciones como una matriz de BigInts.
Pruébalo en línea!
JavaScript (ES6),
100 98 9487 bytesToma entrada como
(tiles)(scores)
. Las fichas se pueden pasar en cualquier orden.Pruébalo en línea!
Comentado
fuente
Carbón , 35 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Recorrer los puntajes.
Busque el azulejo más alto disponible.
Si existe, entonces ...
... quitar el azulejo del medio ...
... y agrégalo a la pila.
De lo contrario, si la pila no está vacía ...
Retire el último mosaico de la pila y vuelva a colocarlo en el medio.
Imprima la pila resultante de la más antigua a la más nueva.
fuente
Python 2 , 120 bytes
Pruébalo en línea!
fuente
05AB1E ,
2722 bytesPruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Pyth, 32 bytes
Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
Debe haber margen de mejora aquí en alguna parte: cualquier sugerencia sería muy apreciada.
fuente
Perl 5
-apl -MList:Util=max
, 97 bytesTIO
lee puntajes y mosaicos en la siguiente línea e imprime la salida.
Cómo
-apl
:-p
para recorrer las líneas e imprimir,-a
auto dividir,-l
para cambiar de entrada y agregar caracteres de nueva línea a la salida$_=$".<>
: para leer la siguiente línea (mosaicos) y anteponer un espacio en la var predeterminada$_
for$i(@F){
...}
bucle$i
más@F
campos de la línea actual (puntuaciones)(
..?
..:
..).=$&
agregar una coincidencia anterior al valor l ternario($m=max grep$_<=$i,/\d+/g)&&s/ $m\b//?$s
en caso de que el valor máximo encontrado y eliminado de los mosaicos ($_
) el valor l sea puntajes ($s
)$s=~s/ \d+$//?$_
de lo contrario, si el último número se puede eliminar de las puntuaciones, son fichas:$G
finalmente es basura porque no puede ocurrir$_=$s;s/ //
para establecer las puntuaciones en var predeterminado y eliminar el espacio inicialfuente