Довірені номери


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

Перехід стовпчиком виявляє інший (можливо) корисний зразок;)
Геобіт

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.