자신감있는 숫자 349밑이 10 인 숫자를 생각해보십시오 .이 숫자의

자신감있는 숫자

하자 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 사이 인 정수가 주어지면 해당 염기에 대한 모든 Confidant Numbers를 계산하고 그 목록을 개행으로 구분하여 출력하십시오. 주어진 기준에 대해 유한 한 양의 신뢰 번호가 있다고 가정 할 수 있습니다.

숫자가 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

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다. 행운을 빕니다!

(서식에 도움을주고 몇 가지 문제를 지적 해 준 Zach에게 감사합니다.)



답변

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

답변

파이썬 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조건을 추가 합니다 . 또한 0으로 시작하는 숫자가 인쇄되는 것을 피하면서 동시에을 허용해야 합니다. 이를 위해 다음 루프 에서 조건 을 추가 하여 실패하게 만드는 해킹을 수행 합니다. 이것은 대체하여 완료 로 에있는 오른쪽 동료 에 해당하는, 또는 .s10i=0i<nn1n**0**in**(0**i)n**(i==0)n if i==0 else 1


답변

파이썬 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연결된 다음 줄 바꿈으로 구분되어 인쇄됩니다.


답변

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

답변

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.


답변

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"

에서 시작하는 모든 자리수 1base-1그 다음 숫자를 계산하고 이러한 기준보다 낮은 동안 우리는 여전히 자신감 수 있습니다. 인쇄하는 동안 다음 자리를 계산합니다. 마지막으로 인쇄합니다 0.