Duodyadic磁贴是正方形功能块的一种,具有两个输入,一个从顶部输入,一个从左侧输入,并具有两个输出,一个在右侧,一个在底部。它们的每个输出都是其两个输入的单独功能。
例如,如果#
表示一个通用的瓦片,右输出R
是函数f
的输入T
和L
,底部输出B
是另一个函数g
的T
和L
:
T
L#R R = f(T, L)
B B = g(T, L)
(由于有两个函数,所以这些图块被称为“ duo”,而由于两个函数都有两个参数,它们被称为“ dyadic” 。)
然后,可以在网格上将图块组合在一起,一个图块的输出直接进入与其相邻的图块的输入。例如,在这里,左侧的右侧输出#
进入右侧的左侧输入#
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
您可以想象,如果给定一组Duodyadic磁贴,每个磁贴都具有特定的功能,则可以制作复杂(且可能有用)的合成。
在这个挑战中,我们将只关注传统的十组基于逻辑的双性平铺,其中所有输入和输出都是单位二进制数(零或一)。我们将使用单独的ASCII字符来表示每种类型的图块。
是瓷砖字符和它们的输入-输出关系,如下所示:
(T
为顶部输入,L
为左输入,R
用于右输出,B
为底部输出。)
- 零:
0
或(空格)→
R = 0
,B = 0
- 一:
1
→R = 1
,B = 1
- 交叉:
+
→R = L
,B = T
- 镜子:
\
→R = T
,B = L
- 仅顶部:
U
→R = T
,B = T
- 仅左:
)
→R = L
,B = L
- 不是:
!
→R = not L
,B = not T
- 并且:
&
→R = L and T
,B = L and T
- 或者:
|
→R = L or T
,B = L or T
- 异或:
^
→R = L xor T
,B = L xor T
挑战
编写一个程序或函数,该程序或函数采用一个矩形字符网格,这些矩形网格0 1+\U)!&|^
代表使用十个基于逻辑的双体平铺瓷砖制作的“电路”。您还需要输入两个字符串0
的和1
。一个将是左侧输入列,一个将是顶部输入行。您的程序/功能需要打印/返回底部的输出行和右侧的输出列(也在0
s和1
s中)。
例如,在此网格中
+++
+++
所有输入直接跨网格流向输出
ABC
D+++D
E+++E
ABC
因此,010
/ 的输入01
将输出010
/ 01
:
010
0+++0
1+++1
010
程序的确切输出为[bottom output row]\n[right output column]
或[bottom output row]/[right output column]
:
010
01
要么
010/01
如果编写了函数,则可以在一个元组或列表中返回两个字符串(或仍然打印它们)。
细节
- 以任何合理的方式(最好在顺序网格,顶行,左列)将三个输入作为字符串:命令行,文本文件,sdtin,函数arg。
- 您可以假设输入的行和列的长度与网格尺寸匹配,并且仅包含
0
“和1
”。 - 您的网格必须使用正确的字符(
0 1+\U)!&|^
)。记住这一点0
,意思是一样的。
测试用例
(将I / O读为top
/ left
→ bottom
/ right
。)
南德:
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
全部:
1111
1\+\
1+\+
1\+\
任何输入都应以1111
/表示1111
。
来自Nand的Xor :(请注意尾随空格的列)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
之字形:
+++\00000000
000\!!!!\000
00000000\+++
左输入的第一位变为右输出的最后一位。其他一切都是0
。
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
传播:
)))
UUU
U+U
U+U
UUU
左输入的第一位进入所有输出。
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
计分
以字节为单位的最短提交获胜。
奖励:您可以制造出什么酷的“回路”?
PS不要打扰谷歌搜索“ duodyadic瓷砖”。我是昨天做的; D
如果您想讨论将这种想法扩展为成熟的编程语言,请进入此聊天室。