Construyamos una simulación para un aspecto del juego de cartas, que personalmente conozco por el nombre holandés 'Oorlog' (se traduce como 'Guerra').
¿Cómo funciona 'Oorlog'?
Dos barajas de cartas (cada una con dos comodines) se dividen en partes iguales entre la cantidad de jugadores que juegan. Cada jugador baraja su propio stock, lo pone boca abajo frente a ellos, y todos los jugadores abren la primera carta del stock al mismo tiempo.
El ganador de esa 'batalla' está determinado por los valores de las cartas siguiendo estas reglas: Joker / Ace derrota a King; King derrota a Queen; Queen derrota a Jack; Jack derrota a 10; 10 derrotas 9; .... Además, 2 y 3 derrotan a Ace / Joker. La última regla puede conducir a un ciclo donde 2 o 3 vence a As o Joker, Ace o Joker vence a otra carta, que a su vez vence a 2 o 3. En este caso, el 2 o 3 gana la batalla.
(El traje es irrelevante en este juego de cartas).
Cuando dos o más jugadores tienen las mismas cartas más altas, tienen una 'guerra'. Esto significa que ponen una carta al revés, y luego cada una abre una nueva carta de su stock, nuevamente buscando quién tiene la carta más alta. Esto continúa hasta que un solo jugador gana la batalla completa.
(Todas las cartas de esa batalla van a la pila de descarte del jugador que ganó la batalla. Luego, todos abren una nueva carta. Cuando las existencias de un jugador se quedan sin cartas, dan la vuelta a su pila de descarte y continúan con esta nueva cantidad. Esto continúa hasta que un jugador se quede sin todas sus cartas y luego gane el jugador con la mayor cantidad de cartas).
Ejemplo de 'batallas' con tres jugadores:
- 4, 8, Jack:
Jack gana. - 7, Ace, Reina:
Ace gana. - 10, 10, Rey: el
Rey gana. - 3, Joker, 2:
3 victorias. - Ace, Joker, 2:
2 victorias. - 3, Reina, As:
3 victorias. - Reina, Reina, 9:
Reina y Reina están teniendo una 'guerra', por lo que continúa con dos cartas nuevas: 4, 8;
8 victorias. - 4, 4, 4:
Todos están teniendo una 'guerra', por lo que continúa con tres cartas nuevas: 8, As, 2;
2 victorias. - Jack, 5, Jack:
Jack y Jack están teniendo una 'guerra', por lo que continúa con dos cartas nuevas: 5, 5;
5 y 5 también son iguales, por lo que la 'guerra' continúa nuevamente con dos cartas nuevas: 10, Rey;
El rey gana. - Joker, Joker, Ace:
Todos están teniendo una 'guerra', por lo que continúa con tres cartas nuevas: 9, 7, 9;
9 y 9 también son iguales, por lo que la 'guerra' continúa con dos cartas nuevas: Jack, 3;
Jack gana.
Entonces, sobre el desafío del código:
Entrada:
STDIN con una matriz o una cadena que simula una matriz (su llamada, incluso si su idioma admite matrices). Este conjunto contiene las cartas de una batalla en orden cronológico (ver casos de prueba para una comprensión más clara de esto).
Salida:
STDOUT el índice del jugador que ganó la batalla.
Puede elegir si desea un indexados a cero (es decir 0
, 1
o 2
) o uno indexada salida (es decir 1
, 2
, 3
).
Reglas de desafío:
- La entrada será una sola matriz / cadena que representa una matriz. Por lo tanto, no puede tener una matriz de matrices para simplificarlo. Tampoco puedes tener objetos sustitutos para cartas que no participan en la guerra.
- Usamos anotaciones numéricas para las tarjetas de presentación en lugar de las letras. Entonces Ace / Joker =
1
; Jack =11
; Reina =12
; y rey =13
. - En este desafío, podemos asumir que siempre estamos jugando con 3 jugadores .
- Los tres primeros indican el inicio de la 'batalla'. Cuando dos o más jugadores tienen una 'guerra', las cartas continuas en la matriz indican su batalla (ver casos de prueba para una comprensión más clara de esto).
Reglas generales:
- Esto está etiquetado como code-golf , por lo que la respuesta más corta en bytes gana.
Esto no significa que no deberían ingresar idiomas que no sean de código de golf. Trate de encontrar una respuesta de código de golf lo más breve posible para "cada" lenguaje de programación. - Mencione qué indexación (cero o uno indexado) ha utilizado para la salida.
Casos de prueba:
Test case 1: [4, 8, 11] -> 2 (or 3)
Test case 2: [7, 1, 12] -> 1 (or 2)
Test case 3: [10, 10, 13] -> 2 (or 3)
Test case 4: [3, 1, 2] -> 0 (or 1)
Test case 5: [1, 1, 2] -> 2 (or 3)
Test case 6: [3, 12, 1] -> 0 (or 1)
Test case 7: [12, 12, 9, 4, 8] -> 1 (or 2)
Test case 8: [4, 4, 4, 8, 1, 2] -> 2 (or 3)
Test case 9: [11, 5, 11, 5, 5, 10, 13] -> 2 (or 3)
Test case 10: [1, 1, 1, 9, 7, 9, 11, 3] -> 0 (or 1)
Test case 11: [13, 13, 4, 1, 3] -> 1 (or 2)
Test case 12: [13, 4, 13, 2, 3] -> 2 (or 3)
fuente
Respuestas:
q - 142 caracteres
Nota: cero indexado.
No hay una noción de lectura de stdin en q, por lo que debe llamarlo como una función:
{p:til 3;while[1<(#:)p;h:(n:(#:)p)#x;x:n _x;$[1~min h;p:$[max a:h in(2;3);$[1<(#:)(?:)h(&:)a;p(&:)h=3;p(&:)a];p(&:)h=1];p:p(&:)h=max h]];(*:)p}[1,2,3]
Bastante largo, en realidad, pero hay muchos casos de esquina. Mantiene una lista de jugadores activos y consume la lista de cartas en un bucle. Lo más problemático es detectar al ganador correcto en manos como
[13, 2, 3]
, desde3
latidos2
, como es normal, pero tuvo que duplicarse para colocarse en la esquina.fuente
JavaScript (ES6), 146 bytes
Devuelve un índice basado en cero. 127 bytes si se me permite el acuerdo inicial como una matriz separada (esto también funciona para un número arbitrario de manos, por supuesto):
fuente
Java 8, 257 bytes
Ok, mi desafío es más difícil de lo que pensé que sería con todo en una sola matriz como esa. ;) Pero como hace más de un año que publiqué este desafío, decidí probarlo yo mismo. Me tomó bastante tiempo con múltiples soluciones y caprichos ... Así que definitivamente se puede jugar un poco más, pero lo investigaré en otra ocasión. Esto ya tomó mucho más tiempo de lo que esperaba ...
Explicación:
Pruébalo aquí.
fuente