큰 숫자


25

내 대답 중 몇 가지를 골라내는 동안 가능한 한 적은 문자로 큰 정수를 작성해야했습니다.

지금은 그렇게 할 수있는 가장 좋은 방법을 알고 : 나는 점점됩니다 당신이 이 프로그램을 작성 할 수 있습니다.

도전

  • 양의 정수가 주어지면 stdout 또는 이와 동등한 것으로 인쇄하는 프로그램을 출력하는 프로그램을 작성하십시오.
  • 출력 프로그램이 작성자와 동일한 언어 일 필요는 없습니다.
  • 출력은 최대 128 바이트 여야합니다.
  • stdin 또는 이와 동등한 입력을받을 수 있습니다 (기능 입력 아님)
  • 결과 프로그램을 stdout 또는 이와 동등한 것으로 출력 할 수 있습니다.
  • 숫자 출력은 10 진수 여야합니다 (기본 10).

채점

당신의 점수는 프로그램이 인코딩 할 수없는 가장 작은 양의 정수와 같습니다.

가장 큰 점수를 얻은 항목이 이깁니다.


출력 프로그램을 골프로 삼고 있기 때문에 태그 metagolf를 추가했습니다.
orlp

1
@orlp metagolf 는 "점수는 출력 길이"라는 점수 기준 태그 이기 때문에 실제로 는 의도적으로 생략했습니다 . 역 스코어링도 허용하기 위해 메타 게시물을 추가하는 것을 고려하고 있습니다 (예 : 가장 빠른 코드 의 경우).
Martin Ender

1
@ MartinBüttner 메타 제한 소스 가 필요하다고 생각 합니다 :)
orlp

2
"어떤 언어가 가장 큰 정수 범위를 가지는 언어"와 다른 점이 있습니까?
nwp

5
@ nwp 나는 당신이 질문을 오해한다고 생각합니다. 문제는 압축에 관한 것입니다. 유용하지만 정수 범위가 큰 언어를 사용할 필요는 없습니다.
감자

답변:


2

CJam 파이썬 → 3 (163 122 - 1)의 · 162분의 255 + 1 ≈ 1.213 * 10 (270)

import sys
n = int(input())
for b in range(163, 1, -1):
    s = []
    m = n
    while m:
        m, r = divmod(m - 93, b)
        if m < 0:
            break
        s.append(r + 93)
    else:
        sys.stdout.buffer.write(b'"%s"%db' % (bytes(s[::-1]), b))
        break
else:
    sys.stdout.buffer.write(b'%d' % n)

그것이 나오는 것 (163 내지 1023 매 정수 122 - 1)의 · 162분의 255은 기지국에 의해 상기 적어도 하나 개의 방식으로 표현 될 수있다 (B) 를 통해 코드 (93)와 최대 122 개 문자의 문자열로부터 ≤ 163 변환 B + 92 일반적인 출력 0- b -1이 아니라 추가 출력 코드없이 번거로운 문자 34 (큰 따옴표) 및 92 (백 슬래시)를 피합니다.


12

Pyth, 252 (111) ≈ 3.593 × 10 (266)

Js[
"ixL-rC1`H``N"
N
s@L-rC1`H``NjQ252
N
"252")$import sys$$sys.stdout.buffer.write(J.encode('iso-8859-1'))$

Pyth는에서 print인쇄 할 수 없기 때문에 약간의 Python 구문을 사용해야 했습니다 iso-8859-1.

이 숫자는 밑 252로 인코딩되어 해당 밑의 각 숫자를 iso-8859-1 문자로 나타냅니다. 문자 \"이스케이프가 필요하므로 사용되지 않습니다. char `은 골프 때문에 사용되지 않습니다 ... 또한 null 바이트도 사용되지 않으므로 Pyth 컴파일러는이를 금지합니다.

출력은 17 바이트의 오버 헤드를 가진 프로그램입니다.

ixL-rC1`H``N""252

다음은 가능한 가장 큰 사용법의 예입니다.

용법

설명

출력 프로그램의.

ixL-rC1`H``N""252
    rC1`H          create the range of chars: ['\x01', '\x02', ..., '{}']
         ``N       creates a string containing the 3 chars " ' \
   -               remove strings which consists of these 3 chars
 xL         ""     determine the index of each char in "" (encoded number)
i             252  convert from base 253 to base 10

1
12Pyth가 불행히도 CR을 LF로 읽으 므로이 프로그램은 인코딩에 실패합니다 .
Anders Kaseorg

10

CJam 254 109 ≈ 1.34 × 106 262

q~254b{_33>+_91>+c}%`"{_'[>-_'!>-}%254b"

I는 기지국 (254)에서 숫자를 인코딩 및 ISO 8859-1 문자로 그베이스에 각 디지트를 나타내는 스킵 야 "하고 \. 출력은 19 바이트의 오버 헤드를 가지 ""{_'[>-_'!>-}%254b므로 254 128-19 미만의 모든 것을 명시 적으로 나타낼 수 있습니다.

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

예를 들어, 다음 6153501과 같이 인코딩됩니다

"abc"{_'[>-_'!>-}%254b

다음은 인코딩 된 정수를 인쇄 한 다음 길이를 인쇄 한 다음 유효성을 보여주기 위해 즉시 실행 하는 테스트 프로그램 입니다 (인쇄 할 수없는 문자를 새 프로그램으로 복사 해야하는 문제를 피할 수 있습니다. 항상 작동하지는 않습니다) 온라인 통역사와 함께).


8

펄, 10216

print"print unpack'h*',q{",(pack'h*',<>),"}"

또한 기본 100 인코딩은 약간 더 우아합니다. 출력 12345678은 다음과 같습니다.

print unpack'h*',q{!Ce‡}

분리 문자 {}16 진수 값에 해당 b7하고 d7, 따라서 입력에 표시 할 수없고 각각은, 이스케이프 할 필요가 없습니다.

(10)의 최대 값에 도달하는 부호화 오버 헤드 (108)를 떠나 20 바이트있다 216 -1.


펄, 10206

print"ord=~print\$' for'",(map chr"1$_",<>=~/.{1,2}/g),"'=~/.|/g"

간단한 기본 100 인코딩. 에 대한 출력 12345678은 다음과 같습니다.

ord=~print$' for'p†œ²'=~/.|/g

(10)의 최대 값에 도달하는 부호화 오버 헤드 (103)를 떠나 25 바이트있다 206 -1.


6

커먼 리스프, 36 (114) - 1 내지 2.62 × 10 (117)

(lambda(x)(format t"(lambda()#36r~36r)"x))

가장 큰 숫자는 다음과 같습니다.

2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276879873503833622348138409040138018400021944463278473215

기본 36을 사용하십시오. 최대 입력의 경우 128 바이트 길이 출력은 다음과 같습니다.

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)

1

CJam 233 114 ≈ 7.561⋅10 269

ri233b{Kms/m]_34=+c}%s`"{iKms*}%233b"

출력 프로그램 "…"{iKms*}%233b은 문자열의 8 비트 문자를 n ↦ ⌊ n ⋅ sin 20⌋ = ⌊ n ⋅ 0.913⌋ 으로 기본 233 자리로 디코딩합니다. 이 변환은 중요한 코드 포인트 34 (큰 따옴표) 및 92 (백 슬래시)를 입력으로 요구하지 않고 예상치 못한 결과를 낳습니다.

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