在尝试解答我的几个答案时,我需要用尽可能少的字符编写大整数。
现在,我知道执行此操作的最佳方法:我会让您编写此程序。
挑战
- 编写一个程序,当给定一个正整数时,输出一个程序,将其打印到stdout或等效程序。
- 输出程序不必使用与创建者相同的语言。
- 输出最多为128个字节。
- 您可以接受来自stdin或等效输入的输入(不是功能输入)
- 您可以将结果程序输出到stdout或等效程序。
- 输出的数字必须为十进制(以10为底)
计分
您的分数等于程序无法编码的最小正整数。
得分最高的条目将获胜。
在尝试解答我的几个答案时,我需要用尽可能少的字符编写大整数。
现在,我知道执行此操作的最佳方法:我会让您编写此程序。
您的分数等于程序无法编码的最小正整数。
得分最高的条目将获胜。
Answers:
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(反斜杠),而无需任何额外的输出代码。
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
q~254b{_33>+_91>+c}%`"{_'[>-_'!>-}%254b"
我正在以254为底进行编码,并将该底中的每个数字表示为ISO 8859-1字符,"
并跳过和\
。输出的开销为19个字节,""{_'[>-_'!>-}%254b
所以我可以表示小于254 128-19的所有内容,或显式表示
13392914970384089616967895168962602841770234460440231501234736723328784159136966979592516521814270581662903357791625539571324435618053333498444654631269141250284088221909534717492397543057152353603090337012149759082408143603558512232742912453092885969482645766144
例如,6153501
将被编码为
"abc"{_'[>-_'!>-}%254b
这是一个测试程序,该程序先打印编码后的整数,然后打印其长度,然后立即执行以显示其有效性(这避免了将无法打印的字符复制到新程序中的麻烦,这种情况并不总是可行的在线翻译)。
print"print unpack'h*',q{",(pack'h*',<>),"}"
还基于100编码,略显优雅。输出为12345678
:
print unpack'h*',q{!Ce‡}
分号{
和分别}
对应于十六进制值b7
和d7
,它们不能出现在输入中,因此不需要转义。
有20个字节的开销,剩下108个用于编码,达到最大值10 216 -1。
print"ord=~print\$' for'",(map chr"1$_",<>=~/.{1,2}/g),"'=~/.|/g"
简单的base 100编码。的输出12345678
如下所示:
ord=~print$' for'p†œ²'=~/.|/g
有25个字节的开销,剩下103个字节用于编码,达到最大值10206 -1。
(lambda(x)(format t"(lambda()#36r~36r)"x))
最大数量是:
2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276276879873873622348138409040138018400021944463278473215
只需使用基数36。对于最大的输入,128字节长的输出为:
(lambda()#36rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)
ri233b{Kms/m]_34=+c}%s`"{iKms*}%233b"
输出的程序"…"{iKms*}%233b
字符串的8位字符解码,以基座233位与Ñ ↦⌊ Ñ ⋅罪20⌋=⌊ Ñ ⋅0.913⌋。这种转换恰好是不需要要求关键代码点34(双引号)和92(反斜杠)作为输入的。