자신감있는 숫자
하자 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으로 시작하는 숫자가 인쇄되는 것을 피하면서 동시에을 허용해야 합니다. 이를 위해 다음 루프 에서 조건 을 추가 하여 실패하게 만드는 해킹을 수행 합니다. 이것은 대체하여 완료 로 에있는 오른쪽 동료 에 해당하는, 또는 .s
1
0
i=0
i<n
n
1
n**0**i
n**(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"
에서 시작하는 모든 자리수 1
에 base-1
그 다음 숫자를 계산하고 이러한 기준보다 낮은 동안 우리는 여전히 자신감 수 있습니다. 인쇄하는 동안 다음 자리를 계산합니다. 마지막으로 인쇄합니다 0
.