最短排序的Hello World


27

编写一个无需输入即可打印Hello, World!到stdout或您的语言最接近的替代程序的程序。值得注意的是,程序中的每一行只能包含可打印的ASCII字符,并且必须按字典顺序(也就是排序)排序。

以下是按顺序排列的所有95个可打印ASCII字符:

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

因此,例如,该行将!!A0~无效,因为A0顺序混乱。该行将!!0A~有效。

程序中的每一行可以是任意长度,并且可以有任意数量的行。空行被认为是已排序的。程序中的每个换行符都必须相同(不能混合使用\n\r\n)。禁止使用制表符和其他不可打印的ASCII字符。

由于需求旺盛,获胜条件已改变:
最少的提交获胜。Tiebreaker进入最短的程序(换行符视为单个字符)。

Hello, World!和可选的尾随换行符应输出。请注意,HQ9 +无效,因为它输出hello, world。我可能会禁止使用类似于HQ9 +的具有一个字符“ Hello,World!”的语言。命令的琐碎性。

暗示:

这是绝对有可能在一元Lenguage,虽然不是很简明。


7
现在有点晚了,但是不知何故我觉得最少的行然后最少的字节可能更有趣……
Sp3000,2015年

6
@ Sp3000我们需要采取综合措施,否则Unary和Lenguage意味着只有1班轮可以竞争。
isaacg 2015年

@ Sp3000也许,我只是想确保Unary / Lenguage不太可能获胜。我愿意更改它(对不起isaacg)。如果您同意,请Up Spte Sp的评论。
加尔文的爱好2015年

@ Sp3000我接受了您的建议。查看更新。
加尔文的爱好

顺序可以逆吗?例如,从左到右阅读?
Ismael Miguel 2015年

Answers:


17

头颈,1行,366字节

                                                                        $(((((((((((((((((((((((((((((,000000044888<AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIIIIIIIIIIIILPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPTXXXXXXXXXXXXXXXXXXXXXXXX\```diiiiiilqqqqqqqqtyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy|

Headsecks是一个简单的Brainfuck替代品,其中唯一重要的是代码点模8。等效的Brainfuck仅仅是

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++.+++++++..+++.-------------------------------------------------------------------.------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.+++.------.--------.-------------------------------------------------------------------.

幸运的是,这种幼稚的方法正好适合。向下移动字节有一定的潜力,但这可能很难。

使用此Python解释器进行了测试。


产生程式码

code = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++.+++++++..+++.-------------------------------------------------------------------.------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.+++.------.--------.-------------------------------------------------------------------."
command_map = "+-<>.,[]"

last_point = 32
out = []

for char in code:
    curr_mod = command_map.index(char)
    last_mod = last_point % 8

    if curr_mod > last_mod:
        last_point += curr_mod - last_mod

    elif curr_mod < last_mod:
        last_point += (8 - last_mod) + curr_mod

    out.append(chr(last_point))

print("".join(out))

那太聪明了!+1
theonlygusti 2015年

您可以使用较短的BF程序,还是出于某种原因以特定方式构建了该程序?我尝试了在生成器中使用的BF程序,但是输出中包含一些unicode。
mbomb007

1
@ mbomb007较短的BF程序的问题在于,即使这种幼稚的方法也会在代码点124处结束,所以我认为没有足够的摆动空间来引入新的字符……
Sp3000,2015年

30

///,7行,22字节

/
//Hello
,
 Wor
l
d
!

///极有可能具有竞争力(只要没有人以Unary和Lenguage开始...)。

代码首先遇到/,然后解析

/
//

作为替换指令,可从程序的其余部分中删除所有换行符。之后,程序只读取

Hello, World!

逐字打印,因为它不包含任何进一步的斜杠。


19
我什至没有意识到URL可以连续包含多个斜杠。
Alex A.

4
@AlexA。IIRC花了几个月的时间才能使该URL正常工作。我们必须继续重命名该文章以应对服务器配置和MediaWiki配置的更改。

17

JavaScript(67 66 62行 227 269字节)

(注意:仅在Firefox 36和Safari 8上进行过测试,包含较小的ES6功能(Set该类))

Z
=
!""+
(0[[]]
+
(
!!""+Set
));c
=Z[~
-22]
$=Z[
3]
$$=Z[
15]
$$$=Z[
24]
$$$$=Z[
1]
$$$$$=Z[
0]
Set
[c
+
$$$+Z[
5]
+Z[
16]
+
$$$$$+
$$$$+Z[
2]
+c
+
$$$$$+
$$$+
$$$$]
(Z[
14]
+
$$+
$+
$$$$+
$$$$$+
"(\
'H\
"+
$+
$$+
$$+
$$$+
",\
 W\
"+
$$$+
$$$$+
$$+Z[
6]
+
"\
!')\
")
()

上面的代码基本上可以做到:

alert("Hello, World!")

显然alert没有排序。因此,我们需要将语句生成为字符串,然后对其进行“评估”:

s = "alert('Hello, World!')";   // generate this using sorted code
eval(s)

如何生成字符串?ES5支持行连续,因此

"AL\
ERT" === "ALERT"

但是字符代码\出现所有小写​​字母之前,因此我们必须使用其他方法来生成小写字母。

我们在这里借用JSFuck的一些想法。警报语句中涉及的小写字母为:

t e r a o l d

所有这些都可以从标准对象的字符中提取,这些字符可以按某种排序顺序表示:

t, e, r ← true      = !""
a, l    ← false     = !!""
o       ← function  = Set
d       ← undefined = 0[[]]

我们如何评估字符串?当然我们不能使用,eval(s)因为它没有排序。或者,我们可以使用Function(s)(),但Function由于也未排序,因此我们无法使用。但是,Function是所有函数的构造函数,即Set.constructor === Function

添加标识符constructor会使小写字母列表变为:

t e r a o l d c u n s

幸运的是,它仍然可以通过"truefalseundefinedfunction"以下方式生成:

t, e, r, u ← true      = !""
a, l, s    ← false     = !!""
o, c, n    ← function  = Set
d          ← undefined = 0[[]]

美化之后,上面的代码应如下所示:

// lines 1~8 defines our string containing all lowercase letters we want
Z = true + (undefined + (false + Set))
// Z = "trueundefinedfalsefunction Set() { [native code] }"

// lines 8~20 defines the variables `c`, `$` (e), `$$` (l), `$$$` (o), 
// `$$$$` (r), `$$$$$` (t)
// for the corresponding lowercase letters extracted from `Z`

// the rest calls:
Set["constructor"]("alert('Hello, World')")()
// lines 22~36 generates the "constructor" string
// lines 37~61 generates the "alert('Hello, World')" string

更新:重命名ELORT对各种重复$以减少4行。


2
绝对辉煌​​!我肯定不知道是否可以在Python中使用相同的策略时间(区分大小写)。
mbomb007'3

非常好!请注意,=Z[3*7]可以这样写,=Z[~-22]即只需要一个换行符而不是两个。
我和我的猫

@ mbomb007是的,但是空格是空格,它们在ASCII字符集中是第一个……
哈里·比德尔2015年

@meandmycat谢谢!更新。
kennytm


11

Cygwin bash,16行,60字节

这仅适用于Windows上不区分大小写的文件名,并且Cygwin即使不将其设置为不区分大小写地识别路径,也不会区分大小写地查找实用程序。

A\
=Hello
A\
+=\
",
"Wor
A\
+=l
A\
+=d
A\
+=\
!
E\
CHO\
 $A

最后请注意ECHO


我不确定这是17行还是16行(末尾有新行),但是无论哪种方式,这都不会赢。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2015年

您赢得了10票,已经很多了。截止目前为止,投票最多的人有12个投票!// //解决方案有23个支持。
伊斯梅尔·米格尔

11

> <>,6行,111字节

  """""""/;;Hello
        &\o
      &++\oooo~~
"++++++++\bbbdlr
    +++++\ccccccccfooo}
    $++66\cfffffooooopr

我很难打出一条额外的线,但是无论如何我都乐于击败7线方法。

说明

> <>是基于堆栈的2D语言,其中指令为单个字符,程序流可以为上,下,左或右。该"指令切换字符串解析,将字符推入直到达到关闭为止",但是由于> <>的性质,因此不存在诸如CJam的字符串或Python的三引号字符串之类的“多行字符串解析”之类的东西。事实证明这是一个主要问题,因为不允许以a开头和结尾的行"以及介于两者之间的其他字符(例如"some chars")!

注意/\反映了程序流程,因此我们实际上先执行第一行,然后以相反的顺序执行所有行,而实际上大多数行都向后执行!

[Line 1]

""""""              Three empty strings, push nothing
"/;;Hello  "        Push "/;;Hello  ". Note the wrapping - ><> is toroidal!
""""""              Three empty strings, push nothing

[Line 6]
66++$               Turn the top " " into "," by adding 12, then swap top two
rp                  Reverse stack and pop top 3
ooooo               Print "Hello", stack is now " ,"
fffffc              Push some 15s and a 12

[Line 5]
+++++               Sum the 15s and 12 to give 87, or "W"
}ooo                Move "W" to the back and output ", W"
fcccccccc           Push a 15 and some 12s

[Line 4]
++++++++            Sum the 15 and 12s to give 111, or "o"
"rldbbb\++++++++"   Push chars to stack
r                   Reverse stack
ld                  Push length of stack and 13, not used
bbb                 Push three 11s

[Line 3]
++&                 Sum the 11s to give 33, or "!" and put in register
~~                  Pop top two
oooo                Print "orld"

[Line 2]
&                   Put "!" from register to stack
o                   Print "!"

[Line 1]
;                   Terminate

附带说明一下,这是一个有趣的尝试,即>>最小字节(23行,47字节):

v
"
!
d
l
r
o
W

,
o
l
l
e
H
"
/<
l
?
!
;
o
\^

2
在第二个代码中,由于垂直环绕,您可以节省2个字节:pastebin.com/heqCr1vJ
randomra

10

CJam,5 4行,162字节

"Hello
")))))))))))))))))))))))))))))))))))68S\cel
"Wor
")))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))@SX\c|

与失眠症的行数相同!(但更多字节)

在线尝试

说明

"Hello\n"        Push "Hello" and a newline
)                Uncons the newline
)))...)))        Increment the newline into a ","
68S\             Push 68 and a space then swap, leaving 68 on top
c                Convert 68 into a char "D"
el               Lowercase "D" into "d"
"Wor\n"          Push "Wor" and a newline
)                Uncons the newline
)))...)))        Increment the newline into an "l"
@                Rotate top three elements, moving the "d" to the top
SX\              Push a space and 1 then swap, leaving the space on top
c                Convert the space (which is an array) into a char
|                Bitwise or the space (32) with 1 to give "!" (33)    

CJam之后会自动打印堆栈。

感谢@Optimizer提醒我该方法Sc可以正常工作,因为否则会SX|失败(它会执行setwise或取而代之,将数组由空格和1组成)。


8

> <>(Fish),5行,很多字节

代码非常长,在我说[6535529689086686142930090 '+' signs][6535529689086686142930090 'd' characters]代码的第一行时,我的意思是,6535529689086686142930090一行中确实有加号!

(并在以下几行中添加必要的前缀空格。)

'[6535529689086686142930090 '+' signs]^`[6535529689086686142930090 'd' characters]
                                   **,/288
                                     -/:o
                             %**288:;?\
                                   (1:\

较短的可测试替代品,仅打印Hi

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^`hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
                                                                                                                               **,/288
                                                                                                                                 -/:o
                                                                                                                         %**288:;?\
                                                                                                                               (1:\

方法:

  • 在第一行中,我们创建一个巨大的数字,表示base128中的字符串。
  • 在其余各行中(从下至上),我们在每个循环中打印以下字符,直到整数的值达到0。
  • 循环代码为:1(?;:882**%:o-288**,

(我们可以使用此方法打印任意2个以上字符的长字符串。)


不是有效的解决方案;6535529689086686142930090未订购。
theonlygusti 2015年

@theonlygusti“本代码是极长的,解释[6535529689086686142930090 '+' signs][6535529689086686142930090 'd' characters]在代码的第一行字面”。(如果不清楚我的意思是,请检查第二段代码。)
randomra

哦好的!抱歉,愚蠢的我:PI从字面上看。
theonlygusti 2015年

2
大小为13 YB,大约是互联网大小的1000倍。
查尔斯

@查尔斯我得到〜40YB包括后几行。
Veedrac

8

PHP(7/17行,36/59字节):

由于无效答案的数量众多,我重写了此答案。

浏览器版本?走了

但是我有2个解决方案,都基于PHP中的字符串的按位xor^)。

这是一个非常强大的解决方案!有时,它可以节省大量字节。

首先,最短的答案:

Echo
Hello
,AM^mm
,Wor
,OOO^
"#+n
";

我知道,它看起来糟透了,但是有效!

下一个依靠换行符。

是的,它使用换行符(\n/ UNIX样式为必需)!

Echo
Bo
.ff
.e
.
"&*]ex
fn
"^
"\n
\n
\n
\n
\n
\n
\n
",B^c
;

必须使用这一行上的换行符。

它不是完美的,但是有效!


这两个答案都基于@MartinBüttner解决方案

Echo
Hello
.
chr
(44
).
chr
(29
+3
).Wor
.l
.d
."!
";

特别感谢给@n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳@CJDennis@MartinBüttner@skagedal检测所有我的错误和他们的建议。


1
浏览器中的输出为Hello , Wor l d !。注意多余的空格!不幸的是,这不是一个有效的答案。
CJ丹尼斯

1
已在Windows XP的Firefox 36,IE 8,Opera 12.17和Opera 28(Chromium)中进行测试。全部呈现相同的输出。由于将任意数量的空格字符呈现为单个空格字符(不包含换行符等),因此每个换行符都会转换为空格。我想知道是否有任何浏览器呈现您的输出时没有空格!
CJ丹尼斯

1
很好的语言滥用!由于从技术上讲,它生成的错误是发给stderr而不是stdout的,因此即使在我的情况下,我在浏览器中看到很多错误,您的代码也仍然有效!而且,令人难以置信的挑剔,我的PHP设置缺少短标签,因此计算机上的第一行<?php是无效的!但是,我会原谅您!OK,刚刚测试了<?Php它的工作原理,所以我才知道start标记不区分大小写!
CJ丹尼斯2015年

1
此答案中的前两个解决方案不遵循规则。作为第8行,最上面的一个具有。"!<br-未排序。第二个具有第10行:."!-未排序。
skagedal,2015年

1
@IsmaelMiguel对不起,但没有。第一个建议的第7行未排序。第二个建议的第5行和第7行未排序。
skagedal,2015年

7

Pyth,7行,23字节

-
"Hello
,
 Wor
l
d
!"b

非常简单,只需使用多行字符串并删除换行符即可。

在这里尝试。


@orlp我几天前添加了多行字符串,并且Pyth在年龄输入中一直支持换行。这根本不使用多行模式。在绝对没有多行模式的在线编译器上尝试一下。
isaacg 2015年

2
它在CJam中几乎相同,字节数也相同。
Optimizer

4

第四十一行143字节

在线尝试。

我为此感到非常自豪。当我发现自己可以做到时,我便很快将其淘汰,让Google搜索不区分大小写的语言,而且我已经相当了解Forth。几乎可以肯定地缩短它,包括字节和行。建议表示赞赏。:D

该程序实质上将每个ASCII字符的十进制值压入,然后打印每个。我在编写代码时尝试进行优化,因此可读性比我想要的低。

33
99
1
+
DUp
8
+
2DUp
6
+
SWap
11
+
2OVer
SWap
8
9
*
EMit
1
+
EMit
DUp
DUp
EMit
EMit
3
+
EMit
29
3
2DUp
+
EMit
*
EMit
EMit
EMit
EMit
EMit
EMit

这些Emit行不起作用,因为i(105)小于m(109)。
bcsb1001 2015年

应该是“ EMit”,然后呢?
skagedal 2015年

4

Marbelous,9行,94字节

3333
    @ADD
    358C
++--29\\
++--3555DE
<<<<<<>>~~
+++++446666D
++++++++../\
      ++------

在这里在线测试。 Using spaces for blank cells必须检查。

源的视觉表示:

以上源的可视化表示

说明:该程序中的每个十六进制值都会在每个“滴答”中向下移动(除非它处于on \\,在这种情况下它将向右移动)。++将增加值,--减少,~~不按位应用,依此类推。落在底部的值将打印为ASCII字符。

例如:33顶角的变为(((0x33 +1 +1) << 1) +1 +1 = 0x6C (l)


2

Perl,17行

$_
=
'pr
int
"Hello
,
 Wor
l
d
!"';s
!
!!g
;s
!.
*
!$&
!eex

2

Rebol-15行(51字节)

PRin
AJOin
[
'Hello
Sp 
+
12
Sp
'Wor
'l
'd
Sp
+
1
]

Rebol中的单词不区分大小写(例如PRINT,,Print并且print都将调用同一函数)。

上面的代码整理了一下:

prin ajoin [
    'Hello  sp + 12  sp  'Wor  'l  'd  sp + 1
]

注意 sp返回空格字符!


您的程序无效,{不能在任何字母前。
theonlygusti 2015年

@theonlygusti-固定(从9行变为13)。唯一引起我麻烦的是{,}。现在Sp + 12(超过3行)相当于空格字符+ 12(即逗号)
draegtun 2015年

2

一元,1行,很多字节

该程序中的每个字符都是0。源代码太长,无法在此处放入,但它由一个包含多个零的字符串组成:

327380789025192647555922325233404088310881092761595127419003295178342329930050528932118548

这是此二进制数的十进制表示形式:

0b1010010010010010010010010110000010010010010110000010010000010010010000010010010000010001001001001011111000010000010000011110001111001011111000000100000011011011100010010010010010010010100100010010010100000000100001011100001100010010010100011011011011011011100011011011011011011011011100000000010100

从以下BrainF ***程序创建的:

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

看看我是如何生成的:http : //ideone.com/lMT40p


2

批次-39行(202字节)

我想通过cmd使用/v on开关在调用内部运行代码来启用延迟扩展来减小大小,但无法克服所有困难。

@S^
ET^
LO^
C^
AL^
 EN^
ABL^
E^
DEL^
AY^
E^
DEX^
P^
ANS^
IO^
N
@S^
ET^
 0=Hello
@S^
ET^
 1=^
,^
 Wor
@S^
ET^
 2=l
@S^
ET^
 3=d
@E^
CHO^
 !^
0^
!!1^
!!2^
!!3^
!^^^
!

没有换行符(和克拉逃脱换行符):

@SETLOCAL ENABLEDELAYEDEXPANSION
@SET 0=Hello
@SET 1=, Wor
@SET 2=l
@SET 3=d
@ECHO !0!!1!!2!!3!^^!

1

Ruby,19行,95字节

$;=
$>
$;<<
:Hello
$;<<
44::chr
$.=
33::
-1
$;<<
$.::chr
$;<<
:Wor
$;<<
:l
$;<<
:d
$;<<
33::chr

也许对Ruby我第二最难码限制已经看到了这个网站的怪物后在这里

编辑解释:唯一排序的Ruby输出方法是<<STDOUT上的方法。不幸的是,STDOUT的常量是$>,并且>比大多数符号都高ASCII,因此实际上不可能在其上调用方法。我们需要一个多行赋值语句,以使其更易于处理的变量名$;(分号仍然很高,但是这种形式的大多数变量都是不可赋值的,或者只能是字符串)。

符号(:Wor等)是执行文字的最简单方法,而且我看不到从字符串中删除换行符的方法,因此我需要多个print语句。空格和标点符号不能包含在符号文字中,但是幸运的chr是,数字方法是合法的,因此我可以从其ASCII值中获取一个字符。::是调用方法的另一种方法。空格是棘手的,因为我不会写32,所以我从33中减去1并将其分配给变量。


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.