큰 밑, 작은 자릿수


19

J 언어에는 상수를 지정하기위한 매우 어리석은 구문이 있습니다. 저는 특히 하나의 멋진 기능, 즉 임의의 기초로 작성할 수있는 기능에 중점을두고 싶습니다.

당신이 작성하는 경우 XbY에 대한 X임의의 숫자와 Y알파벳과 숫자의 문자열, 다음 J 해석됩니다 Y기본으로 X번호 0를 통해 9자신의 통상적 인 의미를 가지고 a통해 z35을 통해 10를 나타냅니다.

그리고 X어떤 숫자를 말할 때 , 나는 어떤 숫자를 의미 합니다 . 이 질문의 목적을 위해 X양의 정수로 제한 하지만 J에서는 음수, 분수, 복소수 등 무엇이든 사용할 수 있습니다.

이상한 점은 사용 가능한 기호 모음 이 0-9와 az 로만 구성되므로 0에서 35까지의 숫자를 기본 숫자로 사용할 수 있다는 것입니다 .

문제

이 방법을 사용하여 2,933,774,030,998 과 같은 골프 매직 넘버를 도와주는 프로그램 이 필요합니다. 글쎄요, 아마 그렇게 크지 않을 것입니다, 나는 당신에게 쉽게 갈 것입니다. 그래서...

내 작업은 (주로 대형) 진수 걸리는 프로그램이나 함수를 작성하는 N1 4,294,967,295 (= 2 사이에 32 형태의 짧은 표현 입력 -1) 및 출력 / 반품 XbY, X양수이다 Y되고 영숫자로 구성되는 문자열 (0-9 및 az, 대 / 소문자 구분 안 함), 밑에서 같음으로 Y해석됩니다 .XN

모든 표현 XbY표현 의 길이가 의 자릿수보다 크거나 같으면 대신 N출력 N합니다. 다른 모든 관계에서 가장 짧은 표현의 비어 있지 않은 부분 집합을 출력 할 수 있습니다.

이것은 코드 골프이므로 짧을수록 좋습니다.

테스트 사례

      Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
          5 | 5
            |
   10000000 | 79bkmom  82bibhi  85bgo75  99bauua  577buld
            | 620bq9k  999baka
            |
   10000030 | 85bgo7z
            |
   10000031 | 10000031
            |
   12345678 | 76bs9va  79bp3cw  82bmw54  86bjzky  641buui
            |
   34307000 | 99bzzzz
            |
   34307001 | 34307001
            |
 1557626714 | 84bvo07e  87brgzpt  99bglush  420blaze
            |
 1892332260 | 35bzzzzzz  36bvan8x0  37brapre5  38bnxkbfe  40bij7rqk
            | 41bgdrm7f  42bek5su0  45bablf30  49b6ycriz  56b3onmfs
            | 57b38f9gx  62b244244  69b1expkf  71b13xbj3
            |
 2147483647 | 36bzik0zj  38br3y91l  39bnvabca  42bgi5of1  48b8kq3qv
 (= 2^31-1) | 53b578t6k  63b2akka1  1022b2cof  1023b2661  10922bio7
            | 16382b8wv  16383b8g7  32764b2gv  32765b2ch  32766b287
            | 32767b241
            |
 2147483648 | 512bg000  8192bw00
            |
 4294967295 | 45bnchvmu  60b5vo6sf  71b2r1708  84b12mxf3  112brx8iv
 (= 2^32-1) | 126bh5aa3  254b18owf  255b14640  1023b4cc3  13107bpa0
            | 16383bgwf  21844b9of  21845b960  32765b4oz  32766b4gf
            | 32767b483  65530b1cz  65531b1ao  65532b18f  65533b168
            | 65534b143  65535b120

어떤 표현이 어떤 숫자와 같은지 확실하지 않으면 Try It Online 의 J 해석기와 같은 J 해석기를 사용할 수 있습니다 . 그냥 입력하면 stdout 0":87brgzptJ가 다시 뱉어집니다 1557626714. 이 문제는 대소 문자를 구분하지 않지만 J는 소문자 만 허용합니다.

도움이 될만한 이론

  • 모든 N미만 10,000,000, 소수점 표현은 다른 짧게하고 따라서 만 허용되는 출력된다. 무엇이든 저장하려면 새베이스에서 최소 4 자리 더 짧아야하고베이스가 99보다 큰 경우에는 더 커야합니다.
  • 의 제곱근의 천장까지 기지를 확인하면 충분합니다 N. 어떤 큰베이스의 경우 B , N기본 대부분이 개 자리에있을 것입니다 B 유효한 첫 번째 자리 뭔가 주위에있을거야 처음 있도록, BN/ 35. 그러나 그 크기에서는 항상 최소한 십진수 표현만큼 크므로 시도 할 필요가 없습니다. ceil (sqrt (이 문제를 해결하도록 요청하는 가장 큰 숫자)) = 65536입니다.
  • 밑면에 36보다 작은 표현이 있으면, 밑면 36 표현은 최소한 짧을 것입니다. 따라서 36 미만의 35bzzzzzz밑수 에서 실수로 짧은 해 를 구하는 것에 대해 걱정할 필요가 없습니다. 예를 들어, 1,892,332,260 의 표현 은 해당 염기에 대해 특이한 숫자를 사용하지만 36bvan8x0길이는 같습니다.

Lol, 1557626714 = 420blaze ^ _ ^
DrQuarius

답변:


9

자바 스크립트 (ES6), (103) 101 바이트

입력을 문자열로받습니다.

n=>[...Array(7e4)].reduce(p=>p[(r=++b+(g=x=>x?g(x/b|0)+(x%b).toString(36):'b')(n)).length]?r:p,n,b=2)

테스트 사례

NB : 스 니펫 함수의 반복 횟수는 600 개로 제한되므로 테스트 케이스가 더 빨리 완료됩니다. (그렇지 않으면 몇 초가 걸립니다.)


내 번호가 너무 커서이 문제를 해결하지 못하면 어떻게 해결합니까? 반복을 늘리는 것이 도움이되지 않는 것 같습니다.
FrownyFrog

<232
Arnauld

"치명적인 숫자"조회, 2136894800297704.
FrownyFrog

@FrownyFrog 당신은 반복의 수를 증가하여 처리 할 수 있습니다 사용하는 Math.floor(x/b)대신 x/b|0. (그러나 나는 그것을 테스트하지 않았다.)
Arnauld

1
효과가 있었다! 감사합니다.
FrownyFrog

3

루비 , 118 바이트

이것은 다른 질문과 관련이 있으며 여기에 많은 답변이 없다는 것을 알았으므로 총에 맞기로 결정했습니다.

걸을 모든 염기 와 모든 유효한 J 번호 구조물을 구성하는 입력을 포함한. 어쨌든 기본 10 표현보다 짧을 방법이 없기 때문에 1-8을 건너 뜁니다. 그것은 digits숫자를 얻기 위해 내장을 호출하기 때문에 모든 것을 고려한 매우 순진한 해결책입니다. 그러나 그것이 가장 중요하지 않은 숫자로 시작하기 reverse때문에 실제 숫자를 얻기 위해 먼저해야 하므로 향상 될 수 있습니다.

느리다. soooooo는 엄청나게 느립니다. 예를 들어 TIO는 34307000에서 시간 초과됩니다. 우리 7e4 시간을 절약하기 위해 제곱근이나 Arnauld의 선택으로 갈 수 있지만 추가 바이트가 필요하므로 왜 귀찮습니까?

->n{([n.to_s]+(9..n).map{|b|d=n.digits b;"#{b}b"+d.reverse.map{|i|i.to_s 36}*''if d.all?{|i|i<36}}-[p]).min_by &:size}

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

sqrt를 사용하여 온라인으로 사용해보십시오.


1

05AB1E , 37 바이트

[¼35ݾãvtîEyNβQižhA«yèJ'bìNìDgIg@i\}q

이론 상으로는 효과가 있지만 사소하지 않은 모든 테스트 사례의 경우 시간이 초과됩니다 10000000. 데카르트 곱 내장 ã은 매우 느립니다.4 .

최종 if 문없이 DgIg@i\} 이 값이 작동하는지 확인하기 위해 더 낮은 값을 테스트 할 수 있습니다. 온라인으로 시도하십시오.

나중에 (아마 더 길지만 더 효율적인) 솔루션을 생각해 낼 수 있는지 알 수 있습니다.

설명:

[              # Start an infinite loop:
 ¼             #  Increase the counter variable by 1 (0 by default)
 35Ý           #  Push a list in the range [0, 35]
 ¾ã            #  Take the cartesian product of this list with itself,
               #  with chunks-sizes equal to the counter variable
 v             #  Loop `y` over each of these lists:
  t            #   Take the square-root of the (implicit) input-integer
   î           #   Ceil it
  E            #   Loop `N` in the range [1, ceil(square(input))]:
   yNβ         #    Convert list `y` to base-`N`
   Qi          #    If it's equal to the (implicit) input-integer:
     žh        #     Push string "0123456789"
       A«      #     Append the lowercase alphabet
     yè        #     Index each value in list `y` into this string
     J         #     Join the characters to a single string
     'bì      '#     Prepend a "b"
        Nì     #     Prepend the number `N`
     D         #     Duplicate it
      g        #     And pop and push the length of this string
       Ig      #     Also push the length of the input
         @i }  #     If the length of the string is >= the input-length:
           \   #      Discard the duplicated string
     q         #     Stop the program
               #     (after which the result is output implicitly;
               #      or if the string was discarded and the stack is empty, it will
               #      implicitly output the implicit input as result instead)

1
감동적인 답변! 그래도 규칙이 빠진 것 같습니다. "모든 표현 XbY표현 의 길이 가 자릿수보다 크거나 같으면 대신 N출력 N합니다." 처음 천만 개의 숫자를 다루는 동안 입력 10000031내용이와 같은 것을 줄 것이라고 생각 26blmoof합니다. 숫자는 유효하지만 길이는 입력과 동일하므로 대신 입력을 리턴해야합니다.
가치 잉크

@ValueInk 아 죄송합니다. 알아 주셔서 감사합니다! 이제 몇 바이트의 비용으로 수정해야합니다.
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.