最短的程序,其串联的程序+输出是95个可打印ASCII字符的排列


12

编写一个尽可能短的程序(以字节计数为单位),不输入任何内容,不包含任何注释,并输出一个字符串/序列,这样,串联的程序+输出正好是95个字符长,并且包含每个可打印的ASCII字符仅一次,即program + output是95个字符的置换,ASCII码为32-126:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 

如果出现平局,则获胜者是其项(95个字符)并置的程序+输出最接近上述字符串的条目,根据Levenshtein编辑距离(即,单个字符的删除,插入或删除的个数)必须将其替换为ASCII顺序)。


2
那么这是否意味着,例如,如果程序包含任何重复的字符,它将自动被取消资格?太粗糙了
面包箱


1
您可能还想裁定旧的echo $0是否不合格。
彼得·泰勒

3
是否允许超出可打印的ASCII字符范围的字符(可能重复)?还是程序+输出必须仅将每个可打印字符包含一次,仅此而已
2013年

1
@primo我认为它们是允许的。我认为是时候编写一个使用重复的“平移和评估”解决方案了(尽管很难获得字符串文字)
John Dvorak 2013年

Answers:


12

GolfScript,14个字符

{`),32>46-^}.~

输出

 !"#$%&'(*+/015789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_abcdefghijklmnopqrstuvwxyz|

挑战(至少就我所知)是编写一个程序,其程序输出是95个可打印ASCII字符的排列,而不是写出输出95个可打印ASCII字符的最短程序。
Frank Schmitt 2013年

抱歉,是我的错。在标题中,它读为“程序+输出”,而在后面的问题中,它读为级联的程序+输出。
Frank Schmitt 2013年

),- 哇。我喜欢那个。
John Dvorak

1
@JanDvorak codegolf.SE:这是人们对亲密的括号和逗号感到兴奋的唯一地方。:P
门把手

golfscript中的@Doorknob意思是“正确的uncons(rparen)并制作该大小的数组(逗号)”。实际上,您剩下的是一个缩短了一个字符的字符串(右卷曲)和一个数组,该数组恰好在该字符的ASCII位置之下(在|处)。修剪不可打印的字符,句点和xor(此处为对称集合差),并加上源代码(减去减法)后再正确卷曲,就可以了。是的,字符串xor数组是字符串。
John Dvorak 2013年

6

Perl,89个字符

这是到目前为止我能做的最好的事情:

q< !"#%&'()+/8:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghjklmosuvwxz|>;
print~-$=.73*2,y[]{}

对于那些不熟悉Perl minutae的人,可以将该print语句的两个参数呈现为~(-($=)) . (73 * 2)tr///

程序输出6个字符:

591460

不幸的是每一个迭代结构,我可以在Perl想到的(forwhileuntilmapgrep)与至少股一个字符print。如果允许换行符出现在输出中,那么我可以使用Perl 5.010得出一个87个字符的解决方案:

q{ !"#%&'*,-./0:;>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`bcdfgjkmnoprtuvxz|~}while($_+=say)<9

让我们看看是否可以打印更大的数字:-)
John Dvorak

呃...你能帮我翻译第二行吗?
John Dvorak 2013年

1
@JanDvorak $=是当前输出设备中水平线的数量。默认情况下,60. ~-$=是二进制补码负数60的按位求逆,恰好是5973*2是146. .而且,你会期望他们什么。y[]{}是另一种说法tr///,即音译运算符。它$_不需要执行任何操作,因为您没有给它替换任何字符。它返回替换的字符数,即0。因此我们有~-$= . 73*2 , y[]{}= 59 . 146 , 0='591460'。
2013年

6

PHP 67字节

<?=U4eB1gkFdA6J9snZD2IE8y5PhwQV^xHGmqYMfNjKpbR3vcLalCWi0_TtrOSXouz;

输出:

-|"/@>& *+}:[!],'~(){.\`7#%$

似乎应该有一个65字节的解决方案,输出30个字符而不是28个字符,但是我无法使其排成一行。6个未使用的字符OSXouz已改为附加在字符串文字之一上。

编辑:进一步思考后,以这种方式生成的字符数不能超过28。UPPER ^ lower将始终导致一个介于32到63之间的字符,因此要求所有10位数字@[\]_`{|}~。其余22个中的4个用于脚本本身,仅剩下18个可以单独使用字母获得。决胜局可以大大改善。


嗯,肯定的话。我怎么会忘记了?
John Dvorak 2013年

3

Ruby,91个字符

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcefghijklmnqvwxyz|~};puts(?@‌​.ord*98+1)

输出6273

%{...} 扬·德沃夏克(Jan Dvorak)被盗的诡计


没有评论。明确指出。
Johannes Kuhn 2013年

@JohannesKuhn啊,没有注意到。编辑。
门把手

%{ !"#$&\',-/450:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcefghijklmnqvwxyz|~};puts(?@.ord*98+1)我想您要(用91个字符表示),将分号移到上面以用作可打印的分隔符(而不是换行符),并从大括号内删除字母“ ord”。
res

@res是的,很难处理所有这些字母:P
门把手

现在\已包含3次。
霍华德

3

Perl,61个字符

print$:x8^CJIBQTOWAEULHVGFNMKRPZY,q<#"/;*g~?|={.>&+u15m97ws26

输出:

c@db[yo]le_ah\jfD`kX}zS-! %)('v304

$:默认为" \n-"x8重复八次;然后,将24个字符的结果与23个字符的裸字符串按位异或(最后一个-保持原样)。第二部分是按位排列的12个字符的q字符串和10个字符的裸字符串(最后两个字符被丢弃)。


1
我发现您的程序长度为61个字符。
res

谢谢。由于EOF,我的文本编辑器报告了62个字符。
Grimmy

1

Ruby,95个字符,进行6次编辑

%{ !"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}

是的 而已。只是从未打印过的自由浮动字符串文字。Ruby支持以百分比类型定界符形式的字符串文字(我认为是从Perl借来的)-定界符是任何非字母数字字符,并且如果开头定界符是开头括号(其中的任何一个[({<),则结束定界符就是相应的右括号(允许使用嵌套括号)。

我意识到这更多的是基线提交,但是除非有人设法实际打印出东西,或者除非有一种语言带有两个字符的自由格式字符串文字且带有不同的打开和关闭定界符,否则这是最好的选择。


0

Tcl 96,编辑距离12

if 0    {!"#$%&'()*+,-./123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeghjklmnopqrstuvwxyz|~}

恐怕其中一个空格应该是制表符
John Dvorak

标签或空格是否可以打印?
约翰内斯·库恩

选项卡不可打印(ASCII 9),但空格可打印(ASCII 32)。
John Dvorak 2013年

1
[仅在您回答之后,OP才澄清了这一点:)]
flornquake 2013年

1
join {!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghklmpqrstuvwxyz|~} 似乎可以使用95个字符工作?(谢谢您的参与。很抱歉变色龙-不幸的是我编辑得很仓促,应该做一些不同的事情。)
2013年
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.