以8种方式读取代码以输出8个数字


21

英语和大多数编程语言都是从左到右,从上到下编写和读取的,但并非必须如此

实际上对于文本块

ABC
DEF

我可以想到八种相关的阅读方式:

  1. 从左到右,从上到下(LTR-TTB): ABCDEF
  2. 从上到下,从左到右(TTB-LTR): ADBECF
  3. 从左到右,从下到上(LTR-BTT): DEFABC
  4. 从下到上,从左到右(BTT-LTR): DAEBFC
  5. 从右到左,从上到下(RTL-TTB): CBAFED
  6. 从上到下,从右到左(TTB-RTL): CFBEAD
  7. 从右到左,从下到上(RTL-BTT): FEDCBA
  8. 从下到上,从右到左(BTT-RTL): FCEBDA

挑战

编写一个矩形的文本块,以您选择的语言将其作为八个单行程序以上述八种方式读取。这些程序中的每一个都应输出一个从1到8的不同整数。

哪个读取方向输出哪个数字都没有关系,它们不必与上面的数字匹配。例如,如果您的文本块仍然

ABC
DEF

然后该程序ABCDEF可能输出5FEDCBA力量输出2,而其他六个方案将输出13467,和8一些秩序。

文本块可以包含除行终止符之外的任何字符。

如果您的语言没有正确的标准输出,则输出应转到标准输出或类似的替代方法。没有输入。您可能会假定程序在REPL环境中运行。

Pietu1998慈善地编写了一个JSFiddle,当给出一段文本时,它给出了8种不同的单行程序。我已经将其放入堆栈片段中:

<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+"   "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/>&nbsp;<label for="b">Show directions</label><br/><pre id="a"></pre>

您仍然可以在这里找到Martin的 CJam版本

计分

分数是文本块的面积(宽度乘以高度)。得分最低的提交者获胜。(从本质上讲,最小的代码获胜,因此赢得了标签。)Tiebreaker转到了较早发布的提交。

这个例子是2 x 3,所以它的分数是6。分数小于4(2 x 2)是不可能的,因为那样8个程序中的一些将是相同的,并且不能输出两个不同的值。


6
为什么使用“仅可打印的ASCII”规则?这意味着APL无法应对这一挑战。:(
莫里斯·祖卡

3
我做了一个小提琴,将一个代码块转换为8个程序。可以作为摘要包含,但是要OP对此发表意见。
PurkkaKoodari 2015年

3
@MartinBüttner好吧,我修复了它。看来String.prototype.repeat()还是有点新。还确认现在可以在IE中工作。新提琴
PurkkaKoodari 2015年

@MorisZucca现在允许除行终止符之外的所有字符。
加尔文的业余爱好

@ Pietu1998感谢小提琴,我已将其添加为摘要。
加尔文的业余爱好

Answers:


21

J,3 * 3 = 9

1[2
+2+
2+2

执行所有方向:

       ". '1[2+2+2+2','2+2+2+1[2','1+2[2+2+2','2+2[2+1+2','2+2+2+2[1','2[1+2+2+2','2+2+2[2+1',:'2+1+2[2+2'
1 7 3 4 8 2 6 5

说明:

  • 在J中,执行从右到左,并且没有运算符优先级。
  • [left)采用它的两个操作数的左侧,所以它基本上是取消我们的表达如整个右侧1+2[2+2+2变得1+2[6然后1+2
  • 左边的表达式是总共有1、2、3和4个操作数的加法。每个n-operand表达式都有两个,一个带有数字1,另一个带有2s。与的加法1生成奇数,而其他的则生成偶数。

5
真的很好 替换[;,它应该可以在大多数语言的REPL环境中使用。
Optimizer

18

Befunge-985x5 = 25 5x3 = 15

1+4+2
$.@.$
3+4+4

我写了一个小脚本,为我找到了正确的数字。花了一段时间,但是,嘿,我刚刚击败了GolfScript!:D

我在这里这里使用过的脚本,但是我不建议您查看它们,因为代码风格极易致癌。

子程序

1+4+2$.@.$3+4+4   LTR-TTB   5
3+4+4$.@.$1+4+2   LTR-BTT   7
1$3+.+4@4+.+2$4   TTB-LTR   3
2$4+.+4@4+.+1$3   TTB-RTL   4
4+4+3$.@.$2+4+1   RTL-BTT   8
2+4+1$.@.$4+4+3   RTL-TTB   6
4$2+.+4@4+.+3$1   BTT-RTL   2
3$1+.+4@4+.+4$2   BTT-LTR   1

旧版

 1.6
3 @ 4
.@ @.
8 @ 7
 2.5

子程序

分别输出数字1-8。

 1.6 3 @ 4.@ @.8 @ 7 2.5    LTR-TTB
 2.5 8 @ 7.@ @.3 @ 4 1.6    LTR-BTT
 3.8 1 @ 2.@ @.6 @ 5 4.7    TTB-LTR
 4.7 6 @ 5.@ @.1 @ 2 3.8    TTB-RTL
 5.2 7 @ 8.@ @.4 @ 3 6.1    RTL-BTT
 6.1 4 @ 3.@ @.7 @ 8 5.2    RTL-TTB
 7.4 5 @ 6.@ @.2 @ 1 8.3    BTT-RTL
 8.3 2 @ 1.@ @.5 @ 6 7.4    BTT-LTR

14

Brainfuck $,4x3 = 12

Brainfuck $与Brainfuck非常相似,但是还有更多命令,包括将当前单元格值输出为数字输出的命令,对于此挑战非常有用。

++:+
  ++
++++

单行命令:

++:+  ++++++   LTR-TTB, outputs 2
++++  ++++:+   LTR-BTT, outputs 8
+ ++ +:+++++   TTB-LTR, outputs 4
+++:+++ ++ +   TTB-RTL, outputs 3
++++++  +:++   RTL-BTT, outputs 7
+:++++  ++++   RTL-TTB, outputs 1
+++++:+ ++ +   BTT-RTL, outputs 5
+ ++ +++:+++   BTT-LTR, outputs 6

我认为你不需要Brainfuck $;命令。我会考虑简单地使用。并输出0x01-0x08完全有效。是Brainfuck,看在脑袋上。+1。
matega 2015年

我可以使用二进制输出。
captncraig 2015年

7

TECO,3 * 5 = 15

 +4 5
+2=4 
 +1 \

=打印最后一个数值表达式的值。\用于读取或写入字符串中的数字,但此处仅将其用作丢弃物。

  • +4 5+2=4 +1 \ 7
  • + +2+4=1 4 5 \ 6
  • + +2+1=4 4 \ 5 3
  • +1 \+2=4 +4 5 2
  • \ 1+ 4=2+5 4+ 5
  • \ 5 4 1=4+2+ + 1个
  • 5 \ 4 4=1+2+ + 4
  • 5 4+ 4=2+\ 1+ 8

7

piet-12x12 = 144

在此处输入图片说明

由于单行程序永远无法终止,因此请假定它在第一次输出后终止。

单个映像中有8个子程序:

在此处输入图片说明


6

GolfScript,4x4 = 16

1})7
)  }
}  )
3)}5

利用了很好的旧“超级注释”:一个不匹配的注释将}忽略其余代码(实际上,在这种情况下#,由于所有代码都在一行中运行,因此普通注释也将起作用)。因此,从每个角落开始只有一个数字,或者(在另一个方向上)该数字增加了1,因为执行终止并且堆栈内容被打印出来。这8个程序是

1})7)  }}  )3)}5  # LTR-TTB
1)}3}  ))  }7})5  # TTB-LTR
3})1)  }}  )5)}7  # BTT-LTR
3)}5}  ))  }1})7  # LTR-BTT
5})3)  }}  )7)}1  # RTL-BTT
5)}7}  ))  }3})1  # BTT-RTL
7})5)  }}  )1)}3  # TTB-RTL
7)}1}  ))  }5})3  # RTL-BTT

5

Haskell,26x26 = 676

使用注释(--)隐藏向后和向侧面的位。这太长了

main=print 1--2 tnirp=niam
a                        a
i                        i
n                        n
=                        =
p                        p
r                        r
i                        i
n                        n
t                        t

3                        4
-                        -
-                        -
5                        6

t                        t
n                        n
i                        i
r                        r
p                        p
=                        =
n                        n
i                        i
a                        a
main=print 7--8 tnirp=niam

2
在我看来,这可以扩展为带有内联注释的大多数语言
Sp3000

4

前奏曲,5x3 = 15

12 34
  !  
56 78

假定使用Python解释器,该解释器将值打印为数字而不是字符代码。

这没有击败Befunge $,但是击败了我的GolfScript提交,我喜欢它的简单性。还要注意,它仅使用9个非空格字符,比到目前为止的任何其他提交都少(J再次打击:))。在Prelude中,每个数字都被单独压入堆栈,并且根据路径,在之前有一个不同的数字!,它只是打印顶部的堆栈元素。这8个程序是:

12 34  !  56 78   LTR-TTB   4
56 78  !  12 34   LTR-BTT   8
1 52 6 ! 3 74 8   TTB-LTR   6
4 83 7 ! 2 61 5   TTB-RTL   7
87 65  !  43 21   RTL-BTT   5
43 21  !  87 65   RTL-TTB   1
8 47 3 ! 6 25 1   BTT-RTL   3
5 16 2 ! 7 38 4   BTT-LTR   2

另外,还有

 1 3 
1+!+1
 5 7 

这会将奇数推入垂直路径,并1在水平路径上将它们递增:

 1 3 1+!+1 5 7    LTR-TTB   4
 5 7 1+!+1 1 3    LTR-BTT   8
 1 1+5 ! 3+7 1    TTB-LTR   5
 1 3+7 ! 1+5 1    TTB-RTL   7
 7 5 1+!+1 3 1    RTL-BTT   6
 3 1 1+!+1 7 5    RTL-TTB   2
 1 7+3 ! 5+1 1    BTT-RTL   3
 1 5+1 ! 7+3 1    BTT-LTR   1

2

果酱-7×7

效果不佳,但是没有CJam的答案,我喜欢它的外观:)

 8;];1 
7     2
;  0  ;
] 0 0 ]
;  0  ;
6     3
 5;];4 

它主要使用];清除堆栈的事实。

在线尝试


1

红宝石-7x7

也没有令人印象深刻,与Haskell回答相同的策略。

p 1#2 p

3     7
#     #
4     8

p 5#6 p

1

R,9x9

没有空格,没有评论。

75%%99299
99%%99699
%%299%%41
%%699%%06
995999997
11%%999%%
99%%799%%
39719%%99
59519%%16

我想这可以扩展到您想要的任何大小。我认为模运算符是可用运算符中最灵活的,因为它可以防止数值过大而与数据大小无关,并且两者之间的数值过大也没有影响。

75%%9929999%%99699%%299%%41%%699%%0699599999711%%999%%99%%799%%39719%%9959519%%16   LTR-TTB  2
59519%%1639719%%9999%%799%%11%%999%%995999997%%699%%06%%299%%4199%%9969975%%99299   LTR-BTT  3
79%%9193559%%91999%%265%%75%%999%%1199999979999%%999%%26%%999%%99409%%9199167%%96   TTB-LTR  4
99167%%9699409%%9126%%999%%99%%999%%999999799%%999%%11%%265%%7559%%9199979%%91935   TTB-RTL  1
61%%9159599%%91793%%997%%99%%999%%1179999959960%%996%%14%%992%%99699%%9999299%%57   RTL-BTT  5
99299%%5799699%%9914%%992%%60%%996%%799999599%%999%%11%%997%%9999%%9179361%%91595   RTL-TTB  6
69%%7619919%%90499%%999%%62%%999%%9999799999911%%999%%57%%562%%99919%%9553919%%97   BTT-RTL  7
53919%%9799919%%9557%%562%%11%%999%%997999999%%999%%99%%999%%6219%%9049969%%76199   BTT-LTR  8

1

这种编程语言,5 * 9 = 45

1i;i2
2   2
+   +
i   i
;   ;
i   i
+   +
2   2
5i;i6

转换为:

1i;i22   2+   +i   i;   ;i   i+   +2   25i;i6
5i;i62   2+   +i   i;   ;i   i+   +2   21i;i2
12+i;i+25i       i;       ;i       i22+i;i+26
22+i;i+26i       i;       ;i       i12+i;i+25
6i;i52   2+   +i   i;   ;i   i+   +2   22i;i1
2i;i12   2+   +i   i;   ;i   i+   +2   26i;i5
62+i;i+22i       i;       ;i       i52+i;i+21
52+i;i+21i       i;       ;i       i62+i;i+22

由于;终止程序,因此上面的内容翻译为:

1i;   - outputs 1
5i;   - outputs 5
12+i; - outputs 3
22+i; - outputs 4
6i;   - outputs 6
2i;   - outputs 2
62+i; - outputs 8
52+i; - outputs 7

说明:0到的任何数字9会将相应的数字压入堆栈。+弹出顶部的两个值xy离开堆栈,x + y然后压入堆栈。i将堆栈输出为整数。

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.