编写一个使用所有可打印的非字母数字ASCII符号的程序


17

特别是,在源代码中至少应至少使用一次这些符号:

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

注释,字符串文字,正则表达式(或任何其他种类的文字等)中的符号不​​计算在内(但它们的定界符例如/**/""做计数)。

该程序不应执行任何操作。它只需要编译,运行时不执行任何操作。

如果由于某些原因某些符号不能用您选择的语言使用,请进行严格说明(必须排除哪些内容和原因)。

更新:一些答案使用了带有正则表达式的符号。我认为这有点问题,就像将它们放入字符串文字或注释中一样(这就是为什么我在该要求中放入)的原因。请尝试使用此功能。我还更新了上面的要求。

更新:最短的代码获胜(标记为code-golf)。如建议的那样,我们很可能需要打破常规的条件。我建议,如果有平局,则获胜者是ASCII符号尽可能按顺序出现的一种。形式上:从程序中筛选出每个列出的符号的第一次出现。这将导致列出符号的排列。排列次数少的程序将胜出。

更新:我很高兴看到一些常规/主流语言的解决方案,例如C(++),Java,Scala,Haskell等。


1
对于在特定语言中没有出现在任何关键字,语法或运算符中的字符,我们可以使用文字文字例外吗?除了作为文字的一部分(在足够新的版本中,c 可以出现在有向图中)@%,反引号都不会出现在c 中。(并且仅出现在预处理器指令中,但我们只需要忍受它)?也就是说,我要求Matt的方法必须明确合法。%#
dmckee 2012年

2
最短的代码胜出?我怀疑也将有一个打破
常规的

1
在Javascript中,字符#@和`在任何类型的文字之外都是非法的
Peter Olson

6
这基本上是“寻找一种可以使用所有这些字符作为语法的语言”的竞赛。在我看来
非常

1
是的,我同意@Earlz,我认为如果必须做一些有用的事情,在租赁的大量代码中会更好,那样人们不仅会虚张声势获取所有字符,而且不是ardnew的解决方案。按目前的情况,您不能再短那么一点了,加上一些文字之外的某些字符无效的语言(正如一些人所指出的那样)会立即被取消资格。这意味着不仅只有几个可接受的答案,而且还有正确的答案期限。
瑞安

Answers:


18

Brainf * ck,32个字符

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

打印一张笑脸(如果您的控制台可以输出ASCII符号1)

Yay,一个击败Golfscript的Branf * ck解决方案!:P

如果您坚持不输出,只需交换+.

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

6
嗯...我宁愿说它确实在注释隐藏了字符,但是哦。
停止转动逆时针

5
@leftaroundabout:从技术上讲,它们不是注释,因为您不能使用它们注释掉有效的说明。它们被视为空白。顺便说一句,我同意你的看法,这是对规则的无耻延伸。
vsz 2012年

3
@vsz弯曲规则没有错。
Gareth 2012年

1
此解决方案的反转数为24,因此根据规则,它是获胜者。我对此有些怀疑,因为忽略字符非常接近注释,但是我认为这很不好,在编写问题时我没有想到这种可能性。
PetrPudlák'12

1
@BodoThiesen确实,这已经很老了,我猜这也许也有资格成为一个成功的解决方案,尽管这个方法更好一些,尽管它稍微延长了规则。
PetrPudlák'16

47

Perl,32个字符

注释,字符串文字或正则表达式中没有隐藏符号。仅使用一次所有符号。

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

描述

我试图用缩进指示运算符优先级:最右边的表达式在它们左边的表达式之前进行求值

        $`            # scalar variable $ named `
      <               # numeric less-than inequality <
        @"            # array variable @ named "
                      #   (array evaluated in scalar context)
    ^                 # bitwise XOR ^
        [(\{_},)]     # array reference [] 
                      #   containing array () 
                      #     containing reference \
                      #       to anonymous hash reference {}
                      #         with one key "_" 
                      #           and no value (nothing following comma ,)
                      #             (reference evaluated in scalar context)
      /               # numeric division /
        +-~%'         # unary addition +
                      #   and unary negation -
                      #     and bitwise complement ~
                      #       on hash variable % named '
                      #         (hash evaluated in scalar context)
  ?                   # ternary conditional operator ?:
    &|                # code reference variable & named |
  :                   # ternary conditional operator ?:
    ! *.              # logical negation !
                      #   on typeglob variable * named .
                      #     (typeglob evaluated in scalar context)
  =>                  # fat comma => for compound expression
                      #   (evaluates LHS as string, RHS is empty)
;                     # end of expression ;
#                     # start of comment #

如果我错了,请指正我,但是您只是制作了一个标量称为`<@"^[(\{_},)]/+-~%'?&|:!*.=>
骆马先生2012年

2
@GigaWatt不,这是几个不同表达式的序列。我将添加有关其评估方式的说明
ardnew

@GigaWatt:不;在Perl中,符号标识符都是单个字符。诸如此类的事情,我觉得这个程序只使用$`@"%',和*.(标量,数组,散列,和类型团,分别),虽然这是非常难以确定。。。
ruakh 2012年

23
您是个天才,或者任何随机字节序列都是有效的Perl程序。或两者。
ugoren

4
尽管根据我自己的规则,我不得不授予Brainfuck解决方案,但该解决方案是我的最爱(大小相同,但反转号为279)。
PetrPudlák2012年

9

空格,32

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

所有非空白字符都将被忽略,因此这实际上是一个空程序


3
因此,可以辩称所有非空白字符均为注释,这是无效的:)
NRGdallas 2013年

8

Python 65

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

我使用了字符?$字符串文字。这些字符不是合法的外部字符串文字或注释。


这包含无效的语法。具体来说,它{[`'"$?'`,]}是无效的,因为它创建的字典中的键没有关联的值。您可以使用另外两个字符来使其生效,例如:{[`'"$?'`,]:0}
Strigoides 2012年

1
@Strigoides不,它不是一个字典。但是即使是这种情况(无值的dict键),它也会运行,这是必需的,不是有效的语法。(您需要python> = 2.7才能正常工作)
Matt

我知道,我在测试时使用的是python 2.6。
Strigoides 2012年

8

PHP,32个字符

这个PHP程序也可能是QUINE,可能有点古怪,并且按照列出的确切顺序使用所有符号。

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

从命令行执行,输出将只是文件的内容,因为没有<?php调用解释器的内容。

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

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

4
恕我直言,这违反了注释内的符号,字符串文字,正则表达式(或任何其他种类的文字等),因为整个程序是单个文字。
彼得·普德拉克(PetrPudlák)2012年

同样,任务所需的程序应该什么也不输出,只有一个quine却什么也不输出。
圣保罗Ebermann

它甚至没有被PHP解析,所以这几乎是无效的
Rob

@RobQuist当然会被解析,它正忙着寻找难以捉摸的T_OPEN_TAG令牌,直到痛苦的结局
Leigh

7

Perl 6(43个字符)

让我们用一个非常不寻常的名称定义一个infix运算符:

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

它不是文字,也不是RE中的文字,也不是注释中隐藏的任何内容。你不相信我吗 运行以下程序将输出“ 2”:

sub infix:<!"#$%&'()*+,-./:;=?@[]^_´\|~>($a, $b){ $a + $b }
say 1 !"#$%&'()*+,-./:;=?@[]^_´\|~ 1;

但是我非常确定,您的挑剔者将进一步扩展规则,以排除对语言本身的重新定义,从而使我们的perl笨拙的人不满意。:(


我会说没关系,在标识符中使用符号似乎是合理的。
彼得·普德拉克(PetrPudlák),2012年

7

Haskell,53岁

a@""#%&*+/?^b|a'<-a!!0=(\_->a`b`[]);main=do{print$1}

我们可以把它缩短一点

45

a'@""#%&*+/?!<|^b=(\_->1`b`[]);main=do{main}

但是这个计划不会终止,并使用更多的字符('!''<''|')在新定义的中缀。


5

k(33个字符)

k很容易。不幸的是"必须配对。

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

5

GolfScript(33个字符)

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

"必须配对。要花点时间才能使它什么都不输出-结果的大多数其他位置都:'在某些输出中。


5

J,33个字符

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

' 需要加倍以避免语法错误。

我的第一个答案是缺少一些符号。


5

C,48个字符

有点作弊。

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

2
当它们大多数出现在一个未调用的宏中时,一定会推动“作弊”的界限。#define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \);` 怎么样。没有一个字符串,它只是被转化为一个......这将是当然的更长。
dmckee 2012年

@dmckee,我认为您的建议没有我的诚实。在两种情况下,有问题的字符都不会出现在代码中。我可以将它们中的大多数移动到代码上(就像我对进行的操作一样"";),但是$@反引号似乎毫无希望。
ugoren 2012年

毫无疑问,该矿犯规,阴险和狡猾。但这也很有趣。
dmckee 2012年

@dmckee,有趣的是它的意义。顺便说一句,你需要#define Q(_) #_。预处理器将"##_##"视为字符串文字。
ugoren 2012年

5

后记-32个字符

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

在堆栈上产生一个对象,但否则无效。附言允许标识符中的几乎所有字符,除了<>()[]{}/特殊的语法形式和%引入注释外。该程序被标记为

{                  % start a procedure object
!"#$&'             % an identifier
()                 % an empty string
*+,-.              % an identifier
/:;=               % a symbol
<>                 % an empty hex string
?@                 % an identifier
[\]                % an array
^_`~|              % an identifier
}                  % close the procedure object
%                  % a comment

3

C#(91个字符)

#define a 
class a{static int @Main(){return(char)1.1*""[0]/1%1-1+1!=1?1:~1^1>>1<<1&1+'\0';}}

据我所知,$字符不是字符串文字之外的有效字符,因此我没有在答案中使用它。

编辑:感谢彼得·泰勒,我缩短了代码。


1
#if A... #endif#region... 短#endregion。并且"x"[0]+比短[System.STAThread]
彼得·泰勒

3

PowerShell(52个字符)

$_+=(@(1.1,1)[0]-1)*1/1%'1'::ToInt|&{!"">~\1}<#^#>`;

我不得不将^字符用作字符串文字,因为据我所知,^字符不是字符串文字之外的合法PowerShell字符。如果我错了,请纠正我。

我发现适合字符的唯一方法是使用::运算符来调用静态方法。


3

方案,41个字符

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

这利用了Scheme对变量名中字符的难以置信的容忍度。在此程序中,我创建了一个名称为!$%&* +,-。/:<=>?@ [] ^ _`{|}〜的变量,Scheme对此很满意。



3

C:83 56个字符

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

符号和反引号不是允许的C语法的一部分,因此我将它们放在引号之间。


1
为什么在括号内(b)?这是奇怪的语法,而且浪费字符。
ugoren

1
如果对点使用struct,0.0则长度要短得多。
ugoren

我怎么能不想到(0.0)呢?括号是他们实际保存一个字符后的剩余内容,但现在确实不再需要了。谢谢@ugoren!
2013年

我认为main(_,$)会保存角色。
ugoren

并与海湾合作委员会,你可以写x?:y,但它也不是标准C.
ugoren

2

普通Lisp,33个字符

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

上面的主要部分对#+()名为以下符号的符号求值(或更确切地说,如果不是在前面,则求值):

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

#+()是避免输出。我不确定|foo|符号的语法是否算作文字,但是在Common Lisp中将符号用作变量/函数名称,并且已经有一些答案使用了必需的字符。


2

Smalltalk(Squeak 4.x方言)38个字符

在对象中实现此方法,如果“首选项允许”下划线分配(默认设置),则语法有效

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

如果是交互式的,则在弹出菜单中将Z声明为全局变量

说明:

  • %&* + / <=>?@!〜是二进制选择器(运算符)
  • y是参数(操作数)
  • “”为空注释
  • ^表示回报
  • Z是全局变量
  • _是一项作业
  • ()分隔子表达式
  • [:z |]用一个参数z分隔代码块
  • {}分隔数组
  • #''是由空字符串(数组的第一个元素)组成的Symbol文字
  • ,是发送到上述Symbol的二进制消息
  • $`是字符文字,用作上述消息的参数
  • ; 用于链接发送到同一符号接收器#的第二条消息
  • 第二条消息是-
  • y用作第二个消息参数
  • 。用于分隔下一条指令(这里是最后一个句号)

该死,谁说Smalltalk可读性强?

请注意,我没有作弊,唯一的无效字符`被放入文字字符中。编辑看下面,这是一个错误的断言(至少在Squeak中)


但是我们可以用这个技巧将其减少到34个字符

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

这次:

  • #()分隔文字数组
  • 其中包含4个文字符号:_; `和1个文字字符$'

严格来说,我们可以认为这是作弊……这不是文字上的字符串,但它仍然是一个非空的文字上……

我仍然必须对引号“”加倍注释(除非我用$来使它成为文字字符,但随后我需要对字符串加引号“”加倍)
我仍然必须对参数使用字母(即使_也不被接受我们将选择器中的 “首选项允许下划线”设置为true)。

很好的是,我们甚至可以运行该方法,例如,使用参数2将消息发送到1:

1%&*+,-/<=>?@\!~|2

最后以不带作弊的35个字符进行编辑

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

笔记:

  • 首选项允许使用名为x_的块参数在选择器中启用下划线
  • 与我所说的相反,`是二进制选择器的有效字符
  • 我也使用$'来避免双引号

1

R:108个字符

a=new(setClass("a",representation(b="list")));a@b=list(c_d=1:2);if(1!='\t'&.1%*%1^1>a@b$c[1]/1|F){`~`<-`?`}#

显然,最长的提交,但要能使用符号@$在R,我们需要创建一个具有插槽(使用索引的对象@)和命名的元素(使用索引$)。
我能想到的最短的解决方案是创建一个新的object(a=new(setClass("a",representation(b="list"))))类,它会付出代价。否则,请参考不需要解释的经典作品(例如!=#1:2),

`~`<-`?` 

创建一个与操作符相同的新操作符?(即,它调用其前面元素的帮助页面)。

%*%计算两个矩阵的内积(此处为1^1.1)。
符号_在R中,不执行任何操作(AFAIK),但通常在变量或函数名称中使用,如此处所示。


1

TI-Basic,36岁

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

这是无效的,因为开始引号经常用于注释。
Tyzoid

@Tyzoid我将其移至末尾。
Timtech,2013年

End结束循环语句,而不是程序。我想你的意思是Return
lirtosiast
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.