Математика, оптимальна поведінка в тестових випадках, 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 . (Проте тестуйте швидко: я думаю, що для кожного запуску програми існує обмеження часу.) Припущення програми виглядають як 2 c
замість цього C2
, але в іншому випадку воно працює відповідно до наведених вище специфікацій. Сітка повинна бути введена як упорядкована пара цілих чисел, наприклад {26,100}
, а відповіді на здогадки програми повинні бути введені у вигляді рядків, як "NE"
або "y"
.
Програма відслідковує найменший і найбільший номер рядка та номер стовпця, який відповідає вхідним досі, і завжди вгадує центральну точку підрешітки можливостей (округлення NW). Програма є детермінованою, тому легко обчислити кількість здогадок, які вона вимагає в середньому за фіксованою сіткою. На сітці 10х10 програма вимагає 1 здогадки для одного квадрата, 2 здогадів на вісім квадратів, 3 здогадів на 64 квадрати та 4 здогадів на інші 27 квадратів, в середньому 3,17; і це теоретичний мінімум, враховуючи, скільки послідовностей з 1 догадкою, 2 здогадок тощо може призвести до правильних здогадів. Дійсно, програма повинна досягти теоретичного мінімуму на будь-якій розмірній сітці з аналогічних причин. (На сітці 5х5 середня кількість здогадок становить 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
та максимальний стовпець 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
?