- 22, Oct 2024
- #1
Обычный N-значный кодовый замок состоит из N вращающихся дисков. На каждом диске по порядку вписаны цифры 0-9, и вам нужно повернуть их на правильный пароль, чтобы открыть его. Очевидно, что если вы не знаете пароль, вам нужно будет попробовать максимум 10Н раз, прежде чем разблокировать его. Это не интересно.
Итак, рассмотрим вариант кодового замка, назовем его замком раскрытия расстояния.
При каждой неудачной попытке открыть замок, показывающий расстояние, он реагирует на минимальное количество движений для разблокировки.
Одно движение определяется как поворот на одну позицию, например требуется 1 движение из
toimport 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
> 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
, и 9 движений из >
to 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
.
Вызов
Учитывая замок, открывающий расстояние, пароль которого неизвестен, постарайтесь открыть замок с минимальным количеством попытки (не движения), сохраняя при этом программу не слишком длинной.
Правила и подсчет очков
- Вам следует написать полную программу, которая вводит данные со стандартного ввода и выводит на стандартный вывод. Программа должна выполнять ввод/вывод следующим образом:
952
Ваша программа должна обрабатывать до N = 200 и должна выполняться менее 5 секунд на любом вводе.
Ведущие нули в выводе не следует опускать.
Для каждой длины имеется по 5 тестовых данных, поэтому общее количество тестовых данных равно 1000. Тестовые данные генерируются случайным образом.
Окончательный результат будет равен (общее количество догадок во всех тестовых данных) * ln (длина кода в байтах + 50). Побеждает наименьший результат. (ln – натуральный журнал)
Я запишу для вас программу. Если вы хотите знать, как я буду оценивать вашу программу, или вы хотите оценить ее самостоятельно, посмотрите предыдущие правки в этом посте.
Это испытание завершится 7 декабря 2017 г. в 14:00 UTC. Тогда я опубликую свое решение.
Запуск примера
Строки, начинающиеся с 137
represent input, and others represent program output.
Вы можете запомнить пароль и взаимодействовать со своей программой, чтобы проверить его.
899
Пример программы
РЕДАКТИРОВАТЬ: Возможно, указанный выше формат ввода/вывода был неясен. Вот пример программы на Python.
Python, 369 байт, общее количество попыток = 1005973, балл = 6073935
890
Благодаря Иона для упрощения задачи.
#code-challenge #атомный-код-гольф