Звичайний 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
.