Звичайний N-розрядний комбінований замок складається з N обертових дисків. На кожному диску є цифри 0-9, вписані по порядку, і вам потрібно повернути їх до правильного пароля, щоб відкрити його. Очевидно, якщо ви не знаєте пароль, вам потрібно буде спробувати щонайбільше 10 N разів, перш ніж розблокувати його. Це не цікаво.
Тому давайте розглянемо варіант блокування комбінацій, назвіть його замком, що розкриває відстань.
У кожній невдалій спробі відкрити замок, що виявляє відстань, він відповість мінімальною кількістю рухів, щоб розблокувати.
Один рух визначається як обертання на одну позицію, наприклад, йому потрібно 1 рух від 890до 899, і 9 рухів від 137до 952.
Змагання
Враховуючи відстань, що розкриває відстань, невідомий пароль, спробуйте відкрити блокування мінімальною кількістю спроб (а не рухів), не допускаючи того, що програма занадто тривала.
Правила та відповіді
- Ви повинні написати повну програму, яка вводить з stdin та виводить у stdout. Програма повинна робити введення / вихід таким чином:
Start
Input an integer N (number of digits) from stdin
Do
Output a line containing decimal string of length N (your attempt) to stdout
Input an integer K (response of the lock) from stdin
While K not equal 0
End
Ваша програма повинна працювати з N = 200 і повинна працювати менше 5 секунд на будь-якому вході.
Провідні нулі у виході не слід опускати.
Вони складають 5 тестових даних на кожну довжину, тому загальна кількість тестових даних становить 1000. Тестові дані генеруються випадковим чином.
Підсумковий результат буде (загальна кількість здогадів у всіх тестових даних) * ln (довжина коду в байтах + 50). Виграє найнижчий рахунок. (ln - це природний журнал)
Я наберу програму за вас. Якщо ви хочете знати, як я буду оцінювати вашу програму, або ви хочете оцінити її самостійно, перегляньте попередні зміни в цій публікації .
Цей виклик закінчиться 2017/12/07 14:00 UTC. Я опублікую своє рішення тоді.
Приклад запуску
Рядки, що починаються з >введення, представляють, а інші представляють вихід програми.
Ви можете мати на увазі пароль і взаємодіяти зі своєю програмою, щоб перевірити його.
> 3 # 3-digit lock. The hidden password is 746
000 # 1st guess (by program)
> 11 # response to the 1st guess
555 # 2nd guess
> 4 # ...
755
> 2
735
> 2
744
> 2
746 # finally the correct answer! The program attempts 6 times.
> 0 # this is not necessary
Зразок програми
EDIT: Можливо, формат вводу / виводу вище не був зрозумілий. Ось зразок програми в Python.
Python, 369 байт, загальна кількість спроб = 1005973, оцінка = 6073935
import sys
N = int(input()) # get the lock size
ans = ''
for i in range(N): # for each digit
lst = []
for j in range(10): # try all numbers
print('0' * i + str(j) + '0' * (N - i - 1)) # make a guess
result = int(input()) # receive the response
lst.append(result)
ans += str(lst.index(min(lst)))
print(ans) # output the final answer
Дякую Джоні за спрощення виклику.

162751*ln(388+50)=989887.