Ubin duodadik adalah jenis blok fungsi persegi yang mengambil dua input, satu dari sisi atas dan satu dari sisi kiri, dan memiliki dua output, satu di sisi kanan dan satu di sisi bawah. Setiap output mereka adalah fungsi terpisah dari kedua input mereka.
Misalnya, jika #
mewakili ubin generik, output yang tepat R
adalah fungsi f
input T
dan L
, dan output bawah B
adalah fungsi lain g
dari T
dan L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Ubin disebut "duo" karena ada dua fungsi, dan "diad" karena kedua fungsi memiliki dua argumen .)
Ubin kemudian dapat dikomposisikan bersama pada sebuah grid, output dari satu ubin langsung ke input ubin tetangga. Di sini misalnya, output kanan dari kiri #
masuk ke input kiri kanan #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Anda dapat membayangkan bahwa diberikan satu set ubin duodadik, masing-masing dengan fungsi spesifik, komposisi kompleks (dan berpotensi bermanfaat) dapat dibuat.
Dalam tantangan ini, kita hanya akan memusatkan perhatian pada perangkat tradisional dari sepuluh petak duodyadic berbasis logika , di mana semua input dan output adalah bilangan biner bit-tunggal (nol atau yang). Kami akan menggunakan karakter ASCII terpisah untuk menunjukkan setiap jenis ubin.
Karakter ubin dan hubungan input-outputnya adalah sebagai berikut:
( T
untuk input atas, L
untuk input kiri, R
untuk output kanan, B
untuk output bawah.)
- Nol:
0
atau(spasi) →
R = 0
,B = 0
- Satu:
1
→R = 1
,B = 1
- Salib:
+
→R = L
,B = T
- Cermin:
\
→R = T
,B = L
- Hanya di atas:
U
→R = T
,B = T
- Hanya yang tersisa:
)
→R = L
,B = L
- Tidak:
!
→R = not L
,B = not T
- Dan:
&
→R = L and T
,B = L and T
- Atau:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Tantangan
Tulis sebuah program atau fungsi yang mengambil dalam kotak persegi panjang dari karakter 0 1+\U)!&|^
yang mewakili "sirkuit" yang dibuat menggunakan sepuluh ubin duodyadic berbasis logika. Anda juga perlu mengambil dua string 0
'dan 1
'; satu akan menjadi kolom input kiri dan satu akan menjadi baris input atas. Program / fungsi Anda perlu mencetak / mengembalikan baris output bawah dan kolom output kanan (juga di 0
's dan 1
' s).
Misalnya, di kotak ini
+++
+++
semua input mengalir lurus melintasi grid ke output
ABC
D+++D
E+++E
ABC
jadi input dari 010
/ 01
akan memiliki output 010
/ 01
:
010
0+++0
1+++1
010
Keluaran pasti dari program Anda adalah [bottom output row]\n[right output column]
atau [bottom output row]/[right output column]
:
010
01
atau
010/01
Jika Anda menulis suatu fungsi, Anda dapat mengembalikan dua string dalam sebuah tuple atau daftar (atau masih mencetaknya).
Detail
- Ambil tiga input sebagai string dengan cara yang masuk akal (lebih disukai di kisi pesanan, baris atas, kolom kiri): baris perintah, file teks, sdtin, function arg.
- Anda dapat mengasumsikan panjang baris dan kolom input akan cocok dengan dimensi kisi dan hanya akan berisi
0
'dan1
'. - Kisi Anda harus menggunakan karakter yang tepat (
0 1+\U)!&|^
). Ingat itu0
danmaksudkan hal yang sama.
Uji Kasus
(Baca I / O sebagai top
/ left
→ bottom
/ right
.)
Nand:
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
Semua yang:
1111
1\+\
1+\+
1\+\
Setiap input harus menghasilkan 1111
/ 1111
.
Xor dari Nand: (perhatikan kolom spasi tambahan)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Zig zag:
+++\00000000
000\!!!!\000
00000000\+++
Bit pertama dari input kiri menjadi bit terakhir dari output kanan. Yang lainnya adalah 0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Perambatan:
)))
UUU
U+U
U+U
UUU
Bit pertama dari input kiri menuju ke semua output.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
Berikut adalah pastebin dari semua kotak uji 1 × 1.
Mencetak gol
Pengajuan terpendek dalam byte menang.
Bonus: "sirkuit" keren apa yang bisa Anda buat?
PS Jangan ganggu Googling "ubin duodyadic". Saya mengarangnya kemarin; D
Jika Anda ingin mendiskusikan perluasan ide ini menjadi bahasa pemrograman yang lengkap, datanglah ke ruang obrolan ini .