Recompensas
No. 1 ( otorgado )
Lanzaré 50 repeticiones por la primera respuesta válida
No. 2 ( otorgado )
Agregaré otras 100 repeticiones para obtener la respuesta válida más corta.
No. 3 ( abierto para envíos )
Lanzaré 200 repeticiones por la primera con una respuesta válida más corta y significativa. Ser significativo como máximo el 45% de la respuesta más corta actual ( 564 bytes x 0.45 = máximo 254 bytes ).
El juego
¿Recuerdas el clásico juego " Morris de nueve hombres " o simplemente " Mill "? Hay una variación llamada Three Men's Morris que es un poco como un tic-tac-toe mutable.
Reglas
Este es el tablero en blanco del juego:
a b c
1 [ ]–[ ]–[ ]
| \ | / |
2 [ ]–[ ]–[ ]
| / | \ |
3 [ ]–[ ]–[ ]
[ ]
es un campo y |–/\
representa rutas entre esos campos.
El juego es jugado por dos jugadores 1
y 2
cada uno coloca 3 fichas en el tablero. Esto ya sucedió y estamos en el juego. El juego se gana si un jugador puede formar unmill
fila vertical u horizontal de las 3 fichas del jugador.
Las fichas se pueden mover en el tablero a lo largo de las líneas de conexión, de acuerdo con esta regla:
A cualquier posición vacía adyacente (es decir, desde una posición de borde al centro, o desde el centro a una posición de borde, o desde una posición de borde a una posición de borde adyacente
Un jugador debe hacer un movimiento a menos que no haya una posición vacía adyacente, en cuyo caso se omite el movimiento.
El reto
Eres jugador 1
y tu movimiento es el siguiente. Escriba un programa o una función que determine si:
- puedes forzar una victoria con 2 o menos movimientos ( victoria definitiva )
- puedes ganar con 2 o menos movimientos, si tu oponente comete un error ( posible victoria )
- no puedes ganar con 2 o menos movimientos, porque necesitarás más movimientos o porque los movimientos forzados llevan a tu oponente a ganar ( imposible de ganar )
Requisitos
- Aunque definitivamente ganas cuando matas a tu oponente, tu programa debe terminar en un tiempo finito.
- Puedes escribir un programa o una función.
Entrada
Los jugadores están representados por 1
y 2
. 0
define un campo libre Puede tomar la entrada como una matriz o una matriz.
Definido
A B C D
2 1 0 | 2 1 0 | 1 0 1 | 1 2 2
2 1 2 | 0 1 0 | 1 0 2 | 2 1 O
0 0 1 | 2 2 1 | 0 2 2 | O O 1
A: [2,1,0,2,1,2,0,0,1]
B: [2,1,0,0,1,0,2,2,1]
C: [1,0,1,1,0,2,0,2,2]
D: [1,2,2,2,1,0,0,0,1]
Posible
A B C
1 0 1 | 1 0 1 | 1 2 2
1 2 2 | 1 2 0 | 0 0 1
2 0 0 | 2 0 2 | 2 1 0
A: [1,0,1,1,2,2,2,0,0]
B: [1,0,1,1,2,0,2,0,2]
C: [1,2,2,0,0,1,2,1,0]
Imposible
A B
1 0 0 | 1 2 0
1 2 2 | 2 1 0
2 0 1 | 1 2 0
A: [1,0,0,1,2,2,2,0,1]
B: [1,2,0,2,1,0,1,2,0]
Salida
Su programa debería generar / devolver un smiley:
- Victoria definitiva:
:)
- Posible victoria:
:|
- Imposible ganar:
:(
Ejemplos
Victoria definitiva en dos movimientos:
[2][1][ ] 1. [2][1][ ]
[2][1][2] -> [2][1][2]
[ ][ ][1] [ ][1][ ]
[2][1][ ] 1. [2][1][ ] [ ][1][ ] 2. [ ][ ][1]
[ ][1][ ] -> [ ][ ][1] -> [2][ ][1] -> [2][ ][1]
[2][2][1] [2][2][1] [2][2][1] [2][2][1]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][ ][2] -> [1][ ][2] -> [1][ ][2] -> [ ][ ][2]
[ ][2][2] [ ][2][2] [2][ ][2] [2][ ][2]
Posible victoria en dos movimientos:
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][2][2] 1. [ ][2][2] [2][ ][2] 2. [1][2][2]
[ ][ ][1] -> [1][ ][1] -> [1][ ][1] -> [1][1][1]
[2][1][ ] [2][1][ ] [2][1][ ] [2][ ][ ]
Imposible ganar en dos movimientos:
[1][ ][ ]
[1][2][2]
[2][ ][1]
Prima
En caso de que sea posible una victoria definitiva y su programa genere los movimientos de una forma hacia el éxito, así como a1:a2
(1 movimiento) o a1:a2,a3:b2
(2 movimientos), puede retirar el 30% de su conteo de bytes.
Este es el código de golf, por lo que la respuesta más corta en bytes gana. Las lagunas estándar no están permitidas.
Gracias a Peter Taylor que solucionó algunos defectos y mejoró la redacción en el Sandbox .
fuente
[1,0,0,2,1,0,2,2,1]
, en , el jugador 2 no puede moverse: ¿es una victoria para el jugador 1?Respuestas:
Haskell,
580564441 bytesAsí de lejos puedo jugar golf por ahora. No estoy seguro si los otros idiomas pueden vencerlo.
Llame
m
a una lista de listas como[[2,1,0],[2,1,2],[0,0,1]]
(Definido A).Código de prueba:
mapM_ m al
devoluciones:fuente
C # -
739663 bytesPrograma completo, lee la entrada de argv y parece funcionar. Ejecútalo como
Si este método de entrada es inaceptable, estaré encantado de cambiarlo (nunca me gusta usar argv).
No estaba dispuesto a publicar esto ayer, porque no he podido jugar mucho golf (no he tenido tanto tiempo y podría estar fuera de práctica), pero como todavía no ha habido una respuesta, yo ' Lo publicaré de todos modos, ciertamente no espero la recompensa, ¡preferiría que fuera para alguien que haya puesto un poco más de esfuerzo antes de publicar!
Editar: reemplacé todos los bools con ints, lo que significaba que podía hacer un mejor uso de Linq, y logré colapsar ambos bucles foreach, lo que generó grandes ahorros. Estoy un poco sorprendido de que el
h
contador funcione ... ++ es una utilidad tan sutil.El programa es muy simple, simplemente explora todos los posibles conjuntos de movimientos (almacena el estado del tablero en una cadena []). Repite todos nuestros movimientos posibles (los tableros que resultan de ellos) y cuenta el número de respuestas de nuestro oponente que podemos vencer con éxito (
G
) (es decir, las que ganamos y él no). También cuenta el número de respuestas posibles (h
) Si podemos ganar alguno, entonces es posible, y sumamos 1 a la suma, si podemos ganarlos a todos, es definitivo, y sumamos 2 a la suma. Por lo tanto, el máximo es nuestro mejor resultado posible, e indexamos en la cadena "(|))" para devolver la cara apropiada. Tenga en cuenta que necesitamos el ")" extra porque la suma puede ser 2 o 3 si es definitivo (es posible que no parezcamos capaces de superar cualquier respuesta que ya haya ganado en el primer intento, por lo que la posible verificación es un poco engañoso).El programa busca una victoria al producir una cadena del tablero, es decir, filas y columnas separadas por espacios, y solo busca una cadena de 3 caracteres del jugador en esta cadena (por ejemplo, "201 201 021 220 002 111" es un gana para nosotros)
Aquí está mi script de prueba:
Que salidas
fuente
PowerShell
576550 bytesNo me detendré tan fácilmente: si no puedo obtener C # por debajo de 631 bytes, ¡tendré que usar un lenguaje diferente! Espero que Leif Willerts elimine 5 bytes de su respuesta, porque he decidido que no soy demasiado aficionado a PowerShell, tal vez solo necesito mirarlo objetivamente en términos de conteos de bytes ...
Este es un script, lo ejecutas
. .\mill.ps1 "201102021"
. Es bastante una copia de mi respuesta de C #, solo en un lenguaje con el que tengo poca experiencia. No he hecho un gran esfuerzo para jugar golf, porque me llevó mucho tiempo trabajar en primera instancia, y ya es bastante compacto.Editar: no podía dejar esas
[Math]::Floor
llamadas allíSi tiene una descripción de cómo funciona ... la respuesta de C # es para usted, pero espero que los comentarios lo aclaren lo suficiente. Los puntos y comas pueden no coincidir perfectamente con el comando de una sola línea, todavía no estoy seguro de dónde se necesitan y no, y no los volví a copiar cuando puse todo en una línea.
Script de prueba (PowerShell):
Salida del mismo:
fuente
Python 3,
566557 bytesTendré que ver si puedo seguir jugando golf, o si puedo obtener el bono del 30%, pero después de muchas dilaciones, aquí está mi respuesta.
Sin golf:
fuente