Der Benutzer versteckt sich und der Computer versucht, sie zu finden.
Zunächst nimmt das Programm eine Eingabe für die Größe des Rasters vor. Wie 5x5, 10x10, 15x15 usw. Das Gitter wird nicht immer ein perfektes Quadrat sein.
Das Gitter ist wie ein Schachbrett:
_______________________________
| | | | | |
| A1 | | | | | A
|_____|_____|_____|_____|_____|
| | | | | |
| | B2 | | | | B
|_____|_____|_____|_____|_____|
| | | | | |
| | | C3 | | | C
|_____|_____|_____|_____|_____|
| | | | | |
| | | | D4 | | D
|_____|_____|_____|_____|_____|
| | | | | |
| | | | | E5 | E
|_____|_____|_____|_____|_____|
1 2 3 4 5
Jetzt wählt der Benutzer ein Quadrat aus, z. B. B2
(ohne es dem Computer mitzuteilen).
Der Computer beginnt, Quadrate zu erraten. Wenn es das richtige Quadrat auswählt, antwortet der Benutzer mit y
. Wenn nicht, geben sie die Richtung ein, in die sich ihr Plättchen befindet (N, NE, E, SE, S, SW, W).
Also, wenn der Benutzer auswählt B2
und der Computer errät C3
, würde der Benutzer Eingaben machen NW
.
Hier ist ein Beispiel für die Ausgänge und Eingänge:
Grid?
5x5
C3?
NW
C2?
N
B2?
y
Wertung:
Dies wird etwas anders gewertet als eine normale Herausforderung.
Der Gewinner ist das Programm, das (im Durchschnitt) die geringste Anzahl von Raten benötigt, um das richtige Quadrat zu erraten. Die Testfälle, die gemittelt werden sollen, sind alle möglichen Quadrate in einem 5x5 und dann in einem 10x10.
Es muss jedoch auch mit jedem Rastermuster mit bis zu 26 Zeilen (dh 5x8, 6x2, 20x5 usw.) funktionieren.
Bitte geben Sie eine Möglichkeit zum Testen an, z. B. eine JSFiddle.
Und im Falle eines Unentschieden gewinnt das kürzeste Programm.
quelle
A1
und der Computer schätztB9
, ist die richtige AntwortNW
oderW
?Antworten:
Python 3.6 ,
466398392 Bytes, MinimaxDie Ein- und Ausgabe sollte in der im Beispiel gezeigten Form erfolgen. Dies findet das Quadrat mit dem minimalen "Aufteilungsfaktor" - das ist der größte verbleibende Bereich, der sich aus der Antwort des Spielers ergeben kann (dh NW, E, y usw.) - und errät dies. Ja, das ist immer die Mitte des verbleibenden Bereichs in diesem Spiel, aber diese Technik zur Minimierung des Worst-Case wird allgemeiner in ähnlichen Spielen mit unterschiedlichen Regeln funktionieren.
Unlesbare Version:
quelle
Mathematica, optimales Verhalten in Testfällen, 260 Bytes
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 ausC2
, 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.)
Die Zeilen 1-3 initialisieren die
For
Schleife, die eigentlich nur eineWhile
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 Reihec
und die maximale Spalteh
aus Benutzereingaben und initialisiert auchr
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 wirdt["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]
(in der Definition vont
Zeile 1) auf erweitertHier 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 umSort
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).quelle
Batch, Teilen und Erobern
Erstellt den Begrenzungsrahmen für den Bereich, der noch durchsucht werden muss. Die nächste Vermutung ist immer die Mitte der Box. Für die Kompasspunkte, die nicht in der Antwort enthalten sind, wird das Kästchen in diese Richtung verkleinert. Zum Beispiel werden für eine Antwort von
N
der linken, rechten und unteren Seite des Kästchens das erratene Quadrat festgelegt.Bei 369 Bytes erwarte ich nicht, jemanden zu schlagen, also habe ich die Leerzeichen für die Lesbarkeit belassen.
quelle