이 번호의 시작은 무엇입니까?


14

많은 프로그래밍 언어는 숫자를 기존 숫자의 끝까지 '연결'하여 큰 정수를 구성합니다. 예를 들어, Labyrinth 또는 Adapt 입니다. 숫자를 끝에 연결하면 기존 숫자가 45 이고 숫자가 인 경우 결과 숫자는 입니다.7457(45×10+7)

생성 된 숫자는 AKA 다음 9 개 시퀀스 중 하나의 요소를 사용하여이 방법으로 만들 수있는 숫자입니다 .1,2,3,4,5,6,7,8,9

1,12,123,1234,12345,
2,24,246,2468,24690,
3,36,369,3702,37035,
4,48,492,4936,49380,
5,60,615,6170,61725,
6,72,738,7404,74070,
7,84,861,8638,86415,
8,96,984,9872,98760,
9,108,1107,11106,111105,

시퀀스 구성 방법의 예를 제공하기 위해 a=3 의 시퀀스 구성 방법은 다음과 같습니다.

u1=a=3=3u2=10×u1+2×a=30+6=36u3=10×u2+3×a=360+9=369u4=10×u3+4×a=3690+12=3702u5=10×u4+5×a=37020+15=37035u6=10×u5+6×a=370350+18=370368
u33=10×u32+33×a=37260+99=37359u34=10×u33+34×a=37359+102=373692

u33 을 시연하기 위해 및 포함되었습니다 . 많은 숫자의 공간을 위해 밖으로 점선.u34n×a100

이러한 시퀀스가 ​​어떻게 구성되어 있는지 여전히 명확하지 않을 수 있으므로 다음과 같은 두 가지 방법으로 이해할 수 있습니다.

  • 각 시퀀스는 한 자리부터 시작합니다. 다음 항은 해당 숫자 의 다음 배수 를 취하여 이전 항에 곱한 다음 배수 를 더하여 구합니다. 순서대로 :10

    un=10×un1+n×a,u1=a

    여기서, 단일 디지트가 ( 내지 )a19


  • 의 각각 시퀀스의 임의의 지점에서 요소 (받아 예를 들면은)의 배수 인 에서 행 곳 에 의해 구성된다9n=312319123un+1=10×un+n (1,12,123,,123456789,1234567900,12345679011,)

    따라서 첫 번째 값은 이고 두 번째 값은 이고 세 번째 등1×1,2,3,,8,912×1,2,3,,8,9123×1,2,3,,8,9

당신의 임무는 생성 된 숫자를 입력으로 취하고 그것을 구성하는 데 사용되는 초기 숫자를 출력하는 것입니다. 입력이 항상 생성 된 숫자이고 보다 크다고 가정 할 수 있습니다 . 한 자리 숫자 일 수 있으며, 그 자체로 다시 매핑됩니다.0

자릿수 목록, 문자열 등을 포함하여 합리적인 방식으로 입력 할 수 있습니다. 단항식 또는 선택한 다른 기준으로 입력하는 것이 허용됩니다 (권장되지는 않음).

이것은 이므로 가장 짧은 코드가 승리합니다!

테스트 사례

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

또는 두 가지 목록으로 :

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

이 도전 과제를 게시했을 때 Grimy의 답변에 사용 된 방법으로 너무 단순화 될 수 있다는 것을 알지 못했기 때문에 '숫자'가 아니라이 문제를 해결하기 위해보다 수학적 접근법을 취하는 답변에 매우 관심이 있습니다. 속임수 (분명히 모든 유효한 답변이 똑같이 유효한 것입니다.


샌드 박스 게시물 . 누군가가 그것에 도전하고 싶다면 Jelly에 9 바이트 솔루션이 있습니다.
caird coinheringaahing

답변:


26

05AB1E , 7 5 4 바이트

>9*н

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

>            # input + 1
 9*          # * 9
   н         # take the first digit

6
그것은이 쉽게 단순화 할 수 있다면 흠, 그건이 도전을 위해 잘 징조하지 않습니다
coinheringaahing 케어 드

9
800 바이트의 챌린지 설명을위한 약 1 바이트의 코드가 있습니다. : p
Arnauld

1
솔루션을 어떻게 생각해 내고 왜 올바른가요?
Joel

7
@Joel a로 시작하는 시퀀스의 n 번째 항은입니다 a * (((10**n - 1) / 9 - n) / 9). 곱하기 것을 9 추가로 a*n, 당신은 얻을 a * ((10**n - 1) / 9), 일명 숫자 반복 n 번을. a*nn = 1에 대한 작업 대신 9를 더하는 것으로 나타 났 으며, 더 큰 n의 경우 지수 성장 옆에서 일정한 차이는 무시할 수 있습니다.
Grimmy September

3
@Grimy 설명해 주셔서 감사합니다. 아마 당신은 당신의 게시물에 넣을 수 있습니다.
Joel





2

, 7 바이트

§I×⁹⊕N⁰

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. @ 그림의 방법은 물론입니다. 다음은 27 바이트 수학적 접근 방식입니다.

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 유효하지 않은 입력에서 충돌이 발생합니다. 설명:

Nθ

생성 된 번호를 입력하십시오.

W¬№Eχ×κ↨υχθ

목록을 밑 10의 숫자로 해석하고에서 0까지의 모든 숫자를 곱한 9다음 구성된 숫자가 나타나는지 확인하십시오.

⊞υLυ

리스트의 길이를 스스로 밀어 넣습니다. 따라서 목록은 형식이 [0, 1, 2, ..., n]됩니다.

I⌕Eχ×ι↨υχθ

생성 된 숫자를 다시 작성하되 이번에는 입력 번호가 나타난 색인을 찾아 출력하십시오.



2

공백 , 108 바이트

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

문자 S(공백), T(탭) 및 N(줄 바꾸기)가 강조 표시로만 추가되었습니다.
[..._some_action]설명으로 만 추가되었습니다.

@Grimy 의 05AB1E answer 포트 , 첫 번째 숫자를 얻을 수있는 내장 기능이 없다는 것을 제외하고. ;)

온라인으로 시도하십시오 (원시 공백, 탭 및 줄 바꾸기 만).

의사 코드의 설명 :

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT

2

파이썬 3 , 22 바이트

lambda i:str(-~i*9)[0]

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

포트 검댕으로 더럽혀진05AB1E 답변


파이썬 3 , 74 바이트

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

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

설명

재귀 기능. l에서 시작하여 각 숫자의 시퀀스를 반복합니다 1. 입력 i이 현재 반복과 같으면 j해당 숫자 l가 반환됩니다. 그렇지 않으면 j시퀀스 의 현재 값 이 입력 값을 초과 i하면 숫자가 증가 l하고 다시 시작됩니다. 인수 k는 곱셈 인수를 증가시키는 데 사용됩니다.


1

자바 스크립트 (ES6),  16  15 바이트

이전 버전에서 32 비트 제약 조건을 해제 한 @Grimy에게 감사드립니다.

Grimy 's magic incantation 사용 . 입력을 문자열로받습니다.

n=>(n*9+9+n)[0]

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


자바 스크립트 (ES6), 53 바이트

순진한 무차별 접근 방식.

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

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


-~n*9할 수 있습니다 n*9+9같은 bytecount는하지만, 내가 제대로 이해한다면 32 비트 제한을 제거해야하는.
Grimmy

짐승 힘처럼> = 10 일14808
나우 Fouilleul

1
@NahuelFouilleul a> = 10으로 간주되면 답은 더 이상 고유하지 않습니다 (14808은 a = 12의 4 번째 항 또는 a = 14808의 첫 번째 항일 수 있음). 이들 중 하나의 출력이 허용되면 n=>n모든 입력에 대해 작동합니다.
Grimmy

1

자바 8, 23 바이트

n->(n*9+9+"").charAt(0)

@Grimy 의 05AB1E 답변 포트 , 따라서 그를 찬성 해야합니다!

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

그러나 @cairdCoinheringaahing 에 대해 다소 기분이 좋지 않기 때문에 여기에 약간 더 여유가있는 무차별 접근 방식 ( 83 바이트 )이 있습니다.

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

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

설명:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result




0

-rr , 4 바이트

⑨9*÷

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

물론 05AB1E 답변과 동일한 접근 방식을 사용합니다. 또한 새로운 -rr(역 및 원시 인쇄) 플래그를 사용합니다.

다음으로 번역 :

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)

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