大数字


25

在尝试解答我的几个答案时,我需要用尽可能少的字符编写大整数。

现在,我知道执行此操作的最佳方法:我会让编写此程序。

挑战

  • 编写一个程序,当给定一个正整数时,输出一个程序,将其打印到stdout或等效程序。
  • 输出程序不必使用与创建者相同的语言。
  • 输出最多为128个字节。
  • 您可以接受来自stdin或等效输入的输入(不是功能输入)
  • 您可以将结果程序输出到stdout或等效程序。
  • 输出的数字必须为十进制(以10为底)

计分

您的分数等于程序无法编码的最小正整数。

得分最高的条目将获胜。


我添加了标签metagolf,因为我们正在打高尔夫球输出程序。
orlp 2015年

1
@orlp我实际上是故意省略了它,因为metagolf是一个评分标准标记,上面写着“分数是您输出的长度”。我正在考虑添加有关此内容的元文章,以便也可以进行逆评分(例如,最快的代码就是这种情况)。
马丁·恩德

1
@MartinBüttner我想我们需要meta-restricted-source :)
orlp

2
挑战与“哪种语言具有最大的整数范围”有何不同?
nwp 2015年

5
@nwp我认为您误解了这个问题。问题是关于压缩。使用整数范围较大的语言会很有用,但不是必需的。
土豆

Answers:


2

蟒3→CJam,(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)

事实证明,从1023到(163每个整数122 - 1)·162分之255可以在至少一种方式通过碱来表示b ≤163转换从至多122个字符的带码93通过一个串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'))$

必须使用一点Python语法,因为Pyth print不能在中打印iso-8859-1

该数字在基数252中进行编码,并将该基数中的每个数字表示为iso-8859-1字符。字符\"需要转义,因此不使用。`不使用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
该程序无法编码12,因为不幸的是Pyth 将CR读取为LF
安德斯·卡塞格

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,10216

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

还基于100编码,略显优雅。输出为12345678

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

分号{和分别}对应于十六进制值b7d7,它们不能出现在输入中,因此不需要转义。

有20个字节的开销,剩下108个用于编码,达到最大值10 216 -1。


Perl,10 206

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

简单的base 100编码。的输出12345678如下所示:

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

有25个字节的开销,剩下103个字节用于编码,达到最大值10206 -1。


6

常见Lisp中,36 114 - 1〜2.62×10 117

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

最大数量是:

2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276276879873873622348138409040138018400021944463278473215

只需使用基数36。对于最大的输入,128字节长的输出为:

(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)

1

CJam,233 114 ≈7.561⋅10 269

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

输出的程序"…"{iKms*}%233b字符串的8位字符解码,以基座233位与Ñ ↦⌊ Ñ ⋅罪20⌋=⌊ Ñ ⋅0.913⌋。这种转换恰好是不需要要求关键代码点34(双引号)和92(反斜杠)作为输入的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.