Mathematica, optimales Verhalten in Testfällen, 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"]]
Dieses Programm kann getestet werden, indem Sie den obigen Code ausschneiden und in die Wolfram Cloud einfügen . (Testen Sie es jedoch schnell: Ich glaube, es gibt eine zeitliche Begrenzung für jeden Programmlauf.) Die Vermutungen 2 c
des Programms sehen wie folgt aus C2
, ansonsten wird es gemäß der obigen Spezifikation ausgeführt. Das Gitter muss als geordnetes Ganzzahlpaar eingegeben werden {26,100}
, und die Antworten auf die Vermutungen des Programms müssen als Zeichenfolgen eingegeben werden, z. B. "NE"
oder "y"
.
Das Programm verfolgt die kleinste und größte Zeilennummer und Spaltennummer, die mit den bisherigen Eingaben übereinstimmt, und schätzt immer den Mittelpunkt des Teilgitters der Möglichkeiten (Rundung NW). Das Programm ist deterministisch, so dass es einfach ist, die Anzahl der erforderlichen Vermutungen im Durchschnitt über ein festes Raster zu berechnen. In einem 10x10-Raster erfordert das Programm 1 Vermutung für ein einzelnes Quadrat, 2 Vermutungen für acht Quadrate, 3 Vermutungen für 64 Quadrate und 4 Vermutungen für die verbleibenden 27 Quadrate mit einem Durchschnitt von 3,17. und dies ist das theoretische Minimum, wenn man bedenkt, wie viele Folgen von 1, 2 usw. zu korrekten Vermutungen führen können. In der Tat sollte das Programm aus ähnlichen Gründen das theoretische Minimum in einem Raster beliebiger Größe erreichen. (In einem 5x5-Raster beträgt die durchschnittliche Anzahl von Vermutungen 2,6.)
Eine kleine Erklärung des Codes, obwohl es ziemlich einfach ist, abgesehen von der Golffreundlichkeit. (Ich habe die Reihenfolge einiger Initialisierungsanweisungen für Expository-Zwecke vertauscht - keine Auswirkung auf die Byteanzahl.)
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"]
]
Die Zeilen 1-3 initialisieren die For
Schleife, die eigentlich nur eine While
verschleierte Schleife ist, also zwei Bytes weniger. Die möglichen Reihennummern- und Spaltennummernbereiche werden zu jedem Zeitpunkt in gespeichert {{a, c}, {f, h}}
, und die zentrierte Schätzung in diesem Teilgitter wird durch die {b, g}
in Zeile 2 definierten Funktionen berechnet . Zeile 3 initialisiert die maximale Reihe c
und die maximale Spalte h
aus Benutzereingaben und initialisiert auch r
die schleifengetestete Variable und die nachfolgenden Benutzereingaben.
Während der Test in Zeile 4 erfüllt ist, wird Zeile 5 vom Benutzer eingegeben, wobei die Eingabeaufforderung aus der aktuellen Schätzung stammt {b, g}
( Alphabet[][[b]]]
konvertiert die Zeilennummer in einen Buchstaben). Dann aktualisieren die Zeilen 6-8 das Teilgitter der Möglichkeiten (und damit implizit die nächste Vermutung). Beispielsweise wird t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]
(in der Definition von t
Zeile 1) auf erweitert
<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>
Hier können Sie sehen, wie die Min-Row- und Max-Row-Nummern gemäß der letzten Eingabe des Benutzers aktualisiert werden. Zeile 8 konvertiert jede mögliche Eingabe in ein geordnetes Zeichenpaar des Formulars { "N" | "S" | "u", "u" | "W" | "X"}
. Hier "u"
steht für eine richtige Zeile oder Spalte, und "X"
steht für Osten (nur um Sort
gut arbeiten zu können). Wenn der Benutzer schließlich eingibt "y"
, geben diese Zeilen einen Fehler aus, aber dann schlägt der Schleifentest fehl und der Fehler wird nie weitergegeben (das Programm hält einfach trotzdem an).
A1
und der Computer schätztB9
, ist die richtige AntwortNW
oderW
?