숫자 길이 m의 n 번째 자리 값 (오른쪽에서 왼쪽으로 계산)에서 가장 큰 숫자가 항상 m-n + 1 인 숫자 시스템을 만들 수 있습니다.이 시스템에서 표현할 수있는 가장 큰 5 자리 숫자를 예 제한되는 특정 장소에서 사용할 수있는 자릿수 외에 다른 모든 증분이 표준입니다. 즉, 숫자가 자릿수 제한을 초과하면 다음 자릿수에 하나를 추가합니다.
이 시스템에서 카운팅을 나타내는 방법은 다음과 같습니다.
1; 10; 11; 12; 100; 101; 102; 103; 110; 111; 112; 113; 120; 121; 122; 123; 1000; 1001 ...
당신의 임무는 표준 10 진수를 취해서 그것을 내 넘버링 시스템으로 변환하는 함수를 작성하는 것입니다.
코드가 짧을수록 좋습니다. 본 기회!
** 9 이후에 숫자가 필요한 경우 문자를 사용하도록 선택하거나 목록의 요소로 2 자리 숫자를 반환 할 수 있습니다.
테스트 사례
10 -> 111
20 -> 1003
30 -> 1023
50 -> 1123
100 -> 10035
23116 -> 1234567
21977356 -> 123456789A
마지막 사례는 구현 방법에 따라 실행 속도가 매우 느릴 수 있습니다. 너무 오래 걸리거나 너무 많은 메모리를 사용하는 경우 실행할 필요가 없습니다. 그러나 메모리를 적게 사용하고 빠르게 실행하는 방법이 있습니다.
답변
Mathematica, 64 바이트
Part[Join@@Array[Tuples@Join[{{1}},Array[Range,#-1,3]-1]&,#],#]&
명명되지 않은 함수는 양의 정수 인수를 취하고 정수 목록을 리턴합니다.
Join[{{1}},Array[Range,#-1,3]-1]
중첩 된 목록을 반환합니다 { {1}, {0,1,2}, {0,1,2,3}, ..., {0,1,...,#} }
. 그런 다음 Tuples
첫 번째 요소가있는 {1}
, 두 번째 요소가 있는 등 모든 튜플의 (정렬 된) 세트를 반환합니다 {0,1,2}
. 이들은입니다 #
이 번호 체계에 -digit 번호. Join@@Array[...,#]
이 번호 시스템에서 최대 #
자릿수를 가진 모든 숫자의 배열을 반환하고 해당 숫자를 Part[...,#]
추출합니다 #
.
절망적으로 느립니다! 최대 9까지의 입력에서 정상적으로 작동합니다. 더 큰 입력의 경우 끝 ,#],#]&
을 ,Ceiling[0.9Log[#]]],#]&
; 이것은 우리가 원하는 숫자를 찾기 위해 숫자 체계에서 충분히 멀리 가기 위해 필요한 자릿수를보다 사실적으로 제한합니다.
답변
수학, 93 바이트
Nest[#/.{x___,y_}:>{x,y+1}//.x:{y___,z_:0,w_,v___}/;w>Tr[1^x]-Tr[1^{v}]:>{y,z+1,0,v}&,{0},#]&
첫 번째 인수를 가진 순수한 기능 #
. 음수가 아닌 정수가 제공되면 올바른 자릿수 목록을 출력합니다 ( 0
정확하게 처리하더라도 !).
설명
Nest[f,expr,n]
적용한 결과 제공 f
에 expr
n
시간을. 이 경우, expr
목록 {0}
이며 n
입력 정수 #
입니다. 이 기능 f
은 복잡합니다 :
# (* Starting with the input # *)
/. (* Apply the following rule *)
{x___,y_} (* If you see a list of the form {x___,y} *)
:> (* replace it with *)
{x,y+1} (* this *)
//. (* Now apply the following rule repeatedly until nothing changes *)
x:{y___,z_:0,w_,v___} (* If you see a list x starting with a sequence y of 0 or more elements,
followed by an optional element z (default value of 0),
followed by an element w,
followed by a sequence v of 0 or more elements *)
/; (* such that *)
w>Tr[1^x]-Tr[1^{v}] (* w is greater than the length of x minus the length of {v} *)
:> (* replace it with *)
{y,z+1,0,v}& (* this *)
답변
펄 6 , 38 바이트
{map({|[X] 1,|map ^*,3..$_},1..*)[$_]}
양의 정수를 가져 와서 숫자를 나타내는 정수 목록을 출력합니다.
설명:
{ } # a lambda
map({ },1..*) # for each number length from 0 to infinity,
# offset by 1 to avoid a +1 in next step...
1,|map ^*,3..$_ # generate the digit ranges, e.g.:
# length 0 -> (1) # bogus, but irrelevant
# length 1 -> (1)
# length 2 -> (1, 0..2)
# length 3 -> (1, 0..2, 0..3)
# length 4 -> (1, 0..2, 0..3, 0..4)
[X] # take the cartesian product
| # slip the results into the outer sequence
[$_] # Index the sequence generated this way
답변
답변
하스켈, 65 바이트
i(x:r)|x>length r=0:i r|1<2=1+x:r
i[]=[1]
reverse.(iterate i[]!!)
i
숫자 체계에서 숫자를 역순으로 증가시킵니다. iterate
로 시작하는 0으로 시작하는 모든 숫자의 무한 목록을 만듭니다 []
. 그런 다음해야 할 일은 필요한 !!
숫자와 숫자를 취하는 reverse
것입니다.
마지막 행은 함수 정의가 아니라 함수이므로 소스 코드 파일에있는 것처럼 표시 할 수 없습니다. 대신 소스 코드에 다른 행만 넣고 인터프리터에서 마지막 행을 사용하십시오 (또는 f=
마지막 행 앞에 추가하여 함수를 이름에 바인딩하십시오 ).
사용 예 :
*Main> reverse.(iterate i[]!!) $ 100
[1,0,0,3,5]
( [5,3,0,0,1]
결과가 허용 된 경우 8 바이트를 저장할 수 있습니다 .)
답변
하스켈, 49 바이트
x=[1]:[n++[d]|n<-x,d<-[0..length n+1]]
(x!!).pred
첫 번째 줄은 보조 정의이고 두 번째 줄은 함수로 평가됩니다. 정수를 취하고 정수 목록을 리턴합니다.
온라인으로 사용해보십시오!
설명
나는 x
챌린지 텍스트에 언급 된 무한한 표현 목록으로 정의 합니다. main 함수는 인수와 인덱스를로 줄 x
입니다. 첫 번째 줄은 다음과 같이 작동합니다.
x= -- The list of lists x contains
[1]: -- the list [1], followed by
[n++[d]| -- integer d appended to list n, where
n<-x, -- n is drawn from x, and
d<-[0..length n+1]] -- the new "digit" d is drawn from this range.
당신은 볼 x
자체의 용어로 정의되어 있지만,이 문제가되지 않습니다 그래서 하스켈은 게으른입니다.