大きな大きな数字


25

私の答えのいくつかをゴルフにしようとしながら、できるだけ少ない文字で大きな整数を書く必要がありました。

今、私はそれを行うための最良の方法を知っています。このプログラムを書いてもらうつもりです

チャレンジ

  • 正の整数を指定すると、標準出力または同等の出力を出力するプログラムを出力するプログラムを作成します。
  • 出力プログラムは、作成者と同じ言語である必要はありません。
  • 出力は最大で128バイトでなければなりません。
  • stdinまたは同等のもの(関数入力ではない)からの入力を受け入れることができます
  • 結果のプログラムをstdoutまたは同等のものに出力できます。
  • 数値の出力は10進数でなければなりません(基数10)

得点

スコアは、プログラムでエンコードできない最小の正の整数に等しくなります。

スコアが最大のエントリが勝ちます。


出力プログラムをゴルフしているので、タグmetagolfを追加しました。
orlp

1
ので、私は実際に、それを目的にして省略@orlp metagolfは「スコアがあなたの出力の長さである」と言う採点基準タグです。私はそれについてのメタ投稿を追加することを検討していますが、同様に逆スコアリングの種類も可能にします(たとえば、最速のコードの場合です)。
マーティンエンダー

1
@MartinBüttnermeta -restricted-sourceが必要だと思います :)
orlp

2
課題は「どの言語が最大の整数範囲を持っている」とどのように違いますか?
nwp

5
@nwp質問を誤解していると思います。問題は圧縮についてです。便利ですが、大きな整数範囲の言語を使用する必要はありません。
ポテト

回答:


2

Python 3→CJam、(163 122 − 1)・255/162 + 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文字として表します。chars \および"はエスケープする必要があるため、使用されません。char `はゴルフのために使用されません...さらに、ヌルバイトも使用されないため、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として読み取るため、このプログラムはエンコードに失敗します。
アンデルスカセオルグ16

10

CJam、254 109 ≈1.34×10 262

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

私は、ベース254の数値を符号化し、ISO 8859-1文字としてそのベースに各桁を表し、スキップだ"\。出力には19バイトのオーバーヘッドがある""{_'[>-_'!>-}%254bため、254 128-19未満、または明示的にすべてを表すことができます

13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144

一例として、6153501として符号化されます

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

エンコードされた整数を印刷し、次にその長さを印刷し、その有効性を示すためにすぐに実行するテストプログラムを次に示します(これにより、印刷できない文字を新しいプログラムにコピーする必要がなくなります。オンライン通訳と)。


8

Perl、10 216

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

また、ベース100エンコード、わずかにエレガントです。の出力は12345678次のとおりです。

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

デリミタ{}は16進値に対応しb7d7それぞれ入力に表示されないため、エスケープする必要はありません。

20バイトのオーバーヘッドがあり、エンコード用に108を残して、10 216 -1の最大値に達します。


Perl、10 206

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

単純なベース100エンコード。出力12345678は次のようになります。

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

25バイトのオーバーヘッドがあり、エンコード用に103を残して、10 206 -1の最大値に達します。


6

Common Lispの、36 114 - 1~ 2.62×10 117

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

最大数は次のとおりです。

2621109035105672045109358354048170185329363187071886946329003212335230440027827818091139599929524823562064749950789402494298276879873503833622348138409040138018400021944463278473215

単純にbase 36を使用します。最大入力の場合、128バイトの長い出力は次のとおりです。

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)

1

CJam、233 114 ≈7.561⋅10 269

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

出力プログラムを"…"{iKms*}%233b用いてベース233桁の文字列の8ビット文字をデコードN ↦⌊ N ⋅罪20⌋=⌊ N ⋅0.913⌋。この変換は、入力として重要なコードポイント34(二重引用符)と92(バックスラッシュ)を必要とせずに全単射です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.