Обычный 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). Самый низкий балл побеждает. (натуральный бревно)
Я оценю программу для вас. Если вы хотите знать, как я буду оценивать вашу программу, или вы хотите оценить ее самостоятельно, посмотрите предыдущие изменения в этом посте .
Это испытание закончится в 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
Пример программы
РЕДАКТИРОВАТЬ: Может быть, формат ввода / вывода выше не было ясно. Вот пример программы на 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
.