打印程序没有的每个字符


219

您的任务是构建一个程序(仅使用可打印的ASCII字符和/或制表符和换行符),以完全打印出可打印的ASCII空间(0x200x7e)中出现在程序源代码中的字符(以任何顺序排列)很多次)。

以任何语言执行此操作的最短代码都会胜出。


19
他们,但他们不在范围0x200x7e,这被定义为“可打印的ASCII字符”。从技术上讲,制表符和换行符实际上是控制字符。
Joe Z.

3
我们可以打印换行符(或其他任何不可打印的ASCII字符)吗?
flornquake

1
制表符和换行符不会以占据打印位置的方式呈现。他们移动位置。请参见ANSI C“ isprint”功能。
卡兹(Kaz)

1
这个问题如何恢复?它再次开始获得支持。
2014年

3
@Timwi:如果您想这样做,则还必须输出CJK字符空间中的所有字符(不包括出现在代码中的字符)。它管理起来太复杂了,因此我仅将其限制为ASCII。
Joe Z.

Answers:



274

多语种,95

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

什么也没做。


19
不,但这是一个polygot。我不想破坏它。
Johannes Kuhn

95
我将其输入到GNU Fortran编译器中,它被隔离。
marinus

12
在C中#undef X;whatever junk you want工作。
ugoren

6
也可以在Python中工作(因为它#用于Ruby和Perl之类的注释)
Doorknob

87
“使用任何语言执行此操作的最短代码都会成功。” 由于缺少适用于任何语言的代码,因此该条目应该会获胜,因为它是适用于最多语言的代码。;-D
msb

142

PHP 5.2,4

<?<<

另存为一个名为NYUIOMK()'DEAQRWVX[Z]\^@CBGFJqwv{z}|~`bgfkj203547698;=>!#"%$&+*-.php某处/homeshort_open_tag需要On在你的里面php.ini

输出为:

PHP Parse error:  syntax error, unexpected T_SL in /home/wherever/NYUIOMK()'DEAQRWVX[Z]\^@CBGFJqwv{z}|~`bgfkj203547698;=>!#"%$&+*-.php on line 1

42
哈哈,规矩很好。
约翰内斯·库恩

6
很好,但不幸的是我可以:在输出中发现a 。
霍华德


78
我非常感谢@TheGuywithTheHat,但是我大约在一年前(而不是昨天)回答了这个问题。
Ry-

9
@TheGuywithTheHat当漏洞很有趣,很新并导致您的链接元发布时,这是答案之一。现在不再了。
约翰内斯·库恩

48

JavaScript的-88

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

打印“ bcdfghijkmnpquvxyz”


13
哇,我喜欢toLowerCase的想法,真是太好了!
皮埃尔·阿洛德

2
您可以通过一点数学来保存三个字符:"!#$%&*+,-13:<=>?@[\]^_`{|}~AERTOWS";alert('BCDFGHIJKMNPQUVXYZ'.toLowerCase()+95*72)因为95*72= 6840并将浪费的字符移动到字符串中,您可以使用引号而不是浪费引号。除此之外,将字符隐藏在注释中感觉很俗气。
Umbrella

28

空格,61 57个字符

它不是最短的,但它可能具有最简单的逻辑(实际上只是一个循环)。

此处完全注释,其中S是空格,T是制表符,L是换行符:

SSSTSSSSSL     # push 0x20
LSSSL          # label S
SSSTL          # push 1
TSSS           # add
SLS            # duplicate top of stack
SLS            # duplicate again
TLSS           # output ASCII character
SSSTTTTTTSL    # push 0x7E
TSST           # subtract (result - 0x7E)
LTTSL          # branch to label S if top of stack is negative
LLL            # end

感谢@res对上述内容进行了更正(分支指令需要额外的重复项)以及较小的数字以压入堆栈。


1
这不能按原样工作,但是可以通过在条件分支(LTTSL)之前立即插入一个重复的栈顶(SLS)来解决-这是必需的,因为条件分支命令会删除栈顶。生成的64个字符的程序按公布的方式工作。(如果程序存储在本页面扩展名的文件,就可以在网上测试golf.shinh.org/checker.html
水库

1
另外,使用几乎相同的程序,但程序的长度可以减少到57,但三个推入数-94、127、126分别更改为32、1、126 :SSSTSSSSSL LSSSL SSSTL TSSS SLS SLS TLSS SSSTTTTTTSL TSST LTTSL LLL
res

我知道它已经超过5年,但你可以打高尔夫球5个字节通过改变label的标记(空)(LSSSLLSSLLTTSLLTTL),并在年底(三除去出口LLL)。在线尝试原始52字节,在此处突出显示和解释
凯文·克鲁伊森

22

C,83 74 69个字符

main(z) {for(;++z<96;"\33iE!vk?}GkRP8z"[z/7]&1<<z%7&&putchar(z+32));}

我确实试图将其降低到80个字符以下,但是我还无法实现。我最终决定发布我所拥有的,假设我(或其他人)会在发布此内容十分钟后找出79个字符的解决方案。好的,还不到十分钟,但原则上可以。

我真的很想发布一个不需要在源代码中留有多余空格的版本,但是那个版本落在了一个吸引人的轨道上,在少数解决方案之间反弹。经过数分钟的尝试,将其中一个推入稳定的解决方案后,我放弃并添加了空间。


21

Golfscript, 26 24个字符

"126,32>''+".~\-'.~\-"'-

取一个范围生成脚本,复制它,执行它,从结果中减去它,然后减去结果减码和另一个引号。


2
该死的,那很聪明。
marinus

1
删除''+,在减法前转义程序,放入noop .;(找不到覆盖点的更好方法),使用代码块代替字符串-> {126,33>`-.;}.~这是16个字符
Howard

无论您想多次使用任何顺序,都可以删除分号。
霍华德

@霍华德,我怕我不明白你的想法。您可以将其作为单独的答案发布。
John Dvorak

@PeterTaylor我以为我打印了一个空格?
John Dvorak

20

鱼-80

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

如果出现鱼错误,则会打印出“闻到鱼腥味……”。由于z是错误的指令,因此会立即出错


17

我知道它没有赢得任何比赛。我只是想尝试一种不常用的语言,只是为了踢球。

爪哇- 209个 195 152 140字

class a{public static void main(String[]a){for(char c=0;;c++)System.out.print("publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:}".indexOf(c)<0?c:"");}}

带换行符和制表符

class a{
    public static void main(String[]a) {
        for(char c=0;;c++)
            System.out.print("publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:} ".indexOf(c)<0?c:"");
    }
}

请注意是否执行:程序不会终止。哈哈

说明

  1. for(char c=0;;c++):由于char可以将a视为an int,因此我在这里利用我的优势遍历了所有可能的值c。为了省去字符,我省略了循环中的终止条件(两个分号之间的终止条件),因为没有指定程序必须终止。:)
  2. "publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:} ".indexOf(c)<0?c:"":可悲的是,这不是一个非常优雅的方法,但是它可以完成工作。手动列出每个存在于源代码作为一个字符String文字,则检查电流是否char c在其内发生与indexOf()。如果indexOf()调用返回-1,则该调用不存在,因此我们应该打印它。其余的仅使用三元运算符来节省字符和空格。

你能解释一下吗?
joey rohan 2013年

1
@joeyrohan当然,只需在下面添加一个说明。:)
asteri

很酷;)好东西:)
joey rohan

2
您可以将整个ASCII可打印表放在注释中,并创建一个不返回任何内容的Java程序。它击败了你的:-)
皮埃尔·阿劳

9
您可能已经告诉我,这将在我在终端中执行每个Unicode字符之前将其打印出来。
nyuszika7h 2014年

14

Perl,49个字符

say grep/[^+-246\[-^aceghmprsy]/,map chr,041..126

这是一个有趣的挑战-有点像反提要,而且我设法通过增加其中出现的字符范围来缩短程序两次。


14

红宝石,81 78 68 66 62 57

(?!..?~).map{|a|$><<a if/[()ifmap{}|?!.~\/\\\[\]$><]/!~a}

简单地检查自己。手动删除重复字符。

感谢Josh保存了4个字符,并感谢minitech保存了5个字符!


您不能将if放在$> << x之后以保存其中一行吗?
乔什

@Josh是的。我现在就做。
门把手

您可以将其带到58:(?!..?~).map{|x|$><<x if/[()ifmap{}|x?!.~\/\\\[\]$><]/!~x}
Ry-

1
嗯,还有一个更好的变量名称选择:57:(?!..?~).map{|a|$><<a if/[()ifmap{}|?!.~\/\\\[\]$><]/!~a}
Ry-

$><<((32..126).map(&:chr)-IO.read(__FILE__).chars).join使用不同方法的55个字节。
twe4ked

14

Befunge(48)

<|::-1,+*88:<+3*87
6<@.**85
9>"()~&"/%$ |!#';=?}

输出:{zyxwvutsrqponmlkjihgfedcba` _ ^] [ZYXWVUTSRQPONMLKJIHGFEDCBA240


天啊!干得好!
Cruncher

12

不是很严重,但是我不得不尝试一下:

杰克福(138152)

(在此处编译源代码)

原始资料:

for(x=0x7e;x>0x19;x--){
    console.log(String.fromCharCode(x).replace(/[\[\]!\+\(\)]/ig, ''))
}

打印除()+ []以外的所有字符


2
(x)<=> [x][+[]],增加了代码大小,但使所需的字母更小。
FireFly 2013年

12

您的任务是构建一个程序(仅使用可打印的ASCII字符和/或制表符和换行符)

天哪,您为APL付出了很多努力(这值得商lib吗?)
因此,我决定忽略所有规则

APL(Dyalog),3 10

⎕AV

打印原子向量(包括所有可打印的ASCII字符)


原来我完全忘记了“没有”部分...
但这很容易解决

⎕AV~'AV'''

~'AV'''表示排除(~)字符A,V和单引号(转义为双引号)

关于打印非ASCII,我将忽略所有规则。


“准确打印出未显示在程序源代码中的可打印ASCII空间中的字符(0x200x7e)”我相信输出可能不包含可打印ASCII空间之外的字符(“完全”为关键字) ,并且您的程序包含“ A”和“ V”,因此不应打印它们。
FireFly

1
您至少要添加~到排除字符集。;-)顺便说一句,类似的J解决方案将是a.-.'a.-'''
FireFly

2
您可以忽略所有规则,但这会使您失去被接受的答案的资格。
Joe Z.

11

GolfScript(18 16个字符)

"),@`^^32>#.~".~

在线演示,带有额外的一行,可进行正确性检查并输出错误的字符数。

(我有各种等效的替代方法。@`^可以用\\`; #可以用`或代替]。正确的组合可以与Howard的技巧结合使用以使他的分数等于15,因为反斜杠不需要像在字符串文字中那样在块中转义:{),\`^32>].~}.~但是,霍华德(Howard)值得称赞。



2
幸运的是,ascii结尾}~-代码块更好,请参阅我的新答案;-)
Howard

11

Brainfuck,173岁

+++++[->++++++<]>>>++[------<+>]<++++>>----[----<+>]>-[-------<+>]>-[---<+>]<------->>-[---<+>]<+++++++++>>--[-----<+>]<+++++>>+[---------<++>]+++++++++++++[<[.+<]>[>]<-]\=,

很长一段时间,我可能稍后再试。


6
编写不执行任何操作的程序,然后将其余的od ascii添加到源代码中,最坏的情况是感觉像是96个字符。
Jasen 2014年

10

J(52 40)

编辑:啊,忘了 e.

'''(-@.e#[)~95{32}a'(-.@e.#[)~95{.32}.a.

旧版本:

(>@(*/@('(>@*/''&~:).#]32{95}a'&~:)&.>)#])95{.32}.a.

其他变体(长度相同,但输出较少):

([#~*/"1@('([#~*/"1@''&:0)95{.32}a'&~:"0))95{.32}.a.

@ JanDvorak:错别字
marinus

该死!我希望我能在Ruby中低到足以打败您,然后将其
降到40。:P

新的看起来更奇特。
约翰·德沃夏克

1
@Doorknob:我在APL中只有一个字符,只有24个字符,但是其中有非ASCII字符。
marinus

是的,我做了ASCII指令来避免使用APL之类的语言。
Joe Z.

7

Python 3- 68 61

x=r"print(*set(map(chr,range(32,127)))-set(x+'=\"'))"
exec(x)

...感谢@WolframH的改进。


1
我想你可以把exec(x)在新线和保存;x。另外,在Python 3中,您可以使用x=r"print(*set(map(chr,range(32,127)))-set(x+'=\"'))"\nexec(x)61个字符(打印多个空格,这是允许的)。
WolframH

@WolframH巧妙,谢谢!

7

的PowerShell:96

必须保存并作为脚本运行。

diff([char[]](gc $MyInvocation.InvocationName))([char[]](32..126))-Pa|?{$_.SideIndicator-eq'=>'}

diff是的内置别名Compare-Object

gc是的内置别名Get-Content

$MyInvocation.InvocationName 获取正在执行的脚本的完整路径。

32..126是的十进制等效项0x20..0x7e,因此创建了我们要查找的十进制ASCII代码数组。

[char[]]获取下一个对象的内容,并将它们放入数组中,将其分解并将其转换为ASCII字符。因此,我们现在有两个ASCII字符数组-一个从此脚本中提取,另一个由质询条件定义。

-Pa设置Compare-Object为“ Passthru”格式,因此只有在输入之间发现不同的项目才会在控制台上输出-哪些项目属于哪些输入的指示符仍存储在对象数据中,但不会显示。

|?{$_.SideIndicator-eq'=>'}Compare-Object输出的管道传递到Where-Object,将其过滤到仅第二个输入专有的项目。


Sane很有启发性。
斯特凡纳·古里科

7

PHP-92

<? //A"$%&'()*+[,.]0123456789:=-@ABCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcdefghijklmopqrstuvwxyz{|}~#

输出:

没有

OP要求打印所有未使用的字符,嗯,我只用它们


<?='A"$%&\'()*+[,.]/0123456789:=-@ABCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcdefghijklmopqrstuvwxyz{|}~#'
jocap 2014年

我知道会有只使用所有字符的提交。
MilkyWay90

这不使用字符!;>Xn
Jo King

6

Javascript,92

(function f(){for(i=32;126>i++;)!~(""+f).indexOf(c=String.fromCharCode(i))&&console.log(c)})()

这是一个公平的解决方案吗?alert('!“#$%^ * + /-。/ 0123456789:; <=>?@@ ABCDEFGHIJKLMNOPQRSTUVWXYZ [] ^ _`bcdfghijkmnopqsuvwxyz {|}〜')以95个字符出现,愚蠢得像地狱。:p
崔斯汀

2
@tristin:P是的,关于字符编码字符串,JavaScript有点冗长。它不是输出程序没有的每个字符。警报文本也在程序中:)
C5H8NNaO4

1
哈哈,哎呀。那好吧。
tristin

6

Java-126个字符

最小化:

class hjq{public static void main(String...w){for(char z='"'|0;++z!='a';)if("'()+.0;=OS".indexOf(z)==~0)System.out.print(z);}}

未最小化:

class hjq {
    public static void main(String... w) { 
        for (char z = '"'|0; ++z != 'a';) {
            if ("'()+.0;=OS".indexOf(z) == ~0) {
                System.out.print(z);
            }
        }
    }
}

这是一个有趣的问题,因为各个令牌可能会因为重用字符而受益于其较长的格式。例如,通常String[]会更短一些,但String...不需要使用条件字符串中的方括号。

我发现诀窍是尝试在范围的开头和结尾使用字符,以便您只需更改循环的开头和结尾就可以将它们从输出中排除。

对于Java,要排除的关键字符是",因为在字符串中包含该字符需要对其进行转义,这会增加\您的程序,而该程序又需要放在字符串中,并会加上\\。通过"从条件字符串中删除,可以删除4个字符。这可以通过确保您使用来实现,并!与开始从你的循环#

所有的小写字母出现在附近范围的结束,只用{|}~在他们之后到来。由于Java的冗长性,大多数小写字母仅用于样板。同样,{}是平凡的Java程序,因为样板需要他们。

|可以在有or条件的情况下使用,但是我找不到一种方法来利用导致一个较短程序的方法,而不仅仅是|用作按位运算符。这|0让我感到有点脏,因为这是唯一可以使角色进入其中的动作。

~0收益-1,这很方便,因为这是我们需要检查的indexOf。将此与!=用于条件循环使用相结合,就<完全消除了字符,这意味着它不需要进入条件字符串中。


5

sh(47)

tr</dev/urandom -cd \[:print:]|tr -d "`cat $0`"

使用自我引用方法。假设/dev/urandom最终将每个字节至少输出一次。不终止。

如果假设man已安装,则可以改用ascii(7)联机帮助页(因而有一个终止程序)(44个字符,感谢@fennec)。

man ascii|tr -cd \[:print:]|tr -d "`cat $0`"

您能否使用另一个可能具有较短名称的文件,从根本上保证它具有所有可能的八位位组?甚至可能终止?我在想像/ dev / memory之类的东西。

@fennec如果我们假设manzsh安装,man zshall似乎符合这个标准。我可以将其添加为变体。
FireFly 2014年

man ascii我想可以为您节省另一封信。

tr您正在使用哪个?GNU tr-in“ cat $0”视为范围运算符,这会破坏输出。
Toby Speight,

顺便说一句,如果ascii已安装该程序,则可以使用代替man ascii
Toby Speight,

5

位移位,1038字节

BitShift是仅支持01作为语法的语言。我认为打印所有其他字符会很容易,但是由于它并不真正支持循环,所以最终仍然占用了1038个字节。
但是,我相信不可能做到比这还小。

101001100101011011010100110111010100100101011001101111010100100101011001000101011011010100101100110110101001001010110010001010110110101000001101010010010101100100010101101101010000010000011001010110110101000010000101011011010100110111010100100101011111100101011011010100110111010100100101011001101111010100100101011001000101011011010100000000011010100100101011001000101011011010100110010000101011011010100110111010100100101011001101001101010010010101100100010101101101010011001000010101101101010011011101010010010101111011111110010101101101010011011101010010010101100101100101011011010100010001010110110101001000010101101101010011011101010010010101110111110010101101101010011011101010010010101111111100101011011010100110111010100100101011111011110101001001010110010001010110110101001000100000101011011010100110111010100100101011111010011010100100101011001000101011011010100100000101011011010100110111010100100101011001101111010100100101011001000101011011010100010000010101101101010011011101010010010101101001101101010010010101101001101010

版画

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

在这里尝试


4

绝对是这里最长的解决方案,但是用Lino编码总是很有趣:

油毡 -655 523个字符

"libraries"/arch/cpu/base;/hmi/conout;/data/bytes;/data/string/t2s;/data/heap;/data/heap/connect/mgrab;"stockfile"a;"directors"displaystatus=engage;"injection"c=524;b<-bytes.bytesizeconvert:c;b<-heap.alloc:b;a<-heap.alloc:c;[filecommand]=readfile;[filename]=stockfile;[fileposition]=0;[fileblocksize]=c;[fileblockpointer]=b;arch.fileread;[string.psource]=b;[string.ptarget]=a;string.t2s;b<-heap.alloc:7fh;c=32;d=b;"f"[d_32]=c;+c;+d;?c<7fh>f;"w"d=[a];+a;?d=0>y;?d<32>w;?d>7eh>w;e=b;e+d;[e]=33;^w;"y"b+32;"v"conout.say:b;bye;

没有注释,只读取编译成二进制文件的源代码。另存为a.txt,否则将无法编译!


4
不,JSFuck更长。
Joe Z. 2014年

4

Brainfuck,133个 123 114 110字节

++++++++++++++++[->++++++>++>+++>++++>++<<<<<]>-->>->->+[---<.+.+<.+<.+<.+.+.+>>>>]++[-<.+.+.+<.+>>]<+.<+.<++.

对以前的解决方案进行了更多修改(在我意识到以下内容较小之前-尽管这是在我进行一些重大优化之前)。这可以通过存储4组ascii数字并通过一些棘手的循环进行打印来完成,然后再提供丢失的字符(即,无效ascii数字之间的字符)。

原始提交

>>+++++++++++[<+<+>>->++>+++<<]<++>>++++++>>+++++[-<<<++++++>>>]<<<+<<[->>+.<<]>>++.++<[->+.<]>++.+>[-<+.>]<++.+>>[-<<+.>>]

它执行以下操作:

  • 创建包含11、13、28、33的4个寄存器
  • 用值31创建一个5th以开始打印
  • 打印ascii 32-42(11)
  • 打印ascii 44
  • 打印ascii 47-59(13)
  • 打印ASCII 61
  • 打印ascii 63-90(28)
  • 打印ASCII 92
  • Print ascii 94-126(33)

4

哈斯克尔(70)

import Data.List
main=putStrLn$[' '..'~']\\" \\\"$'.=DLS[]aimnoprstu~"

通用程序集减去一串程序中无聊的重复字符。尽管它的长度令人惊讶地清晰可见,但它远非代码高尔夫的赢家。

(现在用列表减法代替filter/ notWith。)


您可以更改import Data.Listimport List
骄傲的haskeller 2014年

。@ proudhaskeller嗯,真的吗?当我尝试使用runhaskell“找不到模块'列表'” 时,它似乎不起作用。我注意到我会错误地计算字符数,因此我进行了更正。
FireFly 2014年

1
好吧,那很奇怪,可以用ghc或ghci尝试吗?它对我
有用

@proudhaskeller不,不能正常工作。这是与GHC 7.8.3。
FireFly 2014年

3

J-21

(u:32+i.97)-.1!:1<":5

将此写入5当前目录中的文件。然后加载执行脚本0!:1<'5'

或25个没有文件把戏的:

(-.~".)'(":u:32+i.0-~95)'

源代码包含',不会从输出中删除。
FireFly 2014年

3

Clojure(142、106,103)

(defn -main[](let[c"(fn[l](pr(reduce disj(set(map char(range 32 126)))l)));-\\\"o"]((load-string c)c)))

格式化:

(defn -main []
  (let [c "(fn[l](pr(reduce disj(set(map char(range 32 126)))l)));-\\\"o"]
    ((load-string c) c)))

认为这样做,可能需要一些调整。输出:

#{@ ` ! A B b # C $ D % E & F ' G H I * J + K k , L M . N / O 0 P Q q R S 4 T 5 U V v 7 W w 8 X x 9 Y y : Z z { < | = } > ^ ? _}

在其本身上运行字符串,该字符串是可评估的clojure代码。字符串末尾有一些注释,以获取字符串外使用的字符(主要方法等)


3

Python 2,69

for x in range(38):print chr(x+59)#!"$%&'*,-./012467bdjklmqsuvwyz{|}~

我使用最长的(我能找到的)连续字符序列,可以打印出来并将其他字符添加为代码后的注释。


8
我不会赞扬任何有评论的内容
John Dvorak

我的回答应该显示解决该任务的最坏方法。(使用注释漏洞)。
Johannes Kuhn

9
确定...除外多种语言的是什么,但评论。
John Dvorak

@JohannesKuhn但是,由于它是最长的代码,因此无法赢得比赛。:P
JoeZ。13年

5
@JoeZ。如果您用它所使用的语言数来划分,它可以赢得很大的
John Dvorak
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.