숫자를 "정확하지 않은 장소 값 시스템"으로 변환


11

숫자 길이 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

마지막 사례는 구현 방법에 따라 실행 속도가 매우 느릴 수 있습니다. 너무 오래 걸리거나 너무 많은 메모리를 사용하는 경우 실행할 필요가 없습니다. 그러나 메모리를 적게 사용하고 빠르게 실행하는 방법이 있습니다.


마지막 의견이 있다면 항상 숫자가있는 목록을 반환해도 괜찮습니까?
Greg Martin

예, 숫자가 정확하다면 출력을주는 합리적인 방법입니다
Ando Bando

1
나는군요 100 -> 10035보다는 100 -> 10033당신이 확인할 수 있습니다?
Greg Martin

@GregMartin 10035가 옳아 보입니다. 프로그램이 아닌 펜으로 계산을 수행하여 계산 오류가 발생했습니다. 나는 우리에게 재난을위한 컴퓨터가 있다고 생각합니다
Ando Bando

답변:


4

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[#]]],#]&; 이것은 우리가 원하는 숫자를 찾기 위해 숫자 체계에서 충분히 멀리 가기 위해 필요한 자릿수를보다 사실적으로 제한합니다.


3

수학, 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 *)

y___,z_:0목록의 길이를 늘리는 좋은 사용법 !
Greg Martin

2
@GregMartin JungHwan Min은 어제 비슷한 문제 에 사용했습니다 .
ngenisis 2012 년

3

펄 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


1

하스켈, 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 바이트를 저장할 수 있습니다 .)


1

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.