Duodyadicタイルは、2つの入力(1つは上面から、もう1つは左側から)、2つの出力(1つは右側に、もう1つは下面)を備えた正方形の機能ブロックです。それぞれの出力は、両方の入力の個別の関数です。
たとえば、#
一般的なタイルを表し、右の出力がR
機能でf
入力のT
とL
、下の出力はB
別の関数であるg
のT
とL
:
T
L#R R = f(T, L)
B B = g(T, L)
(2つの関数があるため、タイルは「duo」と呼ばれ、両方の関数には2つの引数があるため「dyadic」と呼ばれます。)
タイルは、グリッド上で一緒に構成することができ、1つのタイルの出力は、隣接するタイルの入力に直接入ります。ここで、例えば、左の右の出力は右#
の左の入力に入ります#
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
それぞれが特定の機能を備えたデュオディアックタイルのセットがあれば、複雑な(潜在的に有用な)コンポジションを作成できると想像できます。
この課題では、すべての入力と出力が1ビットのバイナリ数(ゼロまたは1)である、10個のロジックベースのデュオディアディックタイルの従来のセットのみを考慮します。タイルの各タイプを示すために、個別のASCII文字を使用します。
タイル文字とそれらの入出力関係は次のとおりです
(T
上入力L
用、左入力R
用、右出力B
用、下出力用)。
- ゼロ:
0
または(スペース)→
R = 0
、B = 0
- 1つ:
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
- Xor:
^
→R = L xor T
、B = L xor T
チャレンジ
0 1+\U)!&|^
10個のロジックベースのデュオディアディックタイルを使用して作成された「回路」を表す文字の長方形グリッドを取り込むプログラムまたは関数を記述します。あなたはまた、の二つの文字列に取る必要がある0
のと1
の。1つは左側の入力列で、もう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
関数を作成した場合、タプルまたはリストで2つの文字列を返す(または印刷する)ことができます。
詳細
- 3つの入力を合理的な方法で文字列として(できればグリッド、一番上の行、左列の順に)、コマンドライン、テキストファイル、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
ます。
Xor from Nand:(末尾のスペースの列に注意してください)
\)+\
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グーグルの「デュオディアディックタイル」を気にしないでください。昨日それらを作りました; D
このアイデアを本格的なプログラミング言語に拡張することについて議論したい場合は、このチャットルームに来てください。