实施真机


148

真机(学分转到这家伙能想出它)是一个非常简单的程序,旨在展示一种语言的I / O和控制流。这是真机的作用:

  • 从STDIN获取一个数字(0或1)。

  • 如果该数字为0,则输出0并终止。

  • 如果该数字为1,则永远打印1。

挑战

用您选择的语言编写如上所述的真机。真机必须是遵循以下规则的完整程序:

  • 接受STDIN或可接受的替代方法的输入
    • 如果您的语言不能接受来自STDIN的输入,则可能来自程序中的硬编码变量或适当的等效输入
  • 必须输出到STDOUT或可接受的替代方案
    • 如果您的语言无法输出字符01,则可以接受字节或一元I / O。
  • 当输入为时1,它必须连续打印1s,并且仅在程序被终止或内存不足时停止
  • 输出只能是0后跟一个或没有换行或空格,或者是infinite 1,每个1后跟一个或没有换行或空格。除了无法避免的语言解释器的恒定输出(例如问候语,ANSI颜色代码或缩进​​)以外,无法生成其他任何输出。您对换行符或空格的使用必须保持一致:例如,如果您选择在1换行符后输出,则所有换行符或空格后都1必须有换行符。

  • 当且仅当您的语言可能无法在其输入上终止时0,代码才可以进入无限循环而没有任何输出的情况是可接受的。

由于这是一个目录,因此可以竞争之后创建的语言。请注意,必须有一个解释器,以便可以测试提交。允许(甚至鼓励)自己为以前未实现的语言编写此解释器。除此之外,必须遵守所有的标准规则。大多数语言的提交都将以适当的预先存在的编码(通常为UTF-8)以字节计分。

目录

这篇文章底部的Stack Snippet从答案a)生成目录,答案是每种语言的最短解决方案列表,b)则是总体排行榜。

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

## Language Name, N bytes

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

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

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

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

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

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


对于处理器代码输入,我们是否可以假定程序在处理器完成执行编写的代码后停止运行?
lirtosiast

3
假设所有无效输入都适合任何行为?
Cruncher

3
@Cruncher是的,您应该期望获得的唯一输入是0和1。–
一幅意大利面条

4
目录无聊。
艾迪生·克伦普

2
目录似乎在考虑Bf并且bf是不同的语言。
Mooing Duck 2015年

Answers:


188

六边形,6字节

这出奇的棘手,而且我不认为这是最佳的...

<.@!$?

填充并展开代码后,这表示以下十六进制网格:

在此处输入图片说明

这使用了类似的控制流程,例如我最近使用的无错误cat程序,它沿着反对角线移动。为此,我们首先将指令指针(IP)偏向左侧,紫色的路径环绕到左下角。

?读取输入为整数。!打印回来。.只是一个禁忌。现在,网格的角充当分支:

如果输入的是0IP,则IP将沿红色路径继续,该路径仅以终止程序@

如果输入为1,则IP将在绿色路径上继续。同样,.这只是一个$禁忌操作,但等同于Befunge的蹦床:它将跳过下一条指令。换行后,下一条指令将为?,但由于$执行实际上在蓝色路径上继续,因此从!打印的另一副本开始1!..$现在仅无限重复此仅包含的循环。

六角形控制流的研究...

我相信上述解决方案是最佳的。我写了一个野蛮的冲头,检查所有6个字节Hexagony方案,其中包含每一个的至少一个?!@(这是必要的;我还检查:%到位的@一个师零错误终止,但那也没有帮助)。支票打印所有程序,其中a)产生0on输入0并终止,b)产生至少12s(无其他值),并且终止于程序的前60个滴答声(5字节解决方案为200个滴答声) 。我怀疑任何有效的解决方案都需要200多个滴答声才能在如此小的网格上正确打印第一个0或第二个1,所以我认为我没有错过任何潜在的解决方案。

搜索没有得到5个字节的任何结果,但是得到了6个字节的57个结果(使用@;如果我们可以在相同数量的字节中干净地解决这个问题,则无需以错误结尾)。在这57个中,只有6个为假阳性,实际上只打印了2 1s,然后进入了无限循环而不再打印。一种解决方案被列出两次,因为它包含两个!命令。剩下的就是50个有效的解决方案。

解决方案之间存在一定程度的简并性,其中一个或两个字符并不重要,例如,因为它们实际上实际上是无操作的。解决方案可以分为23套真正不同的程序(在某些情况下,两组之间只有一个字符差异,但是它会大大改变控制流程,因此我将它们分开计算)。其中两个组甚至以非常意外的方式使用多个指令指针。由于我永远不会想出使用支路和镜面的大多数方法,因此它们对Hexagony中可能存在的控制流类型进行了非常有趣的研究,并且我无疑为以后的高尔夫学习了一些新技巧。

整体控制流程几乎都是一样的:看一个数字,打印。如果0找到通向的方法@,则在保持!边值的同时继续循环浏览1。有四个值得注意的例外:

  • 一种解决方案(具有两个解决方案!1每次通过网格打印两次,因此打印速度约为大多数程序的两倍。我已经在x2下面标记了这个。
  • 一些解决方案(那些包含o)替换1111(字符代码o),所以它们打印3个 1每人S迭代,使他们以最快的速度打印约三倍,因为大多数的节目。我在x3下面用这些标记。
  • 在每次迭代中,有两个解决方案 a 附加1到边缘值上(因此1-> 11-> 111-> ...)。这些打印速度非常快,但最终它们将耗尽内存。我在OoM下面用这些标记。
  • 两种解决方案进入一个非常紧密的循环,该循环仅!在上来回跳动,每隔一个刻度(而不是每5个左右)打印一次,这使它们略快(更整洁)。我在><下面用这些标记。

所以这是整个动物园:

#1                #5                #12                #19
?!/$.@            ?$!>$@            .?!/$@             |!|?$@  # ><
?!/$1@  # OoM     ?$!|$@            =?!/$@
?!/$=@                                                 #20
?!/$\@            #6                #13                $@.?<!
?!/$o@  # x3      ?/!<|@            .?/!$@             $@1?<!  # OoM
?!/$!@  # x2                        =?/!$@             $@=?<!
                  #7                                   $@o?<!  # x3
#2                ?\!<|@            #14
?!>$)@                              \!?__@             #21
?!>$1@            #8                                   _>_!?@
?!>$o@  # x3      ?<!>$@  # ><      #15
?!|$)@                              \_?!$@             #22
?!|$1@            #9                                   <!@.$?
?!|$o@  # x3      ?\$!@$            #16                <!@/$?
                                    \_?!_@             <!@=$?
#3                #10                                  <$@!$?
?!|)$@            ?~#!@)            #17                <.@!$?
?!|1$@            ?~#!@1            $$?\@!             </@!$?
?!|o$@  # x3                                           <=@!$?
                  #11               #18
#4                ?$)\@!            \$?\@!             #23
?_!<@>            ?$1\@!                               <<@]!?
                  ?$o\@!  # x3

以下是少数几个具有代表性的小组的简短演练。特别是第10组和第23组值得一试。在其他小组中,还有许多其他有趣且有时令人费解的路径,但是到此为止,我想我已经很无聊了。对于真正想学习六角形的人来说,这些绝对值得研究,因为它们展示了更多可能的镜子和用途$

第一组

这个解决方案比我最初的解决方案要复杂得多,但是路径却朝着不同的方向发展。它还可以在单​​个单元格中实现最大数量的变体,因为最右边的无操作可以用5个不同的命令代替,这些命令在不更改结构的情况下仍然有效:

在此处输入图片说明

2组

这个很有趣,因为它只能水平移动。包装到后>,IP立即反转,将分支移到角落。显然,这并不是完全没有图表,但是在1我们再次遍历第一行的情况下,但是这次是向后的。这也意味着我们?再次遇到,现在返回0(EOF)。这是固定的)(递增)以保持打印1。这也有5个变体,)也可以是1o>也可以是|

在此处输入图片说明

第三组

这个看起来和上一个几乎一样,但是很混乱。直到击中|然后遍历底行或顶行都是一样的。但是,在一个循环的情况下,$现在将跳过的) 反射镜。所以我们按照绿松石路径正确,打到现在的增量,跳过@之前,我们绕到| 再次回到绿色通道顶部。

在此处输入图片说明

4组

我认为这个特别好看:

在此处输入图片说明

_右上角的镜子最初是禁止操作的,因此我们使用打印!并点击<0现在,路径撞击水平镜并终止。不过,该1路径采用了一个非常有趣的轨迹:它向下偏转,环绕到!,重新定向到水平,然后! 再次环绕到。然后,它继续以菱形形状移动,每次迭代打印两次(每三个刻度)。

8组

这是两个打印循环非常紧密的解决方案之一:

在此处输入图片说明

<充当分支。包装两次后,0命中@1另一方面,首先跳过?,然后再次>将其发送到$,因此跳过@。然后,IP 绕入青绿色的路径,在该路径之间,它在>和之间来回反弹<(环绕在它们之间的边缘处)。

第10组

使用其他指令指针的两组之一,它绝对漂亮。六角形有6个-每个都从顺时针边缘的不同角开始,但是一次只有一个处于活动状态。

在此处输入图片说明

像往常一样,我们用阅读?。现在~是一元的否定:它把1-1。接下来,我们点击#。这是在IP之间进行切换的一种方法:它将当前边沿值取模6,然后切换到相应的IP(IP 0沿顺时针方向编号)。因此,如果输入的是0IP,则IP仍然保持不变,并且无聊地直接进入!@。但是,如果输入的是1,那么当前值是-15 (mod 6)。因此,我们切换到在同一单元(绿色路径)上开始的IP。现在#是无操作,?并将内存边缘设置为0)递增,因此!输出1。现在我们~再次点击以确保#仍然是空操作(与将我们切换到IP 1会终止程序相反)。令人难以置信的是,在这个小程序中,各方面的融合程度如何。

22组

请注意,这是我最初的解决方案所在的组。它也恰好是最大的组,因为无操作可能位于两个不同的位置,并且实际(有效的无操作)命令有多种选择。

23组

这是另一个使用多个IP的组。实际上,这个使用3个不同的IP。右上角有些混乱,但我将尝试向您介绍:

在此处输入图片说明

因此,您之前看到的开始:<偏向东北,?读取输入。现在]是在IP之间进行切换的另一种方法:它将控制权按顺时针顺序移交给下一个IP。因此,我们将控制切换到绿松石路径,该路径(从我知道很难看到)始于东北角,朝东南方向延伸。它立即被反射,<从而环绕到东南角,向西北延伸。它命中了,]所以我们切换到下一个 IP。这是一条从东角开始向西南行驶的灰色小路。它打印输入,然后包装到东北角。<将路径偏转到水平方向,并在另一 方向反射<。现在是右手<充当分支:如果输入为0,则IP向东北移动,并包装到@。如果输入为1,则IP移至!,然后缠绕到<左上角,然后反射到该处...现在在角落,它绕回到上!,向右偏斜<,由左侧反射,<路径开始过度...

一团糟,但一团糟。:)


Timwi的惊人HexagonyColorer生成的图。


55
哇 只是哇。
Conor O'Brien 2015年

6
^同意。太酷了…
El'endia Starman 2015年

28
闭嘴,接受我的投票!
Mego

7
@ThomasOltmann我承认这个答案假定您已具备某种语言的基本知识。如果您实际上有兴趣了解更多有关它的知识,那么我已经遍历了此答案此答案中的基础知识,但是如果您不愿意,我不会怪您。;)
Martin Ender 2015年

5
是的...内存模型看起来有些痛苦(我想还是比一维磁带好)
John Dvorak

144

摩托罗拉MC14500B机器代码,2个字节

十六进制:

58EC

说明:

5  OR the register with input from the data bus
8  Write the register to the data bus
E  Skip next instruction if register is zero
C  Jump

摩托罗拉MC14500B是1位微控制器;它具有一个1位寄存器和一个1位数据总线。由于每个操作码都是4位,因此只有16位。它们中的一半在寄存器和数据总线上的位之间执行逻辑运算。

跳转指令设置跳转标志。当未提供地址时,通常将程序计数器设置为0。如果输入位为零,则处理器将不会跳转。如果输入位为1,则处理器跳回到起始位置;否则,输出为0。因为我们正在OR处理输入,所以输入什么信号都没关系-寄存器将永远为1。

按照常规,该寄存器初始化为0。

可以在数据表或此处找到操作码列表。


7
2字节绝对是此挑战的最低要求。
Conor O'Brien 2015年

23
@CᴏɴᴏʀO'Bʀɪᴇɴ我已经在esolangs和4位处理器列表中寻找了几个小时,以查看是否有1或1.5,但没有找到。
lirtosiast

绝对是工作的正确工具。
雨果·辛克

链接无聊的atm ...
TheDoctor 2015年

@TheDoctor这两个链接对我来说都很好
Mego

85

阿诺德C,296字节

IT'S SHOWTIME
    HEY CHRISTMAS TREE i    
    YOU SET US UP @NO PROBLEMO
    BECAUSE I'M GOING TO SAY PLEASE i
        STICK AROUND i
            TALK TO THE HAND i
        CHILL
    BULLSHIT
        TALK TO THE HAND i
    YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

竞争并不算真正,但是很有趣。不支持标准输入,替换@NO PROBLEMO@I LIED零值。@No Problemo是1。

运行(假设文件为truemachine.arnoldc):

wget http://lhartikk.github.io/ArnoldC.jar
java -jar ArnoldC.jar truthmachine.arnoldc
java truthmachine

46
美丽。我哭了10/10
意大利面条

10
BECAUSE I'M GOING TO SAY PLEASE大声笑
埃里克·马丁内斯

8
看起来这样做if(i){while(i) print(i);} else {print(i);}确实会更短print(i);while(i) print(i);吗?
lirtosiast

16
尽管BULLSHIT对节目的娱乐价值有很大的贡献,但从技术上讲它是不必要的。那么您可以在整个BULLSHIT移动分支出来TALK TO THE HAND i之后YOU HAVE NO RESPECT FOR LOGIC
gaborsch 2015年

4
@GaborSch对于此问题,只有一个适当的答复:BULLSHIT;)
caird coinheringaahing

65

Minecraft,18字节(MC版本15w45a)

我的世界素描

如您所见,在重复命令块中有一个控制杆,其中包含命令say 1。最重要的是有一个信号反向割炬,它可以将功率引导到带有命令的单次运行命令块say 0中。

每当开关指向真实状态时,转发器块都会使用该代码say 1输出无限大的1s。当操纵杆重定向到false时,它输出一个0

请注意,[@]默认情况下会输出a 。如果您确实只想将1和0向上取整,那么它将变为34字节,其中命令块中的代码为tellraw @a [1]tellraw @a [0]。这是使用@CᴏɴᴏʀO'Bʀɪᴇɴ为MC建议的字节数,可以在Meta中找到


28
您使用视频游戏进行代码高尔夫。+1
RK。

11
@RK。对于简单的挑战,这实际上是相当标准的做法。至少还有另外两个用户将MC用作打高尔夫球的代码语言-尝试使用搜索栏is:answer Minecraft。c:
Addison Crump 2015年

1
@FlagAsSpam大声笑很好。另外,感谢您提供搜索MC答案的提示。
阿什温·古普塔


38

Ruby,20岁

print while/1/||gets

从命令行运行以避免警告,如下

ruby -e "print while/1/||gets" <<< 0
ruby -e "print while/1/||gets" <<< 1

说明:

少打高尔夫球,这是

while /1/ || gets
  print
end

在条件表达式中使用Regexp时,除非变量$_已填充且与模式匹配,否则它的评估结果为false 。第一次通过循环时,$_为空,因此我们进入gets,将的值设置为$_从STDIN读取的行。print没有参数打印$_。现在,我们再次评估条件。如果我们读入1,则会短路并再次打印1,以此类推。否则,我们进入gets,但是由于没有第二行输入,gets返回nil,因此循环结束。


18
当琐碎的任务甚至允许使用“正常”语言的解决方案时,这也是很好的选择。:)
马丁·恩德

这个||gets部分很酷,但是您不能只做gets;print while/1/并保存一个字节吗?
daniero

不,那么它根本不会显示0。
histocrat

37

Microscript,3个字节

i{p

我知道的最短的一个。

说明:

i  Takes numeric input and puts it in register 1
{  while register 1 is truthy
  p  Print the contents of register 1

Microscript在终止时隐式打印了寄存器1,这就是为什么输入0一次被打印的原因。


@quartata我匹配了您:D
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ:O
意大利面

2
我很想知道您是先写问题还是回答...
John Dvorak

1
问题。我只想发布此文章,因为这是我在撰写问题时想到的最短的文章。这是一个目录,因此没有真正的赢家。
意大利面条


25

JavaScript,28个字节

for循环通常比while循环短。

alert(x)回报undefined,这是falsy,所以按位或运算符,|,注塑它0。因此,如果x"0",则提醒一次,否则继续循环。使用alert像STDOUT 这个答案

for(x=prompt();alert(x)|x;);

射击,你击败了我。我正要发布这个!:) GG
多米诺骨牌

哇,这比我的聪明得多:) +1!
ETHproductions

您不需要结尾的分号。
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ您使用了什么浏览器?我在Firefox和Chrome上进行了测试,但SyntaxError没有它。
intrepidcoder

@intrepidcoder哦,对不起,我不好。我的想法是“尾随分号无用”模式。^^“
Conor O'Brien 2015年


20

Brainfuck,41 36 31 30字节

输入后立即在Ethan和user46915的帮助下打印一次即可缩短。

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

以前的版本:从输入中减去48,如果它不为零,则将48加1以1永远打印ASCII ,否则打印0

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

我在这里运行它,但是由于缓冲了输出,您看不到任何输出,因为该程序永不终止于1

编辑:我忘了0在input 上打印0。立即修复。我喜欢最后的>.<面孔。


1
@ThomasKwa我猜不是,但是我不确定,因为我没有看到专门针对模2的算法。divmod算法有点长。
mbomb007

2
您可以通过将代码段更好地合并在一起,并直接使用输入寄存器而不是使用单独的“ 48”寄存器来缩短代码长度:,.[>+>+<<-]-[>-<-----]>+++[>.<]
Ethan 2015年

尝试使用mod 2解决方案。无疑,减去48是正确的方法。 ,.[->+>+<<]>>[->[>-<[-]]>+[<+>-]<<]>[<<.>>]
cardboard_box

1
@Ray这是默认设置,通常被认为是。如果我使用其他实现,我会这么说。
mbomb007

1
您可以通过组合减法和复制一起再减去一个字节:,.+++[->>+<-----<]>>---<-[>.<]
user46915

19

Piet,27 18 16编码

(Codel是一个奇特的像素名称,用于在拉伸图像以供查看时避免混淆。由于计数脚本被保存为图像,因此我计算了Codel而不是字节,因此物理尺寸可能会有所不同。我认为理想的文件格式可以节省此Piet尽可能高效地占用11个字节。实际上,我的gif文件只有62个字节,具有最佳的调色板数据。请告诉我是否应将其用作条目的大小而不是编码量。)

原始图片: 小版本

放大: 放大版

在piet中,两种颜色之间的差异决定了要运行哪个命令,因此两次看到相同的颜色并不意味着它执行相同的操作。执行从左上角的编解码器开始。然后它水平移动,执行以下操作:

  1. 读一个数字并将其放在堆栈上
  2. 复制堆栈顶部
  3. 弹出并输出堆栈顶部
  4. 弹出堆栈的顶部,然后顺时针旋转该次数。

如果输入为1,则光标会向下移动到石灰编码中,从而将1压入堆栈。然后执行继续向左移动。当光标从一种颜色变成白色,从白色变成一种颜色时,什么也没有发生。由于黑色也被视为墙,因此光标最终返回到第一行的石灰代码,并重复步骤2的整个过程。

但是,如果输入为0,则如果光标停留在该位置(因为顶部,右侧,左侧和顶部),则光标将永远不会向下移动,并最终会出现在右侧的蓝色J中(双关语是值得的)。此J形块的底边靠近黑色编码或图像边缘。由于光标被捕获,执行结束。

意外的值:
如果用户写了另一个数字,它仍然会被打印,然后光标将根据该值旋转或多或少的次数。

  • 4或0的倍数:水平继续执行并结束。
  • 3的倍数:由于不可能向上移动,因此光标立即沿顺时针方向旋转并继续水平移动,然后结束。
  • 2的倍数,而不是4的倍数:光标旋转并开始向左移动。幸运的是,所有这些操作是执行了一系列不影响程序流程的操作,最终清空了堆栈。当由于堆栈为空而无法执行操作时,将被忽略。当它到达左上角时,光标别无选择,只能再向右移动,从而有效地重新启动程序。
  • 其他值:光标向下移动,好像与1一样向下,这使其永远打印1。如果输入为5,则输出为5111111111111...

任何非整数值都将终止程序。执行将正常继续,但是由于堆栈中没有任何内容,所有操作将被忽略。因此,从某种意义上讲,该程序永远不会崩溃-它要么正常停止,要么永远循环。


PietDev友好版本

PietDev(一个非常基本的在线Piet IDE)似乎在使用白色编码时遇到了麻烦,因此我制作了一个新版本,该版本手动旋转回去,而不是依靠适当的白色编码自动旋转。而且我什至不需要使用新的颜色!如果要对其进行测试,请确保在代码周围绘制黑色边框,因为PietDev不支持自定义程序大小。

小版本

放大版


旧版本

第一个版本没有将1压入堆栈,而是循环回到了较早的复制指令。它也有装饰性的无用的代码。

微小的图案,实际上是皮特码

放大版

然后我想到将1压入堆栈以删除空白行。多亏了我的装饰编码,我对它的想法感到很有趣。

小版本

大版本

然后我意识到我有了多余的重复项,我减少了颜色数量以节省图像中的调色板数据。我也摆脱了单一的装饰编码,因为我不知道。


7
我从未见过Piet答案在除编解码器之外的任何评分标准,但我认为包括以下内容在内的最佳字节数也很有趣:)
Undergroundmonorail

1
有20个不同的编解码器值,这意味着您应该能够将三个编解码器打包成13位,然后将8个三元组打包到13个字节中,以便每字节2.6个编解码器存储密度。但是,必须先定义该语言。我建议名称DPPi =密集包装的小馅饼。
约翰·德沃夏克

1
@JanDvorak我计算了21个值,以添加一个特殊的换行符,一旦获得第一个换行符,解析器就可以猜测其他值应该在哪里。但是我并没有深入探讨将编码组合成三胞胎,这比每个编码浪费5位要有意义得多。聪明。
Domino

1
只需将尺寸添加为前几个字节即可。您不需要额外的符号。
约翰·德沃夏克

1
@每个想要尝试的人:不要用PietDev尝试此解决方案,因为PietDev仅打印单个1并终止。但是该解决方案可以与npiet一起正常使用。
ML

19

Pyth, 4 3 2

Wp

一个不!尾随空格(感谢isaac :))。以前需要使while循环编译的空间,但是Pyth已更新。通常,这将取消使用它的资格,但是由于这是目录,因此它应该有效。

说明:

Wp        : implicit Q = eval(input)
W         : while
 p        : print and return the value of Q, to be evaluated as the while condition
          : Functions without enough arguments automatically use Q now
          : do nothing in the body of the while loop

5
这个答案让我感到惊讶,我在Pyth中添加了隐式pass。现在不再需要该空间。pyth.herokuapp.com/?code=WpQ&input=0&debug=0
isaacg

52
越过四个仍然看起来像四个。
科纳·奥布莱恩

1
恩,我一直对沉没无聊无事一直无所不在:(。大声笑。–
Ashwin Gupta

1
@AshwinGupta 我的语言在技术上胜过它,所以它并不完全占主导地位:)
Cyoce

@Cyoce是的!做得好!我放心,有些东西可以击败pyth哈哈。
Ashwin Gupta'1

16

芯片,6字节

e*faAs

芯片是一种2D语言,其行为有点像集成电路。它一次只能输入一个字节,然后将这些位分解为各个输入元素。输出将输出元素的值缝合在一起,重新组合为字节。

让我们分解一下:

*是一个源信号,它将向所有相邻元素发送一个真实值。 ef对应于输出的第五和第六位。因此,e*f产生binary 00110000,即ASCII字符“ 0”。

现在,A是输入a的第一位,是输出的第一位,因此aA将该位从输入复制到输出。因此,当与组合使用时e*f,ASCII输入“ 0”将产生“ 0”,而“ 1”将产生“ 1”。(f和之间没有交互a,因为两者都不会产生任何信号。)

s上月底,一个真正的信号启动时,将阻止前进到下一个字节,这意味着整个事情会以相同的输入再次运行输入。

由于“ 0”的第一个字节为零,因此它将不会激活该元素,并且程序将打印“ 0”,从而耗尽其输入,从而使其终止。但是,“ 1”激活此元素,这意味着将输出“ 1”,但不会在输入上消耗“ 1”,从而允许循环无限期重复。

如果使用值0x0和0x1而不是ASCII进行输出,我们可以删除该e*f部分,仅产生3个字节

aAs

如果零必须自己终止,而不是期望stdin关闭,我们将得到以下代码,该代码用反转第一个字节~,并将结果传递给t,从而终止程序(10个字节):

aA~te*f
 s

t也不会产生信号,因此tand 之间没有交互e。)


2
好答案!由于这是目录挑战,因此无需将其标记为不竞争,因此我为您删除了这一点。欢迎来到PPCG!
Mego

4
我自由地将Chip添加到TIO。在线尝试!
丹尼斯,

@Dennis,问您一个问题:我将如何让TIO更新其来源?上周,我修复了Chip解释器中的一个错误,但尚未将更改传播到TIO中。这是我需要请某人为我做的事情吗?
Phlarx

我已经拉起Chip。如果您需要更新,请在talk.tryitonline.net留言
丹尼斯


13

LOLCODE,119个字节

GIMMEH n
n R SUM OF n AN 0
BOTH SAEM n AN 0, O RLY?
YA RLY
 VISIBLE 0
NO WAI
 IM IN UR l
  VISIBLE 1
 IM OUTTA UR l
OIC

取消高尔夫:

HAI

BTW, Read n as a string from STDIN and convert to an integer
GIMMEH n
n R SUM OF n AN 0

BTW, Test n for equality with 0
BOTH SAEM n AN 0, O RLY?
YA RLY
    BTW, Write 0 to STDOUT and exit
    VISIBLE 0
NO WAI
    BTW, Loop forever, printing 1
    IM IN YR l
        VISIBLE 1
    IM OUTTA YR l
OIC

KTHXBYE

1.您使用哪个口译员?2.你MAEK n A NUMBR可以投吗?3.可以DIFFRINT代替BOTH SAEM条件切换使用吗?
lirtosiast,2015年

@ThomasKwa我在repl.it上使用LOLCOFFEE。(目前看来情况不太理想,因此一旦恢复,我将测试您的建议。)
Alex A.

不转换O RLY?为布尔值吗?
Leaky Nun

@LeakyNun不...?O RLY?就像一个后缀if
Alex A.

12

C,37个字节

在C中如何做的另一种看法。

main(c){for(gets(&c);putchar(c)&1;);}

c默认为1 int的值。gets(&c)从那里获取一个字符串stdin,在这里破坏了值c,因为c它不是a char*putchar(c)打印cto 的值stdout,并返回c。因为'0'是48,'1'ASCII中是49,所以我们可以使用最后一位(&1)来确定它是哪个。如果是'0',则循环中断。否则,它将永远存在。

编译(带有的警告gets)并gcc-4.8在Linux上运行。


2
大概这仅适用于小端架构。
尼尔

@尼尔我会这样认为。
cbojar

@Neil Endianness仅影响多字节值中的字节顺序。
LegionMammal978 2015年

1
@ LegionMammal978 c默认为int,这是一个多字节值,在big-endian架构上,gets将设置错误的字节。
尼尔

11

迷宫,7字节

 ?+
@!:

迷宫是一种基于2D堆栈的语言,其中控制流取决于堆栈顶部元素的符号,每条指令后都要检查。执行从最上面一行的第一条有效指令开始向右移动?

相关说明是:

?      Input integer
+      Add top two elements (Labyrinth's stack has infinite 0s on the bottom)
:      Duplicate top element
!      Output as number
@      Terminate program

如果输入为0,则IP读取带有的输入?,将堆栈的顶部两个(0 + 0 = 0)相加,然后复制:并输出!0。在这里,我们在程序中遇到唯一的结点,必须检查堆栈的顶部以确定去哪儿。由于顶部为0,因此我们向前移动并以终止@

另一方面,如果输入为1,则在到达处的结点之前,我们会执行与之前相同的指令(但输出为1)!。现在,堆栈顶部为正,导致我们右转到?。在EOF上,迷宫推0,因此我们0 + 1 = 1+,重复:和输出处执行操作!。再一次,我们在堆栈的顶部有一个1,循环继续。

作为奖励,这是@MartinBüttner的7字节解决方案,其操作类似:

?+!@
1!

请注意,与大多数语言不同,1实际上是从n堆栈中弹出并压入n*10 + 1,使大量的构建变得容易。但是,由于此时栈顶是空的,因此与仅压入1没有什么不同。


10

> <>,7个字节

i2%:n:,

这利用了一个事实,即> <>在EOF上将-1推为1 mod2。它还使用除以0来终止(这显然是可以的,因为共识是忽略了STDERR输出)。

仅供参考,干净无误地退出是一个额外的字节:

i2%:n?!;

10

APL,6个字节

→⎕←⍣⍲⎕

说明:

     ⎕ Read the input, then
 ⎕←    write it out
   ⍣   repeatedly
    ⍲  until NAND of it with itself becomes true.
→      Branch to zero to avoid printing the result again.

1
第二个和最后一个字符看起来是否有所不同?因为他们不适合我。
John Dvorak

@JanDvorak不,他们是一样的。
Alex A.

1
好吧,现在我正在手机上看它,除了两个箭头外,其他东西对我来说都是一样的:-D
John Dvorak

10

Brian&Chuck,21个字节

,}<-{-?<SOH>_{+?
_>+{?<.p

在此,<SOH>应替换为相应的控制字符(0x01)。

说明

基本思想是从pChuck的末尾减去输入的字符代码(48或49),这将给出一个?(有效命令)或@一个无操作符。

,将输入字符读取到Chuck的第一个单元格中(标有_)。我们希望将此值递减到0一个循环,同时进行其他一些更改:

}<移至p-递减。然后,{移回输入单元格也将-递减。只要还不为零,?就将控制权交给查克。现在>将Brian的磁带头向右移动一个单元格(已初始化为1)并将其+递增。然后,用重置循环{?

通过对查克的第一个单元格命中的时候0,该<SOH>电池将一直递增到我们从标准输入读和角色p将是?输入1@输入0

现在?不再切换控制。的01以后它是一个空操作,由于是空字节(由表示_)。{移回Chuck的第一个单元格并+递增以确保其为正数,这样,?双手可以控制Chuck。

此时间>+在Brian的初始录像带结束后增加了单元格。该单元格是垃圾,但我们永远不会使用它。现在{,不会一直扫描到Brian磁带的前端,而只会扫描到_。因此?是空操作,因为当前单元格为零。然后<.向左移动一个(输入字符的副本)并打印。

最后,我们遇到?@。如果输入是,0并且此单元格为@空,则程序终止。但是如果输入的是1该单元格,那么?我们将移交给Brian,Brian {+?将重置Chuck上的循环,现在我们将1永远打印s(直到Brian磁带结尾的单元格中的整数不适合任何内存更多,我想...)。

奖金

Sp3000和我在这方面打了几天球。我们从大约40个字节开始,然后得出了两个完全不同的但捆绑在一起的26个字节的解决方案。只有当我开始撰写我的说明时,我才想到上面的21字节解决方案。非常感谢Sp在B&C中提出想法并互相教一些高尔夫技巧。:)

这是他的26字节解决方案:

>,----{?{>1?0
#I<?_}<.<<<?

这是我的:

,{>-<-?_0+?_1{<?
_®{?_{>.?

®值174的字节在哪里(例如,仅将文件另存为ISO 8859-1)。

在核心上,我的工作方式类似于21字节的解决方案,因为它®成为}输入1~(无操作)为输入0,但是执行起来不那么优雅。

他的解决方案非常简洁,因为源代码仅为ASCII,并且不需要循环即可处理输入。相反,----1-0,(无操作查克)。-然后,这会将?Brian磁带上的第一个更改为>,从而为1-case 创建不同的控制流。


10

按位循环标记,3位或<1个字节

按位循环标记是最简单的图灵完备语言之一。它使用两个位串,程序数据程序的位循环读取并解释如下:

  • 0:删除第一个数据位(并在有输出的实现中输出)。
  • 1x:如果第一个数据位是1,则在数据末尾附加x(代表01)。(如果第一个数据位是0,则不执行任何操作。)

程序将运行直到数据字符串为空。

真机

110

当数据字符串设置为时0

  • 11不会附加任何内容,因为第一个数据位不是1
  • 0删除/输出0
  • 数据字符串现在为空,程序停止。

当数据字符串设置为时1

  • 11附加一个1
  • 0删除/输出1
  • 数据字符串返回到单个字符串1,程序返回到它开始的位置,因此我们永远循环。

9

GNU sed,10岁

:;/1/{p;b}

说明

  • : 定义一个未命名的标签
  • /1/如果输入匹配正则表达式1,则
  • p 打印图案空间(即1)
  • b 然后跳回未命名的标签(永远)
  • 如果输入不为1(即0),则图案空间将按原样打印并结束程序。

使用:;p;/1/bn标志删除1个字符,总共9个字节。由于sed -f无论如何都用于运行脚本文件,因此添加额外的标志不需要2个字节。
seshoumara

9

严重的是4 3个字节

划掉的4仍然是4 :(

,W■

,从STDIN读取一个值。W使用body启动一个循环,当堆栈顶部的值为true时运行打印顶部堆栈元素而不会弹出。该循环在EOF处隐式关闭。

输入时0,循环将永远不会执行(因为0为false),并且程序在EOF结束,并自动弹出并打印堆栈中的每个值。上的输入1(或不是任意值0""[]),该无限循环运行。

实际上,领先的,是不需要(感谢隐含的输入),使比分到2个字节。


8

Thue,34个字节

1::=12
2::=~1
0::=~0
@::=:::
::=
@

说明:

1::=12 子字符串“ 1”的实例可以变为“ 12”

2::=~1 可以删除子字符串“ 2”的实例,并显示“ 1”

0::=~0 可以删除子字符串“ 0”的实例,并显示“ 0”

@::=::: 子字符串“ @”的实例可以替换为输入中的字符串

::= 替代规则的结束列表

@ 初始字符串为“ @”


8

Arnold C,134个字节

IT'S SHOWTIME
HEY CHRISTMAS TREE i
YOU SET US UP 0         //or 1
STICK AROUND i
TALK TO THE HAND 1
CHILL
TALK TO THE HAND 0
YOU HAVE BEEN TERMINATED

虽然这不像其他ArnoldC 答案那么有趣,但它是高尔夫球。例如,缩进是不必要的,宏@NO PROBLEMO和也是如此@I LIED

已使用此语言版本进行测试,该语言无法接受输入。


8

Cubix,5 6字节

Cubix是@ETHproductions的新型二维语言,其中的命令环绕在多维数据集的表面。在线解释器 感谢@ETHproductions的保存。

!I\@O

最终扩展到多维数据集

  !
I \ @ O
  .

这从I命令开始。输入一个整数到堆栈上。
\,将指令指针向下重定向到no op。
O,输出堆栈顶部的数值。
!@如果堆栈顶部为true ,则跳过下一个命令()。\如果为1
\,则将跳转重定向,将指令指针重定向到@退出程序。

这利用了O ? !命令未弹出堆栈的事实。


真好 我很高兴看到其他人使用我的语言:)我还有另一个6字节的解决方案,该解决方案仅使用5条指令(加上无操作),所以也许我会发布它。
ETHproductions

@ETHproductions可以肯定地发布它。我认为您这里的语言很有前途:)
MickyT

您可以通过删除?和来保存字节,只需使用!!I\@O
ETHproductions

@ETHproductions非常好
MickyT '16

1
我写了一个蛮力柜子这个(警告:冻结您的浏览器为一两分钟),与正好五个5字节的解决方案出现:@IOw!@I?Ov@!IOw!IOW@!I\@O
ETHproductions

7

Foo,6个字节

&1($i)

输入被硬编码为第二个字符,因为Foo没有STDIN输入。我们不同意Foo现在很棒吗?:)

说明

&1          Set current cell to 1
  (  )      Do-while loop (or, at least according to the interpreter)
   $i       Print current cell as int

2
我一直很喜欢Foo。
意大利面条

7

Perl,18 +1 = 19 13 +1 = 14字节

print while$_

像这样运行:

echo -n NUM | perl -p truth.pl

感谢ThisSuitIsBlackNot(在Perl打高尔夫球中比我更好的人)打了五个字节。


2
语句修饰符是您的朋友!另外,如果您确保输入没有尾随换行符,则可以删除+0echo -n 0 | perl -pe'print while$_'(13个字节+ 1用于-p)。perl -M5.010 -pe'say while$_'会更短,但是导致0和1之间的换行不一致
。– ThisSuitIsBlackNot

@ThisSuitIsBlackNot啊哈!我在$ _时尝试打印,但我不知道为什么它不起作用。我没有意识到您输入的内容中不能包含换行符。
意大利面条

0是的,字符串为false,但0+换行符为true。请参阅perldoc perlsyn
ThisSuitIsBlackNot

2
say即使您算作-E一个额外的字节,它也较短。
丹尼斯

2
@Dennis ...我刚刚意识到可以用-lperl -lpE 'say while$_'(11个字节+ 2个-lp)固定。
ThisSuitIsBlackNot

7

> <>,6个字节

::n?!;

将输入压入堆栈以开始

:        copy top element on stack
 :       copy top element on stack again
  n      pop and outputs top element
   ?     condition trampoline - pops top element, if it is zero skips next instruction
    !    trampoline skips next instruction
     ;   finish execution

1
在PPCG,我们喜欢我们的解释。+1
意大利面条

3
我敢肯定,当它应与48('0')和49('1')一起使用时,仅适用于文字0和1输入。我错了吗?
地下

@quartata如果是我,我要说的是,为了公平对待使用更传统的输入方法获得的答案,您必须将48或49放入堆栈。不过,这是您的挑战,无论如何也算不上什么大事,\\ _(ツ)_ /?
地下

2
这还有另一个问题:如果堆栈已预先填充,则必须为该-v标志添加3个字节。
El'endia Starman

1
@Aaron:对于它的价值,我也认为它是2个字节-v,然后我得到了纠正。所以你不是唯一的一个。:)
El'endia Starman 2015年
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.