Mathematica, comportamento ottimale su casi di test, 260 byte
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"]]
Questo programma può essere testato tagliando e incollando il codice sopra nel Wolfram Cloud . (Prova rapidamente, però: penso che ci sia un limite di tempo per ogni programma eseguito.) Le ipotesi del programma sembrano 2 cinvece di C2, ma altrimenti funziona secondo le specifiche sopra. La griglia deve essere inserita come una coppia ordinata di numeri interi, come {26,100}, e le risposte alle ipotesi del programma devono essere inserite come stringhe, come "NE"o "y".
Il programma tiene traccia del numero di riga e del numero di colonna più piccolo e più grande che è coerente con gli input finora e indovina sempre il punto centrale della griglia secondaria delle possibilità (arrotondamento NW). Il programma è deterministico, quindi è facile calcolare il numero di ipotesi che richiede in media su una griglia fissa. Su una griglia 10x10, il programma richiede 1 ipotesi per un singolo quadrato, 2 ipotesi per otto quadrati, 3 ipotesi per 64 quadrati e 4 ipotesi per i restanti 27 quadrati, per una media di 3,17; e questo è il minimo teorico, dato quante sequenze 1-ipotesi, 2-ipotesi, ecc. possono portare a ipotesi corrette. In effetti, il programma dovrebbe raggiungere il minimo teorico su qualsiasi griglia di dimensioni per ragioni simili. (Su una griglia 5x5, il numero medio di ipotesi è 2.6.)
Una piccola spiegazione del codice, anche se è abbastanza semplice oltre al golf. (Ho scambiato l'ordine di alcune istruzioni di inizializzazione a fini espositivi - nessun effetto sul conteggio dei byte.)
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"]
]
Le righe 1-3 inizializzano il Forloop, che in realtà è solo un Whileloop sotto mentite spoglie, quindi ehi, due byte in meno. I possibili intervalli di numeri di riga e numeri di colonna in qualsiasi momento vengono archiviati in {{a, c}, {f, h}}, e l'ipotesi centrata in quella sottogriglia viene calcolata dalle funzioni {b, g}definite nella riga 2. La riga 3 inizializza la riga cmassima e la colonna massima hdall'input dell'utente e inizializza anche rqual è la variabile testata in loop e anche i successivi input dell'utente.
Mentre il test sulla riga 4 è soddisfatto, la riga 5 riceve input dall'utente, in cui il prompt proviene dall'ipotesi corrente {b, g}( Alphabet[][[b]]]converte il numero di riga in una lettera). Quindi le righe 6-8 aggiornano la sottogriglia delle possibilità (e quindi implicitamente la prossima ipotesi). Ad esempio, t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}](data la definizione della triga 1) si espande in
<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>
dove puoi vedere i numeri di riga minima e massima aggiornati in base all'ultimo input dell'utente. La riga 8 converte qualsiasi possibile input in una coppia ordinata di caratteri del modulo { "N" | "S" | "u", "u" | "W" | "X"}; qui "u"sta per una riga o colonna corretta e "X"sta per est (solo per consentire Sortdi lavorare bene). Quando l'utente inserisce finalmente "y", queste righe generano un errore, ma poi il loop test fallisce e l'errore non viene mai propagato (il programma si ferma comunque).
A1e il computer indovinaB9, è la risposta correttaNWoW?