Duodyadik fayanslar , biri üst taraftan diğeri sol taraftan olmak üzere iki girişi alan ve biri sağ tarafta diğeri de alt tarafta olmak üzere iki çıkışa sahip kare fonksiyon bloklarıdır . Çıkışlarının her biri girişlerinin her ikisinin de ayrı bir işlevidir.
Örneğin, #
genel bir karo temsil sağ çıktı R
bir fonksiyondur f
girdilerin T
ve L
ve alt çıkış B
başka işlevidir g
arasında T
ve L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Her iki fonksiyonun da iki argümanı olduğundan, iki fonksiyon olduğundan çini "ikili" olarak adlandırılır .)
Fayanslar daha sonra bir ızgarada bir araya getirilebilir, bir karonun çıktıları doğrudan komşu karoların girdilerine girer. Örneğin, solun sağ çıktısı sağın #
sol girişine gider #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Her biri belirli işlevselliğe sahip, karmaşık (ve potansiyel olarak faydalı) kompozisyonlar yapılabilecek bir duodyadik fayans seti verildiğini hayal edebilirsiniz.
Bu mücadelede, yalnızca tüm girdi ve çıktıların tek bitli ikili sayılar (sıfırlar veya sıfırlar) olduğu geleneksel on mantık tabanlı duodyadik karo kümesiyle ilgileneceğiz. Her bir döşeme türünü belirtmek için ayrı bir ASCII karakteri kullanacağız.
Döşeme karakterleri ve giriş-çıkış ilişkileri aşağıdaki gibidir:
( T
üst giriş, L
sol giriş, R
sağ çıkış, B
alt çıkış için.)
- Sıfır:
0
veya(boşluk) →
R = 0
,B = 0
- Bir:
1
→R = 1
,B = 1
- Çapraz:
+
→R = L
,B = T
- Ayna:
\
→R = T
,B = L
- Sadece üst:
U
→R = T
,B = T
- Yalnızca sol:
)
→R = L
,B = L
- Değil:
!
→R = not L
,B = not T
- Ve:
&
→R = L and T
,B = L and T
- Veya:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Meydan okuma
0 1+\U)!&|^
On mantık tabanlı duodyadik fayans kullanılarak yapılan bir "devreyi" temsil eden karakterlerin dikdörtgen bir ızgarasına giren bir program veya fonksiyon yazın . Ayrıca iki 0
s dizesini de almanız gerekir 1
; Biri sol giriş sütunu, diğeri üst giriş satırı olacaktır. Programınızın / işlevinizin alt çıktı satırını ve sağ çıktı sütununu (aynı zamanda 0
's ve 1
s) yazdırması / döndürmesi gerekir .
Örneğin, bu ızgarada
+++
+++
tüm girişler ızgara boyunca doğrudan çıkışlara akar
ABC
D+++D
E+++E
ABC
bir giriş, böylece 010
/ ' 01
çıkışına sahip olacaktır 010
/ 01
:
010
0+++0
1+++1
010
Programın kesin çıkış olurdu [bottom output row]\n[right output column]
ya [bottom output row]/[right output column]
:
010
01
veya
010/01
Bir işlev yazdıysanız, iki dizeyi bir dizgede veya listede geri döndürebilirsiniz (veya yine de bunları yazdırabilirsiniz).
ayrıntılar
- Üç girdiyi herhangi bir makul şekilde dizge olarak alın (tercihen sıralı sırayla, üst sıra, sol sütun): komut satırı, metin dosyası, sdtin, function arg.
- Giriş satırının ve sütun uzunluklarının ızgara boyutlarıyla eşleşeceğini ve yalnızca
0
's ve1
' ler içereceğini varsayabilirsiniz . - Kılavuzunuz uygun karakterleri (
0 1+\U)!&|^
) kullanmalıdır. Bunu hatırla0
veaynı şeyi kastet.
Test Kılıfları
(G / Ç'yi top
/ left
→ bottom
/ olarak okuyun right
)
NAND:
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
Hepsi:
1111
1\+\
1+\+
1\+\
Herhangi bir giriş 1111
/ ile sonuçlanmalıdır 1111
.
Nand'dan Xor: (sondaki boşlukların sütununa dikkat edin)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Zig zag:
+++\00000000
000\!!!!\000
00000000\+++
Sol girişin ilk biti sağ çıktının son biti olur. Diğer her şey 0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Yayılma:
)))
UUU
U+U
U+U
UUU
Sol girişin ilk biti tüm çıkışlara gider.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
İşte 1 × 1 grid test durumlarının pastebin.
puanlama
Bayt cinsinden en kısa gönderme kazanır.
Bonus: Hangi serin "devreleri" yapabilirsiniz?
PS Googling "duodyadic fayans" rahatsız etmeyin. Onları dün uydurdum; D
Bu fikri tam teşekküllü bir programlama diline genişletmeyi tartışmak istiyorsanız, bu sohbet odasına gelin .