Mathematica, оптимальное поведение в тестовых случаях, 260 байт
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"]]
Эта программа может быть протестирована путем вырезания и вставки вышеуказанного кода в Wolfram Cloud . (Протестируйте быстро, хотя: я думаю, что для каждого запуска программы существует ограничение по времени.) Предположения программы выглядят 2 c
вместо C2
, но в остальном она выполняется в соответствии со спецификацией выше. Сетка должна быть введена как упорядоченная пара целых чисел, как {26,100}
, и ответы на догадки программы должны быть введены как строки, как "NE"
или "y"
.
Программа отслеживает наименьший и наибольший номер строки и номера столбца, который соответствует входным данным, и всегда угадывает центральную точку подсетки возможностей (округление NW). Программа является детерминированной, поэтому легко вычислить количество угадываний, которое требуется в среднем по фиксированной сетке. В сетке 10x10 программа требует 1 предположение для одного квадрата, 2 догадки для восьми квадратов, 3 догадки для 64 квадратов и 4 догадки для оставшихся 27 квадратов, в среднем 3,17; и это теоретический минимум, учитывая, сколько последовательностей 1-угадывание, 2-угадывание и т. д. может привести к правильным предположениям. Действительно, программа должна достичь теоретического минимума на сетке любого размера по аналогичным причинам. (На сетке 5x5 среднее количество догадок составляет 2,6.)
Небольшое объяснение кода, хотя это довольно просто, кроме игры в гольф. (Я изменил порядок некоторых инициализирующих операторов для пояснительных целей - не влияет на количество байтов.)
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"]
]
Строки 1-3 инициализируют For
цикл, который на самом деле является просто While
замаскированным циклом, так что, эй, на два байта меньше. Возможные диапазоны номеров строк и номеров столбцов в любой момент сохраняются {{a, c}, {f, h}}
, и центрированное предположение в этой подсетке вычисляется функциями, {b, g}
определенными в строке 2. Строка 3 инициализирует c
столбец max-row и max-столбец h
из пользовательского ввода, и также инициализирует, r
которая является проверенной петлей переменной, а также последующие пользовательские вводы.
В то время как тест в строке 4 выполнен, строка 5 получает ввод от пользователя, где подсказка приходит из текущего предположения {b, g}
( Alphabet[][[b]]]
преобразует номер строки в букву). Затем строки 6-8 обновляют подсеть возможностей (и, следовательно, неявно следующее предположение). Например, t["NSu", {{a, b - 1}, {b + 1, c}, {b, b}}]
(учитывая определение в t
строке 1) расширяется до
<| "N" -> {a, b - 1}, "S" -> {b + 1, c}, "u" -> {b, b}|>
где вы можете видеть, как номера мин и рядов обновляются в соответствии с последним вводом пользователя. Строка 8 преобразует любой возможный ввод в упорядоченную пару символов в форме { "N" | "S" | "u", "u" | "W" | "X"}
; здесь "u"
обозначает правильный ряд или столбец и "X"
обозначает восток (просто, Sort
чтобы работать хорошо). Когда пользователь, наконец, вводит данные "y"
, эти строки выдают ошибку, но затем проверка цикла завершается неудачей, и ошибка никогда не распространяется (программа все равно просто останавливается).
A1
и компьютер догадываетсяB9
, правильный ответNW
илиW
?