Matematyka, optymalne zachowanie przypadków testowych, 260 bajtów
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"]]
Ten program można przetestować, wycinając i wklejając powyższy kod do chmury Wolfram . (Testuj jednak szybko: Myślę, że istnieje limit czasowy dla każdego uruchomienia programu.) Zgadnięcia programu wyglądają 2 c
zamiast C2
, ale w przeciwnym razie działają zgodnie z powyższą specyfikacją. Siatka musi być wprowadzana jako uporządkowana para liczb całkowitych itp. {26,100}
, A odpowiedzi na domysły programu muszą być wprowadzane jako ciągi znaków, takie jak "NE"
lub "y"
.
Program śledzi najmniejszy i największy numer wiersza i numeru kolumny, który jest zgodny z dotychczasowymi danymi wejściowymi i zawsze zgaduje punkt środkowy podsiatki możliwości (zaokrąglanie NW). Program jest deterministyczny, więc łatwo jest obliczyć liczbę domysłów, których wymaga średnio na stałej siatce. Na siatce 10x10 program wymaga 1 zgadywania dla pojedynczego kwadratu, 2 zgadywania dla ośmiu kwadratów, 3 zgadywania dla 64 kwadratów i 4 zgadywania dla pozostałych 27 kwadratów, średnio 3,17; i jest to teoretyczne minimum, biorąc pod uwagę, ile sekwencji 1 zgadnij, 2 zgadnij itd. może prowadzić do poprawnych domysłów. Rzeczywiście, program powinien osiągnąć teoretyczne minimum na dowolnej siatce rozmiarów z podobnych powodów. (Na siatce 5x5 średnia liczba domysłów wynosi 2,6.)
Małe wyjaśnienie kodu, chociaż jest całkiem proste, inne niż gra w golfa. (Wymieniłem kolejność niektórych instrukcji inicjujących do celów ekspozycyjnych - bez wpływu na liczbę bajtów).
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"]
]
Linie 1-3 inicjują For
pętlę, która w rzeczywistości jest tylko While
ukrytą pętlą, więc hej, dwa mniej bajtów. Możliwe zakresy numerów wierszy i numerów kolumn w dowolnym momencie są przechowywane {{a, c}, {f, h}}
, a wyśrodkowane zgadywanie w tej podsiatce jest obliczane przez funkcje {b, g}
zdefiniowane w wierszu 2. Wiersz 3 inicjuje maksimum wiersza c
i maksimum kolumny na h
podstawie danych wprowadzonych przez użytkownika, oraz inicjuje również r
zmienną testowaną w pętli, a także kolejne dane wejściowe użytkownika.
Podczas gdy test na linii 4 jest spełniony, linia 5 otrzymuje dane wejściowe od użytkownika, gdzie monit pochodzi z bieżącej domysły {b, g}
( Alphabet[][[b]]]
konwertuje numer wiersza na literę). Następnie linie 6-8 aktualizują podsiatkę możliwości (i domyślnie następną przypuszczenie). Na przykład t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]
(biorąc pod uwagę definicję t
w wierszu 1) rozwija się do
<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>
gdzie można zobaczyć, że numery wierszy min i wierszy są aktualizowane zgodnie z ostatnim wejściem użytkownika. Wiersz 8 konwertuje wszelkie możliwe dane wejściowe na uporządkowaną parę znaków formularza { "N" | "S" | "u", "u" | "W" | "X"}
; tutaj "u"
oznacza prawidłowy wiersz lub kolumnę i "X"
oznacza wschód (tylko po to, Sort
aby ładnie pracować). Kiedy użytkownik w końcu wprowadza dane "y"
, wiersze te generują błąd, ale test pętli kończy się niepowodzeniem, a błąd nigdy nie jest propagowany (program i tak po prostu zatrzymuje się).
A1
a komputer zgadujeB9
, czy to właściwa odpowiedź,NW
czyW
?