Gạch duodyadic là các loại khối chức năng vuông có hai đầu vào, một từ phía trên và một từ bên trái của chúng và có hai đầu ra, một ở phía bên phải và một ở phía dưới. Mỗi đầu ra của chúng là một chức năng riêng biệt của cả hai đầu vào của chúng.
Ví dụ: nếu #
đại diện cho một ô chung, đầu ra bên phải R
là một hàm f
của các đầu vào T
và L
, và đầu ra dưới cùng B
là một hàm khác g
của T
và L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Các ô được gọi là "bộ đôi" vì có hai hàm và "dyadic" vì cả hai hàm có hai đối số .)
Các lát sau đó có thể được ghép lại với nhau trên một lưới, các đầu ra của một ô sẽ đi trực tiếp vào các đầu vào của các ô mà nó lân cận. Ví dụ ở đây, đầu ra bên phải của bên trái #
đi vào đầu vào bên trái của bên phải #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Bạn có thể tưởng tượng rằng được cung cấp một bộ gạch duodyadic, mỗi loại có chức năng cụ thể, các tác phẩm phức tạp (và có khả năng hữu ích) có thể được thực hiện.
Trong thử thách này, chúng ta sẽ chỉ quan tâm đến tập hợp mười ô ghép dựa trên logic truyền thống , trong đó tất cả các đầu vào và đầu ra là các số nhị phân một bit (số không hoặc số một). Chúng tôi sẽ sử dụng một ký tự ASCII riêng để biểu thị từng loại hình xếp.
Các ký tự gạch và quan hệ đầu vào-đầu ra của chúng như sau:
( T
dành cho đầu vào trên, L
cho đầu vào bên trái, R
cho đầu ra bên phải, B
cho đầu ra dưới cùng.)
- Không:
0
hoặc(không gian) →
R = 0
,B = 0
- Một:
1
→R = 1
,B = 1
- Chữ thập:
+
→R = L
,B = T
- Gương:
\
→R = T
,B = L
- Chỉ trên cùng:
U
→R = T
,B = T
- Chỉ còn lại:
)
→R = L
,B = L
- Không phải:
!
→R = not L
,B = not T
- Và:
&
→R = L and T
,B = L and T
- Hoặc:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Thử thách
Viết chương trình hoặc hàm lấy trong một lưới hình chữ nhật gồm các ký tự 0 1+\U)!&|^
đại diện cho một "mạch" được tạo bằng cách sử dụng mười ô xếp hình dựa trên logic. Bạn cũng cần phải có hai chuỗi 0
's và 1
'; một sẽ là cột đầu vào bên trái và một sẽ là hàng đầu vào hàng đầu. Chương trình / chức năng của bạn cần in / trả về hàng đầu ra dưới cùng và cột đầu ra bên phải (cũng trong 0
's và 1
').
Ví dụ, trong lưới này
+++
+++
tất cả các đầu vào chảy thẳng qua lưới đến đầu ra
ABC
D+++D
E+++E
ABC
vì vậy, một đầu vào của 010
/ 01
would have output 010
/ 01
:
010
0+++0
1+++1
010
Đầu ra chính xác của chương trình của bạn sẽ là [bottom output row]\n[right output column]
hoặc [bottom output row]/[right output column]
:
010
01
hoặc là
010/01
Nếu bạn đã viết một hàm, bạn có thể trả về hai chuỗi trong một tuple hoặc danh sách (hoặc vẫn in chúng).
Chi tiết
- Lấy ba đầu vào dưới dạng chuỗi theo bất kỳ cách hợp lý nào (tốt nhất là trong lưới thứ tự, hàng trên cùng, cột bên trái): dòng lệnh, tệp văn bản, sdtin, hàm arg.
- Bạn có thể giả sử chiều dài hàng và cột đầu vào sẽ khớp với kích thước lưới và sẽ chỉ chứa
0
's và1
'. - Lưới của bạn phải sử dụng các ký tự thích hợp (
0 1+\U)!&|^
). Hãy nhớ điều đó0
vàcó nghĩa là điều tương tự.
Các trường hợp thử nghiệm
(Đọc I / O là top
/ left
→ bottom
/right
.)
Không
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
Tất cả những người:
1111
1\+\
1+\+
1\+\
Bất kỳ đầu vào sẽ dẫn đến 1111
/ 1111
.
Xor từ Nand: (lưu ý cột dấu cách)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Zig zag:
+++\00000000
000\!!!!\000
00000000\+++
Bit đầu tiên của đầu vào bên trái trở thành bit cuối cùng của đầu ra bên phải. Mọi thứ khác là0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Lan truyền:
)))
UUU
U+U
U+U
UUU
Bit đầu tiên của đầu vào bên trái đi đến tất cả các đầu ra.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
Đây là một pastebin của tất cả các trường hợp kiểm tra lưới 1 × 1.
Chấm điểm
Đệ trình ngắn nhất tính bằng byte thắng.
Tiền thưởng: Bạn có thể tạo ra những "mạch" thú vị nào?
PS Đừng bận tâm về "gạch duodyadic" của Google. Tôi đã thực hiện chúng ngày hôm qua; D
Nếu bạn muốn thảo luận mở rộng ý tưởng này thành ngôn ngữ lập trình chính thức, hãy đến với phòng chat này .