Доверенные номера


14

Доверенные номера

Позвольте 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

Это код гольф, поэтому выигрывает самый короткий код. Удачи!

(Спасибо Заку за помощь в форматировании и за несколько проблем.)


Извините, небольшая путаница между мной и Заком по этому вопросу. Все должно быть отформатировано прямо сейчас.
спагетто

Полезное наблюдение: в числе доверенных лиц каждая цифра равна одной плюс двойная по сравнению с предыдущей цифрой, за исключением того, что вторая цифра вместо нее равна одной плюс первая цифра.
xnor

Переход по столбцам показывает еще один (возможно) полезный паттерн;)
Geobits

1
В примере почему CDнет в списке? Поскольку в списке перечислены все другие комбинации, в которых вторая цифра на одну единицу больше первой, я не понимаю, почему CDэто не так.
Рето Коради

Это был несчастный случай: P Исправлено, спасибо за указание на это.
спагетто

Ответы:


2

Pyth, 38 байт

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ

Попробуйте онлайн: демонстрация

Объяснение:

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ  implicit: Q = input base
0                                       print 0
                       m            SQ  map each d of [1, 2, ..., Q] to:
                        .u       Q]d      start with N=[d], apply v Q times
                          +N+lNsN           add (len(N) + sum(N)) to N
                                          gives all intermediate results
                      s                 join to one list of candidates
                 f<eTQ                  filter those, where every digit < Q
  ms@L+s`MT+rG1Gd                       convert numbers to letters 0-9A-Za-z
 j                                      print each on separate line

9

Python 2, 104 байта

n=input()
for i in range(n):
 s=''
 while i<n:s+=chr(48+i+(i>9)*7+i/36*6);print s;i+=n**0**i+i*(s>s[:1])

При этом используется следующее наблюдение: в доверенном числе следует цифра 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! Хм. Интересно, сколько байтов я могу сэкономить, если использую некоторые из ваших трюков ...
El'endia Starman

4

Python 3, 201 200 байт

n=int(input())
X=[[i]for i in range(1,n)]
for x in X:
 y=sum(x)+len(x)
 if y<n:X.append(x+[y])
X=[[0]]+X
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))

объяснение

Ключевым моментом здесь является то, что при заданной последовательности x(например, скажем [1,2,5]) вы можете получить следующий член в последовательности sum(x)+len(x), который дает 11в этом случае ( B). Проверьте, не меньше nли это, и добавьте расширенную последовательность в список всех таких последовательностей (отмеченных всеми однозначными числами).

[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)]

Вот как я отображаю элементы последовательности в символы. Они ''.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.
Зак Гейтс

@ZachGates: я думал об этом, но не понимал, что могу опустить скобки. Благодарность!
El'endia Starman

4

GS2, 44 байта

26 c8 2f 08 4d 08 40 64 45 2e 30 42 67 40 24 d0
75 d3 20 e1 35 09 cb 20 23 78 22 09 34 30 e0 32
08 86 84 30 85 30 92 58 09 34 10

Это производит числа в другом порядке, но описание проблемы не определяет, таким образом я иду на это! Вот вывод для ввода 16.

1
12
125
125B
2
23
237
237F
3
34
349
4
45
45B
5
56
56D
6
67
67F
7
78
8
89
9
9A
A
AB
B
BC
C
CD
D
DE
E
EF
F
0

Вот мнемонические эквиваленты для байтов:

read-num dec save-a
range1
{
    itemize
    {
        dup 
        sum
        over length
        add

        swap right-cons

        dup last push-a le

            push-d eval
        block2 when
    }
    save-d eval
    init inits tail
} map

+ ' fold 

{
    ascii-digits
    uppercase-alphabet catenate
    lowercase-alphabet catenate
    select 
    show-line
} map

0

О, чувак, это потрясающе. Я пытался выучить GS2, но у меня было очень тяжелое время: P
спагетто

3

CJam, 46 42 40 байт

ri:R,{Q{+_A,s'[,_el^+f=oNo__,+:+_R<}g&}*

Попробуйте онлайн в интерпретаторе CJam .

Как это устроено

ri:R            e# Read an integer from STDIN and save it in R.
,               e# Push [0 ... R-1].
{               e# Fold; For each element but the first:
                e#   Push the element.
  Q             e#   Push an empty array (accumulator for base-R digits).
  {             e#   Do:
    +           e#     Concatenate the integer and the array on the stack.
    _           e#     Push a copy of the result.
    A,s'[,_el^+ e#     Push "0...0A...Za...z".
                e#     See: http://codegolf.stackexchange.com/a/54348
    f=          e#     Replace each base-R digit with the corresponding character.
    oNo         e#     Print the resulting string and a linefeed.
    _           e#     Push another copy of the accumulator.
    _,+         e#     Append its length to it.
    :+          e#     Add all digits (including the length).
    _R<         e#     Push a copy of the result and compare it with R.
  }g            e#   If the sum is less than R, it is a valid base-R digit,
                e#   the comparison pushes 1, and the loop is repeated.
  &             e#   Intersect the accumulator with an integer that is greater
                e#   or equal to R. This pushes an empty array.
}*              e#

В конце 0 и несколько пустых массивов остаются в стеке, поэтому интерпретатор печатает 0.


1

gawk, 111 байт

{for(n=$0;n>c=++i;)for(j=0;n>$++j=c+=j;print"")for(c=k=0;k++<j;c+=$k)printf"%c",$k+($k>9?$k>35?61:55:48)}$0="0"

Для каждой исходной цифры от 1до base-1вычисляет следующие цифры, и в то время как они ниже , чем основание у нас еще есть доверенное лицо номера. Вычисление следующей цифры во время печати. Наконец печатает 0.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.