Доверенные номера
Позвольте x
быть целое число произвольной базы, такой, что D
является массивом его цифр. x
является доверенным числом, если для всех n
между 1
и длиной D
:
D[n+1] = D[n] + D[n-1] + ... + D[1] + n
Возьмем, например, число 349
в базе 10. Если мы помечаем индексы для этого числа, мы имеем следующее.
Index Digit
----- -----
1 3
2 4
3 9
Начиная с первой цифры, мы 1 + 3 = 4
получаем следующую цифру. Затем со второй цифрой у нас 3 + 4 + 2 = 9
, что, опять же, возвращает следующую цифру. Таким образом, этот номер является доверенным числом.
Получив целое число с базой от 1 до 62, вычислите все числа доверенных лиц для этой базы и выведите список из них, разделенных символами новой строки. Вы можете предположить, что для данной базы существует определенное количество номеров доверенных лиц.
Для цифр больше 9 используйте буквы альфа A-Z
, а для цифр больше букв Z
альфа a-z
. Вам не придется беспокоиться о цифрах за пределами z
.
Они не должны выводиться в каком-либо конкретном порядке.
Пример ввода:
16
Пример вывода:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
23
34
45
56
67
78
89
9A
AB
BC
CD
DE
EF
125
237
349
45B
56D
67F
125B
237F
Это код гольф, поэтому выигрывает самый короткий код. Удачи!
(Спасибо Заку за помощь в форматировании и за несколько проблем.)
CD
нет в списке? Поскольку в списке перечислены все другие комбинации, в которых вторая цифра на одну единицу больше первой, я не понимаю, почемуCD
это не так.Ответы:
Pyth, 38 байт
Попробуйте онлайн: демонстрация
Объяснение:
источник
Python 2, 104 байта
При этом используется следующее наблюдение: в доверенном числе следует цифра
i
, за2*i+1
исключением того, чтоi+1
вместо нее используется вторая цифра. Используя все возможные первые цифры и добавляя новые, пока они не станут слишком большими, мы можем сгенерировать все числа доверенных лиц.Мы вычисляем символ, соответствующий числу
i
какchr(48+i+(i>9)*7+i/36*6)
, который сдвигает его в число, заглавную букву или диапазон заглавных букв для интервалов0-9, 10-35, 36-61
.Затем мы увеличиваем
i
черезi+=i+1
две корректировки. Чтобы сделать это вместоi+=1
первой цифры, мы добавляемi
условноs
наличие более чем1
символов. Кроме того, мы должны избегать печатания чисел, начинающихся с 0, и в то же время позволяющих0
. Для этого мы делаем хак, который приводитi=0
к сбою условияi<n
в следующем цикле, добавляяn
к нему. Это делается путем замены на то,1
сn**0**i
каким право ассоциируетсяn**(0**i)
, которое равноn**(i==0)
илиn if i==0 else 1
.источник
Python 3,
201200 байтобъяснение
Ключевым моментом здесь является то, что при заданной последовательности
x
(например, скажем[1,2,5]
) вы можете получить следующий член в последовательностиsum(x)+len(x)
, который дает11
в этом случае (B
). Проверьте, не меньшеn
ли это, и добавьте расширенную последовательность в список всех таких последовательностей (отмеченных всеми однозначными числами).Вот как я отображаю элементы последовательности в символы. Они
''.join
редактируются вместе, а затем печатаются через пробел.источник
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))
. Кроме того, в настоящее время это 201 байт; не 200.GS2, 44 байта
Это производит числа в другом порядке, но описание проблемы не определяет, таким образом я иду на это! Вот вывод для ввода 16.
Вот мнемонические эквиваленты для байтов:
источник
CJam,
464240 байтПопробуйте онлайн в интерпретаторе CJam .
Как это устроено
В конце 0 и несколько пустых массивов остаются в стеке, поэтому интерпретатор печатает
0
.источник
gawk, 111 байт
Для каждой исходной цифры от
1
доbase-1
вычисляет следующие цифры, и в то время как они ниже , чем основание у нас еще есть доверенное лицо номера. Вычисление следующей цифры во время печати. Наконец печатает0
.источник