“你好,世界!”


419

所以...嗯...有点尴尬。但是我们并没有一个简单的“世界,你好!” 挑战(尽管有35个标记为变体,并且还在计数)。尽管这不是通用语言中最有趣的代码,但是在某些esolang中找到最短的解决方案可能是一个严峻的挑战。例如,据我所知,还不知道是否找到了最短的Brainfuck解决方案。

此外,虽然所有Wikipedia(Wikipedia条目已被删除,在archive.org上都有一个副本 ),但esolangsRosetta Code的列表为“ Hello,World!”。程序,这些都没有兴趣让每种语言都有最短的语言(还有GitHub存储库)。如果我们想成为代码高尔夫社区中的重要站点,我认为我们应该尝试创建最短的“ Hello,World!”最终目录。程序(类似于我们的基本quine挑战如何包含各种语言中最短的已知quines)。所以,让我们做吧!

规则

  • 每个提交都必须是完整程序。
  • 该程序必须不输入任何内容,并打印Hello, World!到STDOUT(此确切的字节流,包括大写和标点符号)加上可选的尾随换行符,并且不能输出其他任何内容。
  • 该程序不得向STDERR写入任何内容。
  • 如果有人想通过创建一种在空程序打印时使用的语言来滥用它Hello, World!,那么恭喜,他们只是为一个非常无聊的答案铺平了道路。

    请注意,必须有一个解释器,以便可以测试提交。允许(甚至鼓励)自己为以前未实现的语言编写此解释器。

  • 提交的得分上字节,在合适的(预先存在的)编码,通常(但不一定)UTF-8。某些语言(例如Folders)在评分上有些棘手-如果有疑问,请在Meta上提问。
  • 这是不是发现用最短的语言“你好,世界!” 程序。这是关于查找最短的“ Hello,World!”。用每种语言编程。因此,我不会将任何答案标记为“已接受”。
  • 如果您选择的语言是已经有答案的另一种(可能更受欢迎的)语言的琐碎变体(请考虑使用BASIC或SQL方言,Unix shell或琐碎的Brainfuck派生词(例如Alphuck)),请考虑在现有答案中添加注释在其他语言中,相同或非常相似的解决方案也是最短的。

附带说明一下,请不要在没有太多兴趣的语言中用枯燥(但有效)的答案打分-这些问题对于此问题会尽可能地完善目录,因此仍然有用。然而,这样做在那里的作者确实不得不把精力投入到高尔夫球的代码语言主要是给予好评的答案。

要获取灵感,请查看Hello World Collection

目录

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

## [><>](https://esolangs.org/wiki/Fish), 121 bytes


2
@isaacg不,不是。我认为可能会有一些有趣的语言,无法进行素数测试。
马丁·恩德

6
如果同一程序(例如)"Hello, World!"在许多不同且不相关的语言中最短,是否应单独发布?
aditsu

2
@ mbomb007那么默认情况下它是隐藏的,因为这三个代码块占用了大量空间。我可以缩小它们的大小,以使它们每个都只有一行,但是我宁愿保持代码的可维护性,以防出现错误。
马丁·恩德

7
@ETHproductions“与我们通常的规则不同,即使使用的语言(或语言版本)比此挑战要新,也可以随意使用。” 但是在发布语言实现之前发布它肯定会有所帮助。
马丁·恩德

2
@MartinEnder ...差不多了。如果两个BF解决方案的大小相同,则字典顺序较小的一个将在Unary中占用较少的字节数。当然,最小化翻译为BF的最小Unary解决方案可以保证是最小的。
user202729

Answers:


442

卡住,0个字节

好吧,不能比这短。...一个空程序将Hello, World!Stuck中输出。


57
该死,我迟到了20分钟!:P
卡德(Kade)

33
Noooo快来看看西方效果最快的枪;)
Beta Decay

30
@Zuck好吧,Stuck是用于代码高尔夫的,就像CJam / GolfScript / Pyth一样。这Hello, World!只是我在开发初期就用作占位符的东西。我无意将其保留这么长时间,只是从来没有想过要删除它。
卡德2015年

132
我一直在试图提出一个较短的解决方案,但是我陷入了困境。
Cyoce

51
jQuery中的-1个字节。您是否尝试过jQuery?
10回复

244

PHP,13个字节

Hello, World!

是。有用。


261
与PHP一样,您总是想知道它如何工作
Fatalize 2015年

95
当然,它有效,因为<?php代码中没有任何内容,导致它根本无法被PHP解释:)
Lynn

58
这意味着这只是一个HTML答案...
Nelson

82
@Nelson不,不是。PHP不一定必须放在HTML中。另外,HTML不会输出到标准输出
georgeunix

26
这是有史以来最搞笑的答案
Oliver Ni

240

Brainfuck,78个字节

开放式赏金:如果有人可以提高此分数,我将把赏金(+500)传递给他们。 @KSab找到了 76 72字节的解决方案

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

在线尝试!

前28个字节--<-<<+[+[<+>--->->->-<<<]>]使用以下重复关系(mod 256)初始化磁带:

f n= 171·(-f n-1 -f n-2 -f n-3 +1)f 0= 57f 1= 123f 2= 167

由于3 -1 171 171(mod 256)而产生171的因数。转换当前值后,<+>---每次返回一个单元格(通过)减去3会有效地将该值乘以171。

n = 220时,要转换的值为零,并且迭代停止。停止点之前的十个字节如下:

[130, 7, 43, 111, 32, 109, 87, 95, 74, 0]

它包含了Hello, World!以狩猎和啄食的方式进行生产并稍作调整的所有必需组件。

我还找到了另一种78字节解决方案:

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

在线尝试!

我认为这比第一个要好,原因有几个:它使用的单元格较少,总共修改了较少的单元格,并且终止速度更快。


更多详情

复发关系在Brainfuck中具有令人惊讶的简洁表示。总体布局如下:

{...s3}<{s2}<{s1}[[<+>->{c1}>{c2}>{c3...}<<<]>{k}]

代表:

f n = c 1 ·f n-1 + c 2 ·f n-2 + c 3 ·f n-3 + ... + k

f 0 = s 1f 1 = s 2 + c 1 ·f 0 + kf 2 = s 3 + c 2 ·f 0 + c 1 ·f 1 + k

另外,<+>可以更改,以在不影响停止点的情况下将范围乘以一个常数,并且可以在之前添加一个术语以在>{k}不影响停止点的情况下将范围移动一个常数。


其他例子

斐波那契数列

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

N角形数

三角数

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

定义为f n = 2·f n-1 -f n-2 +1,其中f 0 = 0f 1 = 1

平方数

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

五角形数

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

等等


高炉紧缩

我已经在github上发布了用于查找某些解决方案的代码。需要.NET 4.0或更高版本。

Usage: bfcrunch [--options] text [limit]

Arguments
------------------------------------------------------------
  text              The text to produce.
  limit             The maximum BF program length to search for. If zero, the length of the
                    shortest program found so far will be used (-r). Default = 0

Options
------------------------------------------------------------
  -i, --max-init=#  The maximum length of the initialization segment. If excluded, the
                    program will run indefinitely.
  -I, --min-init=#  The minimum length of the initialization segment. Default = 14
  -t, --max-tape=#  The maximum tape size to consider. Programs that utilize more tape than
                    this will be ignored. Default = 1250
  -T, --min-tape=#  The minimum tape size to consider. Programs that utilize less tape than
                    this will be ignored. Default = 1
  -r, --rolling-limit
                    If set, the limit will be adjusted whenever a shorter program is found.
  -?, --help        Display this help text.

输出分为三行:

  1. 找到的程序的总长度,以及初始化段。
  2. 从当前磁带指针开始的路径。每个节点对应一个输出字符,表示为(指针,成本)。
  3. 使用的磁带段。

例如,最终结果为bfcrunch "hello world" 70 -r -i23

64: ++++[[<+>->+++++>+<<]>]
49, (45, 5), (44, 3), (45, 6), (45, 1), (45, 4), (42, 4), (43, 5), (45, 3), (45, 4), (46, 2), (44, 4)
32, 116, 100, 104, 108, 132, 0, 0, 132, 0

这对应于完整程序:

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

其他记录

你好,世界!

包装,共78个字节

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

要么

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

非包装,87字节(以前为92字节(米)):

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

你好,世界!

包装,80个字节

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

非包装,81个字节(以前是92个字节(hirose)):

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

你好,世界!

包装,74个字节

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

非包装,84个字节

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

Esolangs版本

世界您好!\ n

包装,76个字节

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

这使用了离开家一个单元的空间,因此将被视为77。

非包装,83个字节

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

Rdebath批准。profilebf输出:

Hello World!
Program size 83
Final tape contents:
 :   0   0  73 101 109 115 112  88  33  10   0
                                         ^
Tape pointer maximum 10
Hard wrapping would occur for unsigned cells.
Counts:     +: 720          -: 79           >: 221          <: 212
Counts:     [: 9            ]: 84           .: 13           ,: 0
Total:         1338

inversed.ru(彼得·卡波夫)

你好,世界!

包装70个字节(以前为78 1):

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

非包装,77个字节(以前是89 个字节):

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

作者声称最短的手写代码“ Hello World!” 是89个字节,但未提供参考。我在此也要求保留该记录。

你好,世界!

包装65字节(以前为66字节):

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

实际上,这也是手工编码的(通过压缩可以找到的最好的是68个字节)。第一个单元格初始化为259(3),并且每次迭代减少7,循环37次。下一个单元格递减6,得出256-6·37 = 34。其余单元每次减少4,每次迭代增加一个单元,每个新单元初始化为252(-4)。结果如下:

[  3,   0,   0,   0,   0,   0,   0, ...]
[252, 250, 248,   0,   0,   0,   0, ...]
[245, 244, 244, 248,   0,   0,   0, ...]
[238, 238, 240, 244, 248,   0,   0, ...]
[231, 232, 236, 240, 244, 248,   0, ...]
[224, 226, 232, 236, 240, 244, 248, ...]
...
[ 35,  64, 124, 128, 132, 136, 140, ...]
[ 28,  58, 120, 124, 128, 132, 136, ...]
[ 21,  52, 116, 120, 124, 128, 132, ...]
[ 14,  46, 112, 116, 120, 124, 128, ...]
[  7,  40, 108, 112, 116, 120, 124, ...]
[  0,  34, 104, 108, 112, 116, 120, ...]

1给出的解决方案(79字节)可以减少一倍:

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

39
真是疯了 你们其中一位应将82字节版本提交给无政府状态高尔夫。
马丁·恩德

117
最好的Java解决方案是76个字节。只有9个字节可以证明Java开发人员应该切换到Brainfuck。
圣约翰河上的水平

9
@LevelRiverSt小字母1比Java小2个字节。末日来了。
Conor O'Brien

13
“只有9个字节可以证明Java开发人员应该切换到Brainfuck。” interface a{static void main(String[]A){System.out.print("No!");}}
dorukayhan


222

ArnoldC,71个字节

IT'S SHOWTIME TALK TO THE HAND "Hello, World!" YOU HAVE BEEN TERMINATED

只是为了笑..


4
为我工作。尝试将放映时间放在第一行,您已经在最后一行被终止了
JelloDude 2015年

72
我真的需要学习如何使用这种语言。
2015年

3
空格和换行符占用的字节数不一样吗?和技术,IT'S SHOWTIMETALK TO THE HAND应在第一行和最后一行。
wizzwizz4 2015年

5
@AlCode但这是更正确的方法,它占用相同的字节数,并且具有更多的兼容性,并且看起来更好,为什么我大惊小怪这是PPCG上的代码挑战,所以令人惊讶的是您的代码可读性好您做出的答案很好,可读性很强,并且+1。
wizzwizz4 2016年

11
@ wizzwizz4非常感谢您,我尝试使用ArnoldC成为未来语言的专家!
AlCode

203

种子6016 4234 4203个字节

20 854872453003476740699221564322673731945828554947586276010721089172712854441839676581917455319274850944955030258951339804246125714958815519550291630078076933441706558540342671975808828643360922071900333028778314875248417953197990571991784126564752005357199892690656368640420204822142316716413192024742766282266114842280731756458212469988291309261528542889299297601723286769284159107438930448971911102280330101196758384815655479640836157495863547199726234352265518586460633795171196315255736880028338460236768181141732764911402112878175632130129852788301009582463631290071329795384336617491655825493435803011947670180368458659271192428341035912236946048939139042310380278430049252171822721598175984923434205610723412240162418996808671543770639111617709604242882388664919702606792443015941265168129550718541372361144081848761690730764968771245566074501485020726368378675085908872608679630368472956274468410052703615106090238423979678950131481176272880569100533049143775921798055136871254424261001442543122666701145111965968366507060931708140304772342855064834334129143038575569044150428480231956133612367393837580345180691911525531699573096952433882387811884727975431823620782822755161559988205401134640722220804177812794328129589949692446031008866917615922944976151073653201316255518389496411696741029209242119521978920200314572718584995265523235225587228975886710511855501710470163649632761488899317729943053884132314641377747687975638119132094777769497069556255954031537245957811105217875011509899497752696062748928963281605780942517262774976217663461063680912331030221981433051827519906741285738915397005702326447635845195923640649166530310494885569783989508000344280715868581532826832242144647203531393142251025361866506821695860883605004105862208004440476654027574832078603305884731766236740069411566854496824754558761536201352147934963241039597221404341132342297870517293237489233057335406510464277610336142382379135365550299895416613763920950687921780736585299310706573253951966294045814905727514141733220565108490291792987304210662448111170752411153136765318541264632854767660676223663544921028492602135525959428999005153729028491208277493747933069008199074925710651071766675870081314909460661981433426167330215548196538791617762566403934129026219366764038390123622134753742930729751695349588862441999672547791630729398908283091638866715502470152431589429837867944760012419885615525232399584379209285060418518373512154801760060312646951597932345591416241634668119867158079946680321131213357200382937049485606706114467095019612014749723443159443363662563254359712162432143334612180576945072905749883870150120687696027984317320305291407322779803583395375616762530641605634303022155218169343410634115050596030685041633824154135240376022159918501703555881290333205131375705406831260759974112248490451605422031345264183102048614606636275942039438138959188478277971377232005036301145411215067576576667743288951344423152531417111852584846747428443123174595987315325304540564683047858415059703724263652136185848573853965992798725654430360647040362341567082462847275277303225817689141675391972818943419663764371222973269129542760661385278009266471167618553065823580448848795731295589715602705860758954890415040763604082216728159486423396295188510311881004469017351709060492844398219491990895826924575575549615118821417543037296628825303328056839433114519945243963946989899508355224823109677424196639930153649890175062456649384605721510239142861693109687536600667811037619175927995599388547421689316110236566026931360164495251160997857372500940728057700473763884480342708897319990346726967220426504612260565552531158509215849649565188655100774748485416791517853427613458459889062942881409801879085054494129489535044719193283409051007851153504224002807392992520076910314763705776345053922387355156981872691537772657428096384535960466923475731297217863371650154415835785630016335858514130863258775100537612371430357576913148500310344278511588325852376442503898849856566716198848377379400158332792027967216204970114516984638014129252882482309132898416484525230488700253065644547798869056136044415413099076332059572505138116227535024546891015836838323022822272664771489129085797354578016574544759934333471793

将所得Befunge-98程序(基于)是

"9!dlroW ,olleH"ck,@

35
哇!您是怎么找到这个的?
ETHproductions '16

31
是什么。太疯狂了
科纳·奥布莱恩

47
您如何做到这一点?
破坏的柠檬

39
您是否对梅森纳捻线机进行了反向工程?这对安全性有何影响?
primo

68
我会再给您+500,以进行详细的(理论上的)解释。
primo

155

莫宁顿月牙3614 3568字节

感谢NieDzejkob通过使用较短的行名来节省46个字节。

Take Northern Line to Hendon Central
Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Gunnersbury
Take District Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Paddington
Take District Line to Acton Town
Take Piccadilly Line to Holloway Road
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Gunnersbury
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Mile End
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Upminster
Take District Line to Mile End
Take District Line to Paddington
Take Circle Line to Paddington
Take District Line to Acton Town
Take Piccadilly Line to Heathrow Terminals 1, 2, 3
Take Piccadilly Line to Holborn
Take Central Line to Holborn
Take Central Line to Mile End
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Barking
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Barking
Take District Line to Gunnersbury
Take District Line to Paddington
Take Circle Line to Paddington
Take Circle Line to Wood Lane
Take Circle Line to Victoria
Take Circle Line to Victoria
Take District Line to Gunnersbury
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Paddington
Take Circle Line to Paddington
Take District Line to Mile End
Take Central Line to Fairlop
Take Central Line to Mile End
Take District Line to Barking
Take District Line to Upminster
Take District Line to Upminster
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Mile End
Take District Line to Gunnersbury
Take District Line to Paddington
Take Circle Line to Paddington
Take Circle Line to Hammersmith
Take District Line to Mile End
Take District Line to Richmond
Take District Line to Mile End
Take District Line to Paddington
Take Circle Line to Paddington
Take District Line to Richmond
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Stepney Green
Take District Line to Hammersmith
Take District Line to Stepney Green
Take District Line to Upney
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Upney
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Charing Cross
Take Bakerloo Line to Charing Cross
Take Bakerloo Line to Paddington
Take Circle Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent

在线尝试!

这当然是次优的,但这只是esolangs解决方案的一半大小。

Hello, World 通过切片以下工作站名称并连接结果来构建:

Hendon Central
▀▀
Holloway Road
  ▀▀▀
Heathrow Terminals 1, 2, 3
                       ▀▀
Wood Lane
▀▀
Fairlop
   ▀▀
Richmond
       ▀

最后,我正在计算!as 的字符代码(2<<4)+1 == 33。所有这些部分都在帕丁顿级联,最后在莫宁顿月牙印刷。

注意:该语言没有指定是否可以连续两次到达同一站点,但是解释器允许这样做,因此我已经使用了它。


44
这是绝对精彩:d
β衰变

32
我喜欢这种语言。对不起,当我用这种语言进行系统编程时。
2015年

4
这种语言在我的一生中在哪里?
ScottMcGready

30
卡姆登镇和尤斯顿之间的@ScottMcGready。
Martin Ender

3
Mornington Crescent现在在TIO上。tio.run/#mornington-crescent
丹尼斯

123

邪恶的 70字节

aeeeaeeewueuueweeueeuewwaaaweaaewaeaawueweeeaeeewaaawueeueweeaweeeueuw

它使用以下四个命令:

a - increment the register
u - decrement the register
e - interweave the register's bits (01234567 -> 20416375)
w - write the value of the register as an ASCII character

61
那是邪恶的……
David Grinberg 2015年

61
特别是因为您的头像是Black Hat。
TheDoctor 2015年

5
你能解释一下交织过程吗?
Kishan Kumar 2015年

4
@KishanKumar
grc

30
如果您大声朗读该程序,听起来就像是低音提琴。
乔Z.

112

Brainfuck,72个字节

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

在线尝试!

原始的非包装76字节解决方案:

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

在线尝试!

我发现的其他最短的(据我所知)解决方案

'你好,世界!' 77个字节:

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

在线尝试!

'你好,世界!' 70个字节:

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

在线尝试!


这些是使用我在这里编写的c ++程序找到的:https//github.com/ksabry/bfbrute

注意:我本来想在发布此代码之前对其进行清理,以使其实际上具有一定的可读性和可用性,但是由于我已经一年多没有使用它了,所以我认为我将按原样发布它。它大量使用模板和编译时间常数进行任何潜在的优化,并且在我的测试中有很多注释掉的代码,但是没有有用的注释,很抱歉,但这有点可怕。

该代码没有什么非常聪明的,它的核心是蛮力的,但是它已经进行了优化。主要的优化是,它首先遍历所有没有循环的程序(no []),直到指定的长度(当前为16),然后缓存将在数据数组上进行的所有更改的数组。对于唯一的更改数组,它只会存储一个程序,因此,例如>+<<-><->>+<只会存储一个。然后,它将遍历由该高速缓存中的任何程序组成的所有可能的程序,并在它们之间进行循环的任意组合。执行完每个程序后,将对字符进行简单的贪婪搜寻和啄,并将其追加到程序末尾。

在所有程序中运行该程序后,我注意到几乎所有最短的程序(最大长度为〜19)都是这样的形式*[*[*]*]。将搜索限制为这种形式的程序可以大大加快搜索速度。当前记录的保存者的长度为27。实际上,该记录的保存者的长度为74,但是我注意到一个特殊的序列.>.>.>.,该序列很幸运,在数据单元中的正确位置为0,可以简化为[.>]<将其降低至72。

我让它运行了一段时间,并使用当前长度最大为29的参数完成了搜索,我怀疑仅通过提高参数值就很难击败当前参数,我认为最有希望的方法可能是扩大搜索范围一些聪明的方法。


32
您是如何找到这个的?
丹尼斯

2
@Dennis如果有机会,我可能会发布有关我的过程的说明,以及我使用的源代码(一旦我清理了)
KSab

32
嘿,你击败了Java。

18
那是某种设备,它甚至不需要包裹细胞ó_Ò–
primo

5
很想看看背后的算法:)
musicman523

84

Piet,90种编码

在此处输入图片说明

这是30 x 3的图像。另外,代码大小为10:

在此处输入图片说明

使用3高布局,因此我只需要指针一次。如果仍然可以打高尔夫球,我可能最多可以剃掉另一根专栏文章,因为那里有推杆式无操作杆。

编辑:@primo的84编码解决方案


6
试图拿自己的赏金?我以为更多的人是Sp3000;)
Beta Decay

7
哈哈,仅仅因为我设置了赏金,并不意味着我就不能参加这个有趣的活动:P
Sp3000

9
推杆式推销对我来说不是一个禁忌。这是这个
mbomb007 '16

1
“语言”到底是什么?我喜欢它!
佐尔坦·施密特

8
现在,我最喜欢用短语“ push-pop no-op”
BobTheAwesome

82

干草堆,17字节

Haystack是一种2D编程语言,|在执行基于堆栈的操作的同时一直执行到找到大海捞针为止。所有程序都从左上角开始,并且可以使用方向字符><^v在程序中四处移动。方向是继承的,因此您无需继续使用>就可以继续前进,方向只有在遇到其他方向字符时才会改变。

默认情况下,解释器从左上向右读取,因此我们只需输入“ Hello,World!”即可。在纸叠上,用于o打印,然后将针放置到完成执行的位置。

"Hello, World!"o|

奖励:更令人兴奋的版本:

v      >;+o|
v      "
v      !
v      d
v      l
v      r
>>"Hello, ">>>v
       W      v
       "      v
       ^<<<<<<<

出于好奇,如果在字符串中包含一个字符,会发生什么?
Random832

@ Random832在字符串中,定向字符被视为常规字符,即,您可以将它们包括在字符串中。
卡德2015年

38
>; + O
bjb568

3
我希望自己能比这里的每个人聪明一半,但是在“文档”(阅读:某人的论坛帖子)中,它o用数字表示输出。不应该c在最后吗?哪里有适当的文档?超级有趣!
魔鬼的代言人

2
@Scott Super迟到回复此,该论坛帖子可能是我!o按原样输出最上面的堆栈项目,即,如果有数字,则将其打印出来。c只会将其转换为char。所以,如果你对堆栈的顶部字符串或字符o会是你想要的东西:)最终,这些文档将被更新..
卡德

70

求助,WarDoq!,1个字节

H

WarDoq不仅有帮助!内置了该词组最常见的拼写,甚至可以满足我们对编程语言的通常定义。

官方的在线解释器中进行尝试(代码在Input中)。


7
那么,HQ9 ++本质上是吗?;-)
AdmBorkBork

6
@TimmyD不,不是HQ9 ++
丹尼斯

30
噢,天呐!在这一点上有什么不是 esolang的吗?:)
AdmBorkBork 2015年

97
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."因此,您只能对空格进行注释???我想即使是世界上最有用的语言也必须具有一个无用的功能+1,
Level River St

29
@steveverrill也许如果选项卡也被视为注释,那么我们可以将注释写为空白程序
Optimizer

66

MarioLANG259个 249 242 240 235字节

+>+>)+)+)+++)++++((((-[!)>->.
+"+"===================#+".")
+++!((+++++++++)++++++)<.---+
++=#===================")---.
++((.-(.)).+++..+++++++.<---
 !+======================---
=#>++++++++++++++.).+++.-!>!
  =======================#=#

这已经在Ruby实现中进行了测试。

混淆“你好,世界!”之后 在MarioLANG中,我研究了一下打高尔夫球。以上是我到目前为止发现的最短的内容。

和以前一样,我从Brainfuck解决方案开始,该解决方案将四个单元格设置为字符He,和空格的最接近的10的倍数,然后将其转换为MarioLANG。然后,您可以通过在循环中使用辅助地板来稍微缩短代码,这几乎使循环的宽度减半。请注意,底部执行的次数仅比顶部执行的时间少一倍,因此您将无法再获得所有4个单元格中初始计数器的确切倍数。

最后,我想利用循环前面的浪费空间,因此我添加了一堆电梯来利用那里的垂直空间。然后我意识到我可以在循环下面的循环之后折叠代码(请参阅先前的修订),以利用更多的垂直空间,从而节省了五个字节。

这可能仍远未达到完美,但我认为这是对天真的解决方案的一个不错的改进。

元高尔夫

是时候进行一些自动化...

我已经开始在Mathematica中设置求解器以找到最佳解决方案。当前,它假定代码的结构是固定的:计数器设置为12,用于打印的4个单元格具有固定的分配He,<space>和与这些单元格相同的顺序。变化的是+循环中的s 数,以及随后的必要更正:

n = 12;
Minimize[
 {
  3(*lines*)+
   12(*initialiser base*)+
   Ceiling[(n - 6)/2] 3(*additional initialiser*)+
   8(*loop ends*)+
   18(*cell moves*)+
   26(*printing*)+
   43*2(*steps between letters in one cell*)+
   -2(*edge golf*)+
   4 Max[4 + a + d + g + j + 2 Sign[Sign@g + Sign@j] + 2 Sign@j + 2,
     4 + b + e + h + k + 2 Sign[Sign@h + Sign@k] + 2 Sign@k] +
   2 (Abs@c + Abs@f + Abs@i + Abs@l),
  a >= 0 && d >= 0 && g >= 0 && j >= 0 &&
   b >= 0 && e >= 0 && h >= 0 && k >= 0 &&
   n*a + (n - 1) b + c == 72 &&
   n*d + (n - 1) e + f == 101 &&
   n*g + (n - 1) h + i == 44 &&
   n*j + (n - 1) k + l == 32
  },
 {a, b, c, d, e, f, g, h, i, j, k, l},
 Integers
 ]

事实证明,对于12的初始计数器,我的手工解决方案已经是最佳的。但是,使用11可以节省两个字节。我尝试了从6到20(含20)的所有计数器值,结果如下:

6: {277,{a->7,b->6,c->0,d->16,e->1,f->0,g->0,h->9,i->-1,j->0,k->6,l->2}}
7: {266,{a->6,b->5,c->0,d->11,e->4,f->0,g->2,h->5,i->0,j->0,k->5,l->2}}
8: {258,{a->2,b->8,c->0,d->3,e->11,f->0,g->5,h->0,i->4,j->4,k->0,l->0}}
9: {253,{a->8,b->0,c->0,d->5,e->7,f->0,g->2,h->3,i->2,j->0,k->4,l->0}}
10: {251,{a->0,b->8,c->0,d->3,e->8,f->-1,g->4,h->0,i->4,j->3,k->0,l->2}}
11: {240,{a->1,b->6,c->1,d->1,e->9,f->0,g->4,h->0,i->0,j->3,k->0,l->-1}}
12: {242,{a->6,b->0,c->0,d->6,e->3,f->-4,g->0,h->4,i->0,j->0,k->3,l->-1}}
13: {257,{a->1,b->5,c->-1,d->6,e->2,f->-1,g->3,h->0,i->5,j->0,k->3,l->-4}}
14: {257,{a->1,b->4,c->6,d->0,e->8,f->-3,g->3,h->0,i->2,j->2,k->0,l->4}}
15: {242,{a->1,b->4,c->1,d->3,e->4,f->0,g->1,h->2,i->1,j->2,k->0,l->2}}
16: {252,{a->0,b->5,c->-3,d->4,e->2,f->7,g->0,h->3,i->-1,j->2,k->0,l->0}}
17: {245,{a->4,b->0,c->4,d->5,e->1,f->0,g->0,h->3,i->-4,j->0,k->2,l->0}}
18: {253,{a->4,b->0,c->0,d->1,e->5,f->-2,g->2,h->0,i->8,j->0,k->2,l->-2}}
19: {264,{a->0,b->4,c->0,d->5,e->0,f->6,g->2,h->0,i->6,j->0,k->2,l->-4}}
20: {262,{a->0,b->4,c->-4,d->5,e->0,f->1,g->2,h->0,i->4,j->0,k->2,l->-6}}

注意:此求解器假定循环之后的线性代码都在最上面,而上面的代码就是该解决方案的折叠部分。通过使求解器知道可折叠性,可能会缩短整体解决方案,因为现在我+在第一部分免费获得了3个s,而接下来的4条指令将仅花费1个字节而不是2个字节。


2
@justhalf您应该看到我的Pada答案。:P
马丁·恩德

马丁我喜欢这个答案。您是否考虑在我们的官方论坛上发布有关此帖子?我们使用与stackexchange编辑器相同的方法。我们的社论想将其添加到“ 员工精选”中
Vitaliy Kaurov

61

黑暗,106字节

+h hell
h$twist sign s
s$scrawl " Hello, World!
s$read
h$twist stalker o
o$stalk
o$personal
o$echo
h$empty

我只是让语言规范中的一些引号来说明这种esolang的卓越之处:

黑暗是一种基于操纵整个世界和各个维度以实现目标并建立最佳折磨现实的语言。

每当发生语法错误时,程序的健全性就会降低1。[...]如果程序的健全性达到零,解释器就会发疯。

发生损坏时,腐败会使变量中的单个位翻转。

当主节点死亡时,附加到该主节点的所有服务方变量也会死亡。这对于分组和大规模杀死变量很有用。

强制变量杀死自己,释放它(尽管它会留下衰变)。

将变量设置为随机值。使用全局混沌生成器。

如果跟踪器未初始化,则任何执行IO的尝试都将导致令人沮丧的错误消息被写入控制台。


37
这种语言很吸引人。
Alex A.

6
如果我们必须按邪恶的顺序列出编程语言,那么黑暗将战胜邪恶。
LukStorms 2015年

35
你好,那里有地狱
Khaled.K 2015年

超级邪恶,你甚至可以
召集

59

厨师,465字节

H.

Ingredients.
72 l h
101 l e
108 l l
111 l o
44 l C
32 l S
87 l w
114 l r
100 l d
33 l X

Method.
Put X into mixing bowl.Put d into mixing bowl.Put l into mixing bowl.Put r into mixing bowl.Put o into mixing bowl.Put w into mixing bowl.Put S into mixing bowl.Put C into mixing bowl.Put o into mixing bowl.Put l into mixing bowl.Put l into mixing bowl.Put e into mixing bowl.Put h into mixing bowl.Pour contents of the mixing bowl into the baking dish.

Serves 1.

经过Ruby解释器测试。做字母汤。

我试图尽可能地符合原始规范,因此即使我使用的解释器允许您thePour contents指令中删除s ,我也没有这样做。

搅拌碗非常昂贵,因此可能有更好的方法。我尝试使用基数转换对消息进行编码,但不幸的是,规范未阐明是Divide使用整数除法还是使用浮点除法,而我使用的解释器使用后者。也没有模运算符,也无济于事。


19
如果有人可以打高尔夫,那就是Sp。
Alex A.

11
现在尝试现实生活中的高尔夫食谱。:D
mbomb007 '16

2
大声笑,这不仅不好吃,而且使用了非标准的计量单位。XD
thepiercingarrow

59

Homespring,58位元组

Universe net hatchery Hello,. World!  powers a b snowmelt 

尾随空间很大。

让我告诉你一个故事。曾经有一家发电厂为附近的鲑鱼孵化场提供动力。鲑鱼孵化场孵化了一条年轻的无家可归的鲑鱼,该鲑鱼开始了上游寻找春天的旅程。它确实找到了这样一个春天,它的诗意为“ Hello,World!”,在那里成熟并产生了一条新的年轻鲑鱼。两条鱼现在游向下游,寻找广阔的海洋。但就在河口不远的地方,河上有网-捕获了成熟的鱼,只有年轻的鱼设法滑过,到达了海洋和整个宇宙。同时,孵化场孵化了更多的鲑鱼,鲑鱼也向上游移动并产卵,依此类推。

但是,大量融化的雪顺着河的另一端流淌。就在我们从“ Hello,World!”的泉水中拿出第一批幼鲑鱼之后。到达海洋,融雪袭击了宇宙,……呃……摧毁了它。他们从此过着幸福的生活……或者我猜他们没有。

这些实际上是上述程序的语义。自制弹簧很奇怪。


15
这是...很奇怪...
kirbyfan64sos 2015年

10
我已经发现了一种新的最受欢迎的鲑鱼动力宇宙驱逐舰……呃……我的意思是“世界你好!” 程序。+1
ETHproductions 2015年

7
每次回到这个时候,我都会开心地笑。感谢您创造了最有趣的Hello World!所有时间的节目。
ETHproductions

2
这是我最喜欢的语言。
洛克人


53

Piet,84个编码

彼得·你好世界

28x3,此处显示为Codel宽度10。

创建了PietDev,测试与npiet。该程序的布局如下:

Piet布局

黄色填充表示路径重叠的编解码器,橙色填充表示必须具有相同颜色的编解码器(出于控制流程的目的)。

为了帮助创建此代码,我为基于堆栈的语言编写了一个基本的解释器,具有类似piet的命令,我将其称为“ pasm”()。该解释器的输出(带有输入)如下:

    1 nop     blu1 []
    4 push 3  blu2 [3]
    5 dup     grn2 [3, 3]
    6 add     cyn2 [6]
    7 dup     ylw2 [6, 6]
    8 mul     grn1 [36]
    9 dup     red1 [36, 36]
   10 dup     blu1 [36, 36, 36]
   11 add     mgn1 [36, 72]
H  12 putc    blu0 [36]
   15 push 3  blu1 [36, 3]
   16 sub     mgn2 [33]
   17 dup     cyn2 [33, 33]
   20 push 3  cyn0 [33, 33, 3]
   21 mul     blu2 [33, 99]
   22 push 1  blu0 [33, 99, 1]
   23 add     mgn0 [33, 100]
   24 dup     cyn0 [33, 100, 100]
   25 push 1  cyn1 [33, 100, 100, 1]
   26 add     blu1 [33, 100, 101]
e  27 putc    cyn0 [33, 100]
   28 dup     ylw0 [33, 100, 100]
   32 push 4  ylw1 [33, 100, 100, 4]
   33 dup     mgn1 [33, 100, 100, 4, 4]
   34 add     red1 [33, 100, 100, 8]
   35 add     ylw1 [33, 100, 108]
   36 dup     mgn1 [33, 100, 108, 108]
l  37 putc    blu0 [33, 100, 108]
   38 dup     grn0 [33, 100, 108, 108]
l  39 putc    ylw2 [33, 100, 108]
   40 dup     mgn2 [33, 100, 108, 108]
   43 push 3  mgn0 [33, 100, 108, 108, 3]
   44 add     red0 [33, 100, 108, 111]
   45 dup     blu0 [33, 100, 108, 111, 111]
o  46 putc    cyn2 [33, 100, 108, 111]
   47 dup     ylw2 [33, 100, 108, 111, 111]
   48 dup     mgn2 [33, 100, 108, 111, 111, 111]
   53 push 5  mgn0 [33, 100, 108, 111, 111, 111, 5]
   54 div     ylw0 [33, 100, 108, 111, 111, 22]
   55 dup     mgn0 [33, 100, 108, 111, 111, 22, 22]
   56 add     red0 [33, 100, 108, 111, 111, 44]
   57 dup     blu0 [33, 100, 108, 111, 111, 44, 44]
,  58 putc    cyn2 [33, 100, 108, 111, 111, 44]
   59 dup     ylw2 [33, 100, 108, 111, 111, 44, 44]
   60 add     grn2 [33, 100, 108, 111, 111, 88]
   64 push 4  grn0 [33, 100, 108, 111, 111, 88, 4]
   65 dup     red0 [33, 100, 108, 111, 111, 88, 4, 4]
   66 mul     ylw2 [33, 100, 108, 111, 111, 88, 16]
   67 dup     mgn2 [33, 100, 108, 111, 111, 88, 16, 16]
   68 add     red2 [33, 100, 108, 111, 111, 88, 32]
   69 putc    mgn1 [33, 100, 108, 111, 111, 88]
   70 push 1  mgn2 [33, 100, 108, 111, 111, 88, 1]
   71 sub     red0 [33, 100, 108, 111, 111, 87]
W  72 putc    mgn2 [33, 100, 108, 111, 111]
o  73 putc    blu1 [33, 100, 108, 111]
   76 push 3  blu2 [33, 100, 108, 111, 3]
   77 add     mgn2 [33, 100, 108, 114]
r  78 putc    blu1 [33, 100, 108]
l  79 putc    cyn0 [33, 100]
d  80 putc    grn2 [33]
!  81 putc    ylw1 []

不使用指针,切换或滚动命令。也不浪费代码。实际上有两个被重用。


恭喜,您获得了我的赏金:)
LegionMammal978

@ LegionMammal978谢谢,工作很有趣。和圣诞快乐:)
primo

7
这就是好莱坞应该在“黑客”屏幕上显示的内容。
Hubert Grzeskowiak

50

空格192个 150 146字节

空格只需要空格,制表符和换行符,而其他字符则被忽略。
在这里显示可能会很麻烦。
因此,在下面的代码中,空格和制表符被替换了。
还有一个';' 为了清楚起见,将其放在换行符的前面。
要运行代码,请首先替换。和>按空格和制表符。

...;
..>>..>.>.;
..>>>>;
...>;
...>>>;
...>..;
..>>.>..;
..>>..>.>>;
..>>>>>>>;
...>..;
...>;
.;
...>>>.;
..>>...>>;
;
..;
.;
.;
>.>;
...>>.>.>>;
>...>;
..;
.;
;
;
..>;
;
;
;

十六进制代码

00000000: 2020 200a 2020 0909 2020 0920 0920 0a20
00000010: 2009 0909 090a 2020 2009 0a20 2020 0909
00000020: 090a 2020 2009 2020 0a20 2009 0920 0920
00000030: 200a 2020 0909 2020 0920 0909 0a20 2009
00000040: 0909 0909 0909 0a20 2020 0920 200a 2020
00000050: 2009 0a20 0a20 2020 0909 0920 0a20 2009
00000060: 0920 2020 0909 0a0a 2020 0a20 0a20 0a09
00000070: 2009 0a20 2020 0909 2009 2009 090a 0920
00000080: 2020 090a 2020 0a20 0a0a 0a20 2009 0a0a
00000090: 0a0a

空白汇编代码:

push 0      ;null
push -74    ;! chr(33)
push -7     ;d chr(100)
push 1      ;l chr(108)
push 7      ;r chr(114)
push 4      ;o chr(111)
push -20    ;W chr(87)
push -75    ;  chr(32)
push -63    ;, chr(44)
push 4      ;o
push 1      ;l
dup         ;l
push -6     ;e chr(101)
push -35    ;H chr(72)
p:
 dup jumpz e
 push 107 add printc
 jump p
e:
 exit

备注:

我必须编写一个程序来计算加107可以使句子达到最佳状态。由于整数占用的字节大小会更改代码。:4 + int(abs(log2($ n)))
该代码仍将在whitespace.kauaveel.ee上没有“ e:”标签和退出部分的情况下运行。但这可能会使空白代码在其他空白编译器上无效。因此,这些字节不会从解决方案中泄漏出去。

应该注意的是

正如凯文·克鲁伊森(Kevin Cruijssen)在评论中指出的那样,通过按元允许“错误退出”,可以将空白编码为更多的126个字符。

..>>..>.>.;
..>>>>;
...>;
...>>>;
...>..;
..>>.>..;
..>>..>.>>;
..>>>>>>>;
...>..;
...>;
.;
...>>>.;
..>>...>>;
;
..;
...>>.>.>>;
>...>;
..;
.;
;

部件:

push -74
push -7
push 1
push 7
push 4
push -20
push -75
push -63
push 4
push 1
dup
push -6
push -35
label_0:
push 107
add 
printc
jmp label_0

我知道已经有一段时间了,我看到您提到的是它在大多数编译器上都没有使用exit-label即可运行,但是您可以通过使用(error value)而不是(push 0 )退出错误,将其降低到129字节。),根据meta允许在线尝试(带有突出显示和说明),或在线原始尝试SSNSSSN
凯文·克鲁伊森

@KevinCruijssen我终于检查了您的版本。基本上是带有装配体dup jumpz e并已e: exit删除的旧版本。但是至少在whitespace.kauaveel.ee上,它一直循环播放直到浏览器抱怨。尽管较低的高尔夫球场和中继允许“错误退出”,但我还是不想更改版本。但是您可以自由地将版本作为新答案提交。
LukStorms

不,我不会分开回答。它基本上与您的相同,只是由于错误退出而缩短了一点。我也刚刚意识到,可以通过删除SSN开头将其降低到126,而不是129 ,在这种情况下,当堆栈中只有一个项目(107)时,它会因无法执行Infix Plus而出错。(在线尝试。)如果有人有相同的建议,我将在这里留下我的评论。我想大约一年前,我已经对您的答案进行了+1处理。;)
Kevin Cruijssen

1
@KevinCruijssen在这种情况下,答案中已注明您的解决方案。空白是最不可能使用的语言之一。但是,为了节省字节数,您的发现值得一提。
LukStorms

49

爪哇,79

class H{public static void main(String[]a){System.out.print("Hello, World!");}}

Java的早期版本可能允许您使用静态块(51字节),但是目前我不知道绕过该main方法的方法。


7
使用enum代替class
Thomas Eding

6
@ThomasEding实际使用什么编译器?我已经尝试了几次此技巧,但从未能够使用它保存字节。
Geobits,2015年

4
@Luminous Ah,它可能适用于1.5。不过,我不会安装它来进行查找,而是坚持使用过去十年中发布的内容。如果我再也看不到Java 5,那将是美好的生活:)
Geobits 2015年

2
@TheDoctor从我所见,处理通常在这里被视为一种独立的语言。您应该将其发布为答案,或者至少要向OP要求澄清。
Geobits 2015年

5
OptiFine用户建议使用interface和省略说明public符来节省3个字节。我拒绝了以下编辑政策,但由于他们无法发表评论,因此我想通知您,以便您可以使用它。
Martin Ender

48

CSS,30个字节

:after{content:"Hello, World!"

级联样式表(CSS)不是典型的编程语言,但可以很好地完成固定输出。这是通过在每个具有content 的元素之后创建一个伪元素来完成的Hello, World!。因此,仅选择一个元素(<html>),这假设我们使用的是最基本的HTML文档,即

<html><style>:after{content:"Hello, World!"</style></html>

这适用于大多数主流浏览器,但Firefox例外,它将选择器应用于<html>and <body>元素。这也是为什么堆栈片段不起作用的原因,因为总是有一个body元素也被设置了样式。以下是要测试的稍微修改的版本。

* :after{content:"Hello, World!"


3
您也可以使用* *选择body
jimmy23013

18
@ jimmy23013听起来效率低下。谢谢
NinjaBearMonkey

1
无论出于何种原因,它* :after似乎都可以正常工作。
jimmy23013 2015年

12
我问我自己,CSS中的哪个字母是“语言”的缩写。
Zaibis 2015年

10
@zaibis可能是PHP的相同字母:)
fcalderan


45

Linux的x86_64机器代码,32字节

当Linux启动新进程时,所有寄存器(除RSP之外)均为零,因此我们只需修改低字节即可获得RAX = 1。x86-64 System V ABI不能保证这一点,但是Linux确实可以做到这一点。此代码仅_start在静态可执行文件中起作用。

0000000000000000 <_start>:
   0:   e8 0d 00 00 00          call   12 <hello>
   5:   48 65 6c 6c 6f
   a:   2c 20 57 6f 72
   f:   6c 64 21 5e 40

0000000000000012 <hello>:
  12:   5e                      pop    rsi
  13:   40 b7 01                mov    dil,0x1
  16:   b2 0d                   mov    dl,0xd
  18:   b0 01                   mov    al,0x1
  1a:   0f 05                   syscall
  1c:   b0 3c                   mov    al,0x3c
  1e:   0f 05                   syscall

调用指令将包含hello world字符串的下一个地址压入堆栈。我们将字符串的地址弹出到中rsi

然后,将其他参数设置为syscallto sys_write,以打印字符串。

该方案以终止syscallsys_exitsys_write返回写入的字节数,因此RAX的高字节在第一个字节之后为零syscall(除非返回错误),因此仅mov al, 60给我们提供了__NR_exit2个字节的RAX = 。

您可以通过关闭程序的stdout(./a.out >&-)来使该程序成为段错误,因此sys_write()将返回return -EBADF,第二个syscall将返回-ENOSYS,然后执行将结束。但是我们不需要write()优雅地处理错误。


特别是在这仅适用于Linux的,这里__NR_write是1。这不是在不同的x86-64 Unix系统标准。您还取决于Linux的行为,即在进入新进程之前将除RSP之外的所有寄存器清零(因此,仅当将其构建为静态可执行文件时,此方法才有效,否则动态链接器将在的高字节中留下垃圾,rax并且ll -ENOSYS)。x86-64 System V ABI表示,寄存器可以在进入时保留任意垃圾值_start,Linux内核本身将其选择为零以避免信息泄漏。
彼得·科德斯

您可以使用mov al, 1/ mov edi, eax(2个字节)保存一个字节,而不需要DIL的REX前缀,因为__NR_write == STDOUT_FILENO = 1
Peter Cordes '18

这仅在Linux静态可执行文件中有效,因此,确保字符串的地址在虚拟地址空间的2G之内(非PIE可执行文件的默认内存模型会将所有符号放在可以用作零或符号的位置,扩展的32位立即数)。因此,您可以使用5字节mov esi, msg(NASM)aka mov esi, OFFSET msg(GAS .intel_syntax。将您的字符串放在最后一个字符串之后syscallcall/pop比64位RIP相对LEA短1个字节,但mov最好。
彼得·科德斯

30字节版本的NASM源(已在我的桌面上检查大小),tio.run / ## TY8 /…
Peter Cordes,

42

六边形37 32字节

注意:我将向第一个在边长为3的六边形中找到有效解法或边长为4的可证明最优解的人提供500 rep的赏金。设法以4边长的六边形击败我的分数(通过在程序结尾获得更多无操作,这可以从源代码中省略),我也愿意为此提供较小的赏金。

H;e;P1;@/;W;o;/l;;o;Q/r;l;d;2;P0

在线尝试!

我自豪地展示了我的第二种2D编程语言,以及(据我所知)六角形网格上的第一种2D语言。

源代码看起来不是很二维,不是吗?好吧,Hexagony中的空白是可选的。首先,使用无操作()将源代码填充到下一个居中的六边形数字.。下一个这样的数字是37,因此我们在末尾插入五个no-op。然后将源代码重新排列为正六边形:

   H ; e ;
  P 1 ; @ /
 ; W ; o ; /
l ; ; o ; Q /
 r ; l ; d ;
  2 ; P 0 .
   . . . .

这也是可运行的。在线尝试!

Hexagony具有许多非常时髦的功能,包括6个不同的指令指针和一个内存布局(即六角形网格的线图),但是此代码仅使用一个IP和一个内存边缘,因此暂时不要担心。

以下是有关命令的概述:

  • 字母只是将当前内存边沿设置为其ASCII值
  • ; 将当前值以模256的形式输出到STDOUT。
  • / 是一个镜像,其行为符合您的预期(导​​致IP旋转了120度)。
  • 数字的工作方式与迷宫类似:将当前单元格乘以10,然后加自己。
  • @ 终止程序。

现在,最后的问题是源环绕所有3对边缘。此外,如果IP通过六个角之一离开网格,则有两行可能跳转到。选择哪一个取决于当前值是正还是非正。以下带注释的版本显示IP每次离开网格时在哪里重新输入:

         H ; e ;     -> 1
5 ->    P 1 ; @ /    -> 4
3 ->   ; W ; o ; /   -> 2
1 ->  l ; ; o ; Q /
4 ->   r ; l ; d ;   -> 5
2 ->    2 ; P 0 .    -> 3
         . . . .

因此,如果我们删除所有方向变化,则该程序归结为以下线性代码:

H;e;l;;o;Q2;P0;W;o;r;l;d;P1;@

有什么用Q2P0P1?字母很容易打印,因为我们可以将边缘设置为相应的值。对于逗号,空格和感叹号,这是行不通的。我们也不能只设置自己的价值有443233,分别,因为内存的边缘是非零开始,并且由于单个数字,将造成严重的种种破坏的语义。如果我们想做到这一点,我们不得不边缘价值的东西,如归零*+-&^第一。但是,由于该值在打印之前以256为模,所以我们不必将其值精确设置为44、32或33。例如,Q2将边值设置为81*10 + 2 = 812,即44当取模时256。这样,我们可以在这三个字符中的每个字符上保存一个字节。(不幸的是,这是永远不可能从已经具备。有趣的是,它的单元格值一个数字到那里工作是oWorld,因为这也可以从获得W9。)

您可以使用此CJam脚本查找导致给定字符的所有字母数字组合。

我不确定这是否最佳。我怀疑是否可以在边长为3的六边形(您只有19个字符)中做到这一点,但是有可能用少于32个命令在边长为4的六边形中解决它,例如在网格的尽头还有更多的无人值守。


1
该死,你击败了我。我本人正在研究一种类似于Cardinal的六边形语言。
ML 2015年

您是如何找到此解决方案的?用手还是蛮力?无论如何,+ 1 :)
Adnan

1
Q2P0而且P1很聪明。我不知道256模的部分。
阿德南

1
@Adnan在GitHub上建议使用mod-256部分的人实际上是这样做的,然后提供了可以将换行符打印为M8;(或g4;)的示例,此后我已经使用了几次。直到现在,在我做出更改后,我再也没有想过要重新回答这个问题。
Martin Ender

2
注意:减少到31前。H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
米奇·施瓦兹

38

Malbolge,112个字节

('&%:9]!~}|z2Vxwv-,POqponl$Hjihf|B@@>,=<M:9&7Y#VV2TSn.Oe*c;(I&%$#"mCBA?zxxv*Pb8`qo42mZF.{Iy*@dD'<;_?!\}}|z2VxSSQ

我要看看是否有一个较短的。自上次以来获得了更好的计算机,因此我可以更快地生成。

为了进行表演,这里是“ Hello World!” 没有逗号。

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

37

傅立叶,15字节

傅里叶发生了巨大变化!

`Hello, World!`

在FourIDE上尝试!

是的,打字了每个字符的ASCII码的日子已经一去不复返了:现在傅立叶样的支持字符串。当您在反引号中包含一个字符串时,将输出该字符串。

请注意,除了输出该字符串外,您不能做任何其他事情:您无法将其存储在变量中,也不会存储在累加器中,也没有字符串处理工具。


在这里,你可以找到火车失事,这是傅立叶。;)

72a101a+7aa+3a44a32a87a111a+3a-6a-8a33a

在线尝试!

现在,你们中的某些人可能以前见过Fourier,并且可能对这种语言相当熟悉。整个语言基于一个累加器:一个几乎所有操作员都使用的全局变量。

代码中最重要的部分是a运算符。这将获取累加器的数值,并使用Python代码将其转换为字符chr(accumulator)。然后将其打印到STDOUT。

不幸的是,我还没有使用傅里叶的机会(轻推眨眼眨眼),主要是因为它缺乏字符串和字符串运算符。即使这样,它仍然可用于许多其他挑战(请参阅其EsoLangs页面的示例部分)。

请注意,这比我进入Esolangs列表的时间短,因为我实际上认为我不能再打高尔夫球了。然后,在编写傅里叶弦高尔夫球挑战赛时,我意识到自己可以再短一些。

注意

如果您想了解变量语法,Geobits编写了一个使用变量并且长度相同的程序:

72a101a+7aa+3~za44a32a87aza+3a-6a-8a/3a

在线尝试!


有什么用处?像是有用的吗?
CalculatorFeline

35

C--,155个字节

target byteorder little;import puts;export main;section"data"{s:bits8[]"Hello, World!\0";}foreign"C"main(){foreign"C"puts("address"s);foreign"C"return(0);}

不幸的是,不再维护唯一的已知C--编译器QuickC。建造脖子很痛苦,但是可能...


8
真正令人着迷的语言-我以前从未听说过,这肯定是他们(正在/正在)做的一个雄心勃勃的项目。但是就代码高尔夫而言,我认为这不会成为竞争者。我的意思是...

11
@TimmyD这确实是一个汇编程序。它有一个原因输给了Java ... :)
kirbyfan64sos

我有个好消息要给你。尽管C--项目本身似乎已经死了,但其中一个变种却还很活跃。格拉斯哥Haskell编译器(GHC)使用C--作为组装或LLVM的最后阶段,并且该版本仍在积极维护中。无论安装什么(连同GHC的其余部分),都不会有什么麻烦。
dfeuer

@dfeuer事实上,我试过直接使用之前的Cmm的后端,但我有一些奇怪的问题,从来没有真正看过,更进一步¯\\ _(ツ)_ /¯
kirbyfan64sos

您可能可以在Haskell邮件列表上获得一些帮助。尝试glasgow-haskell-users@haskell.org,或者haskell-cafe@haskell.org。
dfeuer

33

C,30字节

main(){puts("Hello, World!");}

相当香草,但我想不出一种通常可编译的方法来缩短它(除非某种原始的asm技巧可能起作用?)。仍然击败大多数esolangs!


3
这没有一个单独的答案,但是完全符合ISO要求的C89和C99答案分别为39 main(){puts("Hello, World!");return 0;}和53 #include <stdio.h> int main(){puts("Hello, World!");}字节。如果您认为需要main(void),则要多一些。
Random832

20
@ Random832:对于前者,main(){return!puts("Hello, World!");}要短两个字节。
林恩

15
该程序h短29个字节。注意:您将不得不用-Dh='main(){puts("Hello, World!");}'一半的时间来编译它,一半地将自己与编译器滥用逗乐。
matega

19
@matega显然是作弊。为了避免作弊,您必须使文件仅包含__FILE__(8个字节)并命名该文件main(){puts("Hello, World!");}。然后就完全不是作弊了;)
C0deH4cker

实际上,到2017年,这些规则分别为34和38个字节。
CalculatorFeline

32

不可读843个 755 732 666 645 629 577字节

'“”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” '“”“”'“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” ”“'”“'”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“”“ “'”“'”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“ “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” ”“'”“'”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“ “'”“'”“”“”“”“”“”“”“”“”“”“”“”“'”“”“”“”“”“”“”“”“ “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“” '“”“”“”“”“”“”“”“”“”“”“”“”“”'“”“”“”“”“”“”“”“”“” “'”“'”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”

不可读的程序应该以可变宽度的字体显示,因此它们会尊重该语言的名称。我对更复杂的方法要花更长的时间感到有些失望。循环在“无法读取...”中异常昂贵

在线尝试!

这个怎么运作

不可读只有十个功能;此代码中使用了其中的六个:

'"        p Print.
'""       + Increment.
'"""      1 Return 1.
'""""""   : Set.
'"""""""  = Get.
'"""""""" - Decrement.

使用我的单字符表示法并添加一些空格和注释后,上面的代码如下所示。多行语句从下至上执行。

p+++                                        Print 3 + variable 2 (o).
 pp                                         Print variable 2 two times (l).
  :+1+++++++                                Save 8 + variable 3 in variable 2.
   p+                                       Print 1 + variable 3 (e).
    :++1+++++++++++++                       Save 13 + variable 4 in variable 3.
     :+++1+++++++++++++++                   Save 43 + variable 0 in variable 4.
      p++++++++++++++++++++++++++++         Print 28 + variable 0 (H).
       :-1++++++++++++                      Save 44 in variable 0.
        :1+++++++++++++++++++++++++++++++1  Save 32 in variable 1.
p=-1                                        Print variable 0 (,).
p=1                                         Print variable 1 ( ).
p=+++1                                      Print variable 4 (W).
p+++                                        Print 6 + variable 2 (r).
 p+++=+1                                    Print 3 + variable 2 (o).
p=+1                                        Print variable 2 (l).
p=++1                                       Print variable 3 (d).
p+=1                                        Print 1 + variable 1 (!).

我通过此CJam程序运行上述伪代码的未注释版本,从而生成了实际的源代码。


3
你在说什么?它很可读!
Optimizer

19
@Optimizer已修复。
丹尼斯

4
仍然可读!(当然,我说的是实话。您为什么不相信我?)
Optimizer

5
更好的霍夫曼编码会给这种语言带来好处,无论是在大小上还是在可读性方面。
2015年

30

Befunge 9819 18个字节

新答案(来自undergroundmonorail)

"ck,@!dlroW ,olleH

说明

  • " 启动字符串模式
  • 随后的所有内容都被推入堆栈。现在是堆栈Hello, World!@,kc
  • 到达终点后,口译员回到起点
  • "再次遇到,结束字符串模式
  • 12被推入堆栈(c
  • k 取栈的最高值并执行下一条命令,指令指针可以看到多次
  • ,从堆栈中弹出一个值并将其作为char输出。它由上一条k指令执行了12次,而当解释程序实际读取该,指令时,已执行了另一次
  • @ 结束程序

与旧答案的区别在于,当"字符到达行尾时,我们会通过使用Befunge的循环行为来巧妙地重用该字符。由于它可能不那么直观,因此我也将旧版本也包括在内。另外,您可能已经注意到,ck,@由于这个不错的技巧,堆栈中仍将包含一些字符(),如果我们想在那之后做一些事情,则会留下一些混乱。

旧答案

"!dlroW ,olleH"ck,@

这适用于真菌和真菌98

说明

  • 两者之间的所有内容都""被压入堆栈。('H'现在位于顶部。)
  • c (12)被推入堆栈
  • k 取栈的最高值并执行下一条命令,指令指针可以看到多次。
  • ,从堆栈中弹出一个值并将其作为char输出。它由上一条k指令执行了12次,而当解释程序实际读取该,指令时,已执行了另一次
  • @ 结束程序

2
我不认为93具有k
Sp3000

1
好了,现在它的98只可以使用c93+
PurkkaKoodari

3
在18:"ck,@!dlroW ,olleH
Undergroundmonorail

1
它点击"开始字符串,将整个行的其余部分添加到该字符串,环绕并点击相同"的字符串以结束字符串。现在,除了顶部之外,整个程序"都被压入堆栈!dlroW ,olleH。然后以与您相同的方式打印前12个字符,并在处停止@
地下

1
对于18字节的解决方案,我的解释器生成`Hello,World`(前导空格,无感叹号)。在无政府状态高尔夫解释(利用形式,选择Befunge-98,粘贴代码,提交)做了同样的。
primo

29

JSFuck6293 6289 6277字节

这可能是最长的“ 世界上最短的 Hello,World!程序”之一(实际上我不知道这是否是最佳的,但这是我设法获得的最短的时间)。

警告:仅适用于Firefox和Safari

[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]([(![]+[])[+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[!![]+!![]+!![]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]()[+!![]+[!![]+!![]]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+([][(!![]+[])[!![]+!![]+!![]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([![]]+[][[]])[+!![]+[+[]]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]]()+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(![]+[])[+!![]])()(!![])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]](([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(![]+[])[+[]])())[+!![]+[+!![]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]+(![]+[])[!![]+!![]]+([][[]]+[])[!![]+!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+(![]+[])[+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][(!![]+[])[!![]+!![]+!![]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([![]]+[][[]])[+!![]+[+[]]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]]()+[])[!![]+!![]])()((+(+!![]+(!![]+[])[!![]+!![]+!![]]+(+!![])+(+[])+(+[])+(+[]))+[])[+[]]+![])[+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]()[+!![]+[!![]+!![]]]+(+[]+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+[+[]]]))()

还有一个稍长的版本(+4字节),该版本也可以在Chrome和Microsoft Edge中使用:

对于那些不熟悉JSFuck的人来说,它是关于编写JavaScript的方式,就好像只有六个字符一样,它有时会变得很疯狂。

下表显示了Hello,World!中的字符程序是用JSFuck编码的。纯文本代码是alert("Hello, World!")

+----------+--------------------------------------+---------------------------+
|JavaScript|               write as               |           JSFuck          |
+----------+--------------------------------------+---------------------------+
|     a    | (false+[])[1]                        | (![]+[])[+!![]]           |
|     l    | (false+[])[2]                        | (![]+[])[!![]+!![]]       |
|     e    | (true+[])[3]                         | (!![]+[])[!![]+!![]+!![]] |
|     r    | (true+[])[1]                         | (!![]+[])[+!![]]          |
|     t    | (true+[])[0]                         | (!![]+[])[+[]]            |
|     (    | ([]+[]["fill"])[13]                  | 114 bytes                 |
|     "    | ([]+[])["fontcolor"]()[12]           | 539 bytes                 |
|     H    | btoa(true)[1]                        | 1187 bytes                |
|     o    | (true+[]["fill"])[10]                | 105 bytes                 |
|   space  | ([]["fill"]+[])[20]                  | 107 bytes                 |
|     W    | (NaN+self())[11]                     | 968 bytes                 |
|     d    | (undefined+[])[2]                    | ([][[]]+[])[!![]+!![]]    |
|     !    | atob((Infinity+[])[0]+false)[0]      | 1255 bytes                |
|     )    | (0+[false]+[]["fill"])[20]           | 114 bytes                 |
+----------+--------------------------------------+---------------------------+

这里的字符串"fill""fontcolor"等等必须写成"f"+"i"+"l"+"l""f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"进行编码。

全局标识符selfatobbtoa像这样写Function("return self")()

Function本身应该是[]["fill"]["constructor"]

逗号","很棘手,我不确定它是如何工作的,但我不是100%知道它使用[]["concat"]函数创建数组。有时间做更多测试时,我会发布更新。


我使用JScrewIt对此进行了编码-归功于GOTO 0,以创建这样一个复杂的工具:

  • 打开Firefox (您可以选择任何其他浏览器,但仅Firefox代码最短。)
  • 导航至JScrewIthttp : //jscrew.it
  • 输入: alert("Hello, World!")
  • 可执行代码:已检查
  • 兼容性:仅此浏览器

这与我对“ Hello”后出现逗号的问题的回答不同。

有趣的是,ES6语法

alert`Hello, World!`

由于编码两个反引号而不是("和的复杂性更高,因此需要花费更多的字节来编码(+1500左右)")


那么它在Android版Chrome
β衰变

在OS X上的Chrome中也可以使用
C0deH4cker 2015年

1
您在这里做得很棒!确保检查最近的更新。
GOTO

4
@ GOTO0等等...您是JScrewIt的作者,对吧?
我和我的猫

1
你怎么会这样调用函数?

29

Pada83 68字节

~.O~Ow~q~Owo~O~Oww~Q~qwo~q~O~wQ~q~w~q~q~Q~Ow~Q~Q~wo~q~w.~q~w.~.wO~qw

我认为这对于线性程序(即不使用控制流运算符?和的程序*)是最佳的。总体上来说,这可能是最佳选择,但是我不知道如何在如此少量的代码中使用那些额外的运算符(或者如何以编程方式探索这些可能性)。

在我开始通过电子邮件与作者讨论后,该语言最近发生了一些变化。但是,上周为语言规范的当前状态编写了参考实现,因此上述代码实际上是可运行的。

元高尔夫

最初,我将参考实现的输出用于此挑战,并在基础上创建了手工制定的解决方案。但是,那只是一种启发式方法。

因此,我改为在Mathematica中编写了一个求解器,该求解器实际上了解Pada数据结构和运算符,以找到最佳解决方案。平均而言,它随着字符串的长度线性增长(尽管某些字符组合比其他字符组合要慢一些),并且花了大约1.5个小时Hello, World!

所以我怎么去写求解器。首先,我们注意到我们只需要考虑6个运算符:(~.oOqQ加上w每个打印字符所必需的)。使用堆栈或位锁不是线性码有用的,我不相信,?*可以在小于68个字节的有效利用。

Pada的状态(忽略堆栈和锁)由7个开关和8位组成,如下所示:

       /
   /       \
 /   \   /   /
0 1 0 0 1 0 0 0

这就是可能的状态。我的第一个预处理步骤是建立状态的有向图,其中每个边对应于一个操作。也就是说,该图具有32768个顶点,每个顶点的出度为6(所考虑的6个操作中的每一个都具有一个出射边)。我们可以使用此图来查找任何两个状态之间的最短路径(仅此图对于Pada打高尔夫球可能非常有用)。215 = 32768

现在,对于每个字符,我们要达到一种w打印该字符的状态。有多少个这样的状态?w从被丢弃的位中读取字节(循环)。因此,字符的位有8种可能的旋转,它们可以全部打印该字符。对于这些旋转中的每一个,三个开关都是固定的(以便使w下落到正确的位置)。剩下4个任意开关。因此,我们在代码中为每个状态提供了可能的状态。8 * 24 = 128w

有了这些,我们可以解决另一个图形问题:构造一个图形,该图形具有一个源顶点,然后为每个字符提供一个“层”,再加上一个宿顶点。层由每个顶点的128个状态组成,源节点对应于程序的初始状态(所有开关都移到左侧,并且所有位均为零)。接收器节点特别对应于无状态。我们已经从一层中的每个顶点到下一层中的每个顶点定向了边缘,其中边缘权重是我们之前的图中两个状态之间的距离。从最后一层到接收器的边缘权重均为0。也就是说,我们可以预先计算所有这些边缘权重。这是计算过程中最昂贵的步骤,花费了1.5个小时Hello, World!

通过设置此图,我们可以很快找到从源到接收器的最短路径(在我的计算机上花费了0.05秒)。对于Hello, World!所需的状态是:

0, 16960, 22052, 13828, 13828, 30389, 12487, 8307, 27299, 23450, 18922, 22778, 18682, 18459

其中最低有效7位对应于开关,最高有效8位对应于Pada的位。

现在,我们回到第一个图形,找到与每对后续状态之间的最短路径相对应的实际边(即操作),并以结尾w。Voilà,一个最优的解决方案(基于上述假设)。

如果有人想在Pada中将另一个字符串变元高尔夫球,这是完整的Mathematica:

string = "Hello, World!";
width = StringLength@string;
getState[letter_, state_] := (
  {shift, switchState} = IntegerDigits[state - 1, 16, 2];
  bits = RotateRight[
    IntegerDigits[ToCharacterCode[letter][[1]], 2, 8], shift];
  switchState = IntegerDigits[switchState, 2, 4];
  switches = {-1, -1, -1, -1, -1, -1, -1};
  {top, middle, bottom} = IntegerDigits[shift, 2, 3];
  switches[[1]] = top;
  If[top < 1,
   switches[[2]] = middle;
   If[middle < 1,
    switches[[4]] = bottom,
    switches[[5]] = bottom
    ],
   switches[[3]] = middle;
   If[middle < 1,
    switches[[6]] = bottom,
    switches[[7]] = bottom
    ]
   ];
  For[i = 1, i <= 7, ++i,
   If[switches[[i]] < 0,
    switches[[i]] = First@switchState;
    switchState = Rest@switchState
    ]
   ];
  {bits, switches}
  )
encode[state_] := FromDigits[Join @@ state, 2]
decode[id_] := Partition[IntegerDigits[id, 2, 15], 8, 8, 1, {}]
getBitFromSwitches[switches_] := (
  If[switches[[1]] < 1,
   If[switches[[2]] < 1,
    1 + switches[[4]],
    3 + switches[[5]]
    ],
   If[switches[[3]] < 1,
    5 + switches[[6]],
    7 + switches[[7]]
    ]
   ]
  )
toggle[list_, index_] := ReplacePart[list, index -> 1 - list[[index]]]
stateEdges = Flatten@Table[
    {bits, switches} = decode@id;
    bit = getBitFromSwitches@switches;
    {
     Labeled[id \[DirectedEdge] encode@{bits~toggle~bit, switches}, 
      "~"],
     Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~1}, "."],
     If[switches[[1]] < 1,
      {
       Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~2}, 
        "o"],
       Labeled[
        id \[DirectedEdge] encode@{bits, switches~toggle~1~toggle~3}, 
        "q"],
       If[switches[[2]] < 1,
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~4}, 
         "O"],
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~5}, 
         "O"]
        ],
       If[switches[[3]] < 1,
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~3~toggle~7}, "Q"],
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~3~toggle~6}, "Q"]
        ]
       },
      {
       Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~3}, 
        "o"],
       Labeled[
        id \[DirectedEdge] encode@{bits, switches~toggle~1~toggle~2}, 
        "q"],
       If[switches[[3]] < 1,
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~6}, 
         "O"],
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~7}, 
         "O"]
        ],
       If[switches[[2]] < 1,
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~2~toggle~5}, "Q"],
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~2~toggle~4}, "Q"]
        ]
       }
      ]
     }
    ,
    {id, 0, 2^15 - 1}];
stateGraph = 
  Graph[# & @@@ stateEdges, EdgeLabels -> Rule @@@ stateEdges];
uid = 0;
layers = Join[{{{uid++, 0}}}, 
   Table[{uid++, encode@getState[#, i]}, {i, 128}] & /@ 
    Characters@string, {{{uid++, -1}}}];
edges = Flatten[Table[
      from \[DirectedEdge] to
      ,
      {from, #},
      {to, #2}
      ] & @@@ Partition[layers, 2, 1], 2];
Timing[weights = (
     {from, to} = Last /@ List @@ #;
     If[to < 0,
      0,
      GraphDistance[stateGraph, from, to]
      ]
     ) & /@ edges;]
characterGraph = Graph[edges, EdgeWeight -> weights];
Timing[path = 
  Last /@ Most@
    FindShortestPath[characterGraph, {0, 0}, layers[[-1]][[1]]]]
(PropertyValue[{stateGraph, #}, EdgeLabels] & /@ 
      DirectedEdge @@@ 
       Partition[FindShortestPath[stateGraph, ##], 2, 1] <> "w" & @@@ 
   Partition[path, 2, 1]) <> ""

在=)上执行metagolf的有趣语言。这让我想知道,您的日常工作是什么?oO
justhalf 2015年

4
@justhalf我目前在硕士学位和博士学位研究之间处于困境(因此,如果那是您的意思,我肯定会花太多时间;)。(尽管这通常更多是关于聊天的讨论:))
马丁·恩德

Pada的意思是在印度尼西亚/马来语的巴哈萨语中。有关系吗?
XiKuuKy '16

@XiKuuKy afaik,该语言称为Pada,因为它的意思是克罗地亚语中的“ falling”。
马丁·恩德

而这个答案(请参阅此处)。您可能可以将2个答案合而为一来描述这个奇妙的Hello World问题。
Vitaliy Kaurov '17
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.