직렬화 된 정수 찾기


16

직무

양의 정수를 입력으로받을 프로그램을 작성하십시오. 그런 다음에서 시작 0하여 각 정수를에 추가 String하고의 길이가 String입력 값보다 작은 경우에만 계속됩니다 .

직렬화 정수는 최대 값이 속하는 함께 완전히 형성 정수로 정의된다 String. "완전한 형식"으로, 정수는 누락 된 숫자가 없어야합니다 (이의 길이 제한 조건 String이 충족 되는 경우 발생 함 ).

프로그램의 출력은 각각의 양의 입력에 대해 직렬화 된 정수 여야합니다 .


규칙

  • 코드 골프이므로 최단 답변 (바이트)이 이깁니다!
  • 입력은 항상 양수입니다.
  • 출력은 10 진수 (10 진수)의 정수 여야합니다.
  • 프로그램은 인덱스가 0이어야합니다.

입력 예 | 산출

   5 | 4   (0 1 2 3 4              - Length of 5)
  11 | 9   (0 1 2 3 4 5 6 7 8 9 1  - Length of 11)
  12 | 10  (0 1 2 3 4 5 6 7 8 9 10 - Length of 12)
1024 | 377 (0 1 2 3 4 5 6 7 8 ...  - Length of 1024)

노트)


6
제안 된 테스트 사례 :11
Rod

@로드 그것을 추가하면, 이해하기 쉽기를 바랍니다!
Jacob G.

예제에서 문자열에 따옴표를 추가하면 문자열임을 쉽게 이해할 수 있습니다.
isaacg

따라서 Champernowne 상수 의 첫 N-1자릿수 는 앞에? 0
Mego

답변:


8

자바 스크립트 (ES6), 40 37 바이트

f=(n,i=s='0')=>(s+=++i)[n]?i-1:f(n,i)
<input type=number min=1 value=1 oninput=o.textContent=f(this.value)><pre id=o>0

편집 : @ Arnauld의 도움으로 3 바이트를 저장했습니다.




5

Japt , 13 바이트

1n@P±X l >U}a

온라인으로 테스트하십시오!

설명

1n@ P± X l >U}a
1nX{P+=X l >U}a
                   Implicit: U = input integer, P = empty string
  X{         }a    Return the first integer X in [0, 1, 2, ...] that returns a truthy value:
    P+=X             Append X to P.
         l >U        Return P.length > U.
                   This returns the first integer that can't fit into the U-char string.
1n                 Subtract 1 from the result.
                   Implicit: output result of last expression




4

젤리 ,  11 10  9 바이트

RD;\L€<⁸S

양의 정수를 취하고 음이 아닌 정수를 반환하는 모나드 링크.

온라인으로 사용해보십시오!

어떻게?

편집 중 ...

RD;\L€<⁸S - link: number n
R         - range -> [1,2,...10,11,...,n-1]
 D        - convert to decimal (vectorises) -> [[1],[2],...,[1,0],[1,1],...D(n-1)]
   \      - cumulative reduce by:
  ;       -   concatenation -> prefixes i.e.: [[1],[1,2],...,[1,2,...,1,0],[1,2,...,1,0,1,1],[1,2,...,1,0,1,1,...Flattened(D(n))]]
    L€    - length of €ach -> [1,2,3,...,11,13,...,length([1,2,...,1,0,1,1,...Flattened(D(n))])]
       ⁸  - chain's left argument, n
      <   - less than? (vectorises)
        S - sum (yields the number of prefixes that are less than or equal in length to n)
          -   Note: `0` is excluded from the range and all the prefixes, but including
          -         it would mean comparing to n+1 AND decrementing at the end (for a
          -         total cost of a byte)


3

펄 6 , 36 바이트

{(0...^{([~] 0..$^a).comb>$_})[*-1]}

온라인으로 사용해보십시오!

  • 0 ...^ {...}0부터 중괄호의 코드 블록이 true를 반환하는 숫자보다 1이 작은 숫자 시퀀스입니다. (... 캐럿없이 블록이 진정한 반환되는 첫 번째 숫자를 반환합니다.)
  • [~] 0 .. $^a0현재 숫자까지 의 숫자 연결$^a (코드 블록에 대한 매개 변수)까지 연결합니다.
  • .comb연결된 문자열의 모든 문자 (숫자) 목록입니다. 숫자로 해석되어 문자열 길이로 평가됩니다. .chars문자열 길이로 직접 평가되기 때문에 여기에서 사용하는 것이 더 자연 스럽지만 이름은 한 글자 더 깁니다.
  • $_ 최상위 함수에 대한 인수입니다.
  • [*-1] 생성 된 목록의 마지막 요소를 선택합니다.

2

QBIC , 34 바이트

{A=!p$~_lB+A|>:|_xp-1|\B=B+A]p=p+1

설명

{           DO infinitely
A=!p$       Set A$ to p cast to num
            Note that p starts out as 0.
~      >:   IF the input number is exceeded by
 _l   |     the length of
   B+A      A$ and B$ combined
_xp-1|      THEN QUIT, printing the last int successfully added to B$
            The _X operator quits, (possibly) printing something if followed by a-zA-Z
            _x is slightly different, it prints the expression between the operator _x and |
\B=B+A      ELSE add A$ to B$
]           END IF
p=p+1       Raise p, and rerun


2

J, 26 바이트

(>i:1:)([:+/\[:>.10^.1+i.)

((>i:1:)([:+/\[:>.10^.1+i.))"0 ] 5 11 12 1024 2000 20000 100000 1000000
4 9 10 377 702 5276 22221 185184




0

자바 8, 64 바이트

n->{int i=0;for(String t="0";;t+=++i)if(t.length()>n)return~-i;}

또는 동일한 바이트 수를 가진 약간의 대안 :

n->{int i=0;for(String t="";;t+=i++)if(t.length()>n)return i-2;}
n->{int i=-1;for(String t="";;t+=++i)if(t.length()>n)return~-i;}

설명:

여기에서 시도하십시오.

n->{                  // Method with integer as both parameter and return-type
  int i=0;            //  Integer `i`, starting at 0
  for(String t="0";   //  String, starting at "0"
      ;               //  Loop indefinitely
       t+=++i)        //    After every iteration: append the String with `i+1`
                      //    by first increasing `i` by 1 with `++i`
    if(t.length()>n)  //   If the length of the String is larger than the input:
      return~-i;      //    Return `i-1`
                      //  End of loop (implicit / single-line body)
}                     // End of method


0

루비, 44 바이트

Kevin Cruijssen의 JAVA 답변에서 영감을 얻었습니다. G B 덕분에 -4 바이트

->n{i,t=0,'';t+="#{i+=1}"while t.size<n;i-1}

(i + = 1; t + = i.to_s)는 t + = "# {i + = 1}"과 동일하며 4 바이트 만 더
GB

그렇게하면 변수 t가 더 이상 필요하지 않습니다. n에서 크기를 빼고 0과 비교할 수 있습니다.
GB

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