Mathematica, comportamiento óptimo en casos de prueba, 260 bytes
For[a=f=1;{c,h}=Input@Grid;z=Characters;t=<|Thread[z@#->#2]|>&;r="";v=Floor[+##/2]&;b:=a~v~c;g:=f~v~h,r!="y",r=Input[g Alphabet[][[b]]];{{a,c},{f,h}}={t["NSu",{{a,b-1},{b+1,c},{b,b}}]@#,t["uWX",{{g,g},{f,g-1},{g+1,h}}]@#2}&@@Sort[z@r/.{c_}:>{c,"u"}/."E"->"X"]]
Este programa se puede probar cortando y pegando el código anterior en Wolfram Cloud . (Sin embargo, pruebe rápidamente: creo que hay un límite de tiempo para cada ejecución del programa). Las suposiciones del programa se ven en 2 c
lugar de C2
, pero de lo contrario, se ejecutan de acuerdo con las especificaciones anteriores. La cuadrícula debe ingresarse como un par ordenado de enteros, como {26,100}
, y las respuestas a las conjeturas del programa deben ingresarse como cadenas, como "NE"
o "y"
.
El programa realiza un seguimiento del número de fila y columna más pequeño y más grande que sea consistente con las entradas hasta el momento, y siempre adivina el punto central de la subcuadrícula de posibilidades (redondeando NO). El programa es determinista, por lo que es fácil calcular el número de conjeturas que requiere en promedio en una cuadrícula fija. En una cuadrícula de 10x10, el programa requiere 1 conjetura para un solo cuadrado, 2 conjeturas para ocho cuadrados, 3 conjeturas para 64 cuadrados y 4 conjeturas para los 27 cuadrados restantes, para un promedio de 3.17; y este es el mínimo teórico, dada la cantidad de secuencias de 1 conjetura, 2 conjeturas, etc., que pueden conducir a conjeturas correctas. De hecho, el programa debería alcanzar el mínimo teórico en una cuadrícula de cualquier tamaño por razones similares. (En una cuadrícula de 5x5, el número promedio de conjeturas es 2.6.)
Una pequeña explicación del código, aunque es bastante sencillo aparte del golf. (Intercambié el orden de algunas declaraciones de inicialización con fines de exposición, sin efecto en el recuento de bytes).
1 For[a = f = 1; z = Characters; t = <|Thread[z@# -> #2]|> &;
2 v = Floor[+##/2] &; b := a~v~c; g := f~v~h;
3 r = ""; {c, h} = Input@Grid,
4 r != "y",
5 r = Input[g Alphabet[][[b]]];
6 {{a, c}, {f, h}} = {t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]@#,
7 t["uWX", {{g, g}, {f, g - 1}, {g + 1, h}}]@#2} & @@
8 Sort[z@r /. {c_} :> {c, "u"} /. "E" -> "X"]
]
Las líneas 1-3 inicializan el For
bucle, que en realidad es solo un While
bucle disfrazado, así que bueno, dos bytes menos. Los posibles rangos de número de fila y número de columna en cualquier momento se almacenan {{a, c}, {f, h}}
, y la suposición centrada en esa subcuadrícula se calcula mediante las funciones {b, g}
definidas en la línea 2. La línea 3 inicializa la fila c
máxima y la columna máxima a h
partir de la entrada del usuario, y también inicializa r
cuál es la variable probada en bucle y también las entradas de usuario posteriores.
Mientras se satisface la prueba en la línea 4, la línea 5 recibe información del usuario, donde la solicitud proviene de la suposición actual {b, g}
( Alphabet[][[b]]]
convierte el número de fila en una letra). Luego, las líneas 6-8 actualizan la subcuadrícula de posibilidades (y, por lo tanto, implícitamente, la siguiente suposición). Por ejemplo, t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]
(dada la definición de t
en la línea 1) se expande a
<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>
donde puede ver los números de fila mínima y fila máxima que se actualizan de acuerdo con la última entrada del usuario. La línea 8 convierte cualquier entrada posible en un par ordenado de caracteres del formulario { "N" | "S" | "u", "u" | "W" | "X"}
; aquí "u"
representa una fila o columna correcta, y "X"
significa Este (solo para permitir Sort
que funcione bien). Cuando el usuario finalmente ingresa "y"
, estas líneas arrojan un error, pero luego la prueba de bucle falla y el error nunca se propaga (el programa simplemente se detiene de todos modos).
A1
y la computadora adivinaB9
, ¿es la respuesta adecuadaNW
oW
?