태그 보관물: number-theory

number-theory

숫자를 “정확하지 않은 장소 값 시스템”으로 변환 증분이 표준입니다. 즉,

숫자 길이 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]적용한 결과 제공 fexpr 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


답변

Pyth-14 바이트

nth“장소보다 작은 값 패턴”에 맞는 값을 반환합니다 .

e.f.A.eghkbjZT

테스트 스위트 .


답변

하스켈, 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자체의 용어로 정의되어 있지만,이 문제가되지 않습니다 그래서 하스켈은 게으른입니다.


답변