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 c
invece 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 For
loop, che in realtà è solo un While
loop 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 c
massima e la colonna massima h
dall'input dell'utente e inizializza anche r
qual è 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 t
riga 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 Sort
di 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).
A1
e il computer indovinaB9
, è la risposta correttaNW
oW
?