กระเบื้อง 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 - Xor:
^→R = L xor T,B = L xor T
ท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในตารางสี่เหลี่ยมของตัวอักษร0 1+\U)!&|^ที่แสดงถึง "วงจร" ที่สร้างขึ้นโดยใช้แผ่นกระเบื้อง duodyadic ที่ใช้ตรรกะสิบตัว คุณต้องใช้สองสายของ0's และ1' s; หนึ่งจะเป็นคอลัมน์อินพุตด้านซ้ายและหนึ่งจะเป็นแถวอินพุตด้านบน โปรแกรม / ฟังก์ชั่นของคุณจำเป็นต้องพิมพ์ / ส่งคืนแถวเอาต์พุตด้านล่างและคอลัมน์เอาท์พุทขวา (รวมอยู่ใน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
หากคุณเขียนฟังก์ชันคุณสามารถส่งคืนสองสายใน tuple หรือรายการ (หรือยังพิมพ์ได้)
รายละเอียด
- ใช้สามอินพุตเป็นสตริงในลักษณะที่สมเหตุสมผล (โดยเฉพาะอย่างยิ่งในตารางคำสั่งแถวบนสุดคอลัมน์ซ้าย): บรรทัดคำสั่งไฟล์ข้อความ sdtin ฟังก์ชัน arg
- คุณสามารถสันนิษฐานได้ว่าความยาวของแถวและคอลัมน์ที่ป้อนเข้านั้นจะตรงกับขนาดของกริดและจะประกอบด้วย
0's และ1' s เท่านั้น - กริดของคุณต้องใช้อักขระที่เหมาะสม (
0 1+\U)!&|^) จำไว้0และหมายถึงสิ่งเดียวกัน
กรณีทดสอบ
(อ่าน I / O เป็นtop/ left→ bottom/ right.)
Nand:
&!
00/ 0→ 01/ 1
00/ 1→ 01/ 1
10/ 0→ 01/ 1
10/ 1→ 11/0
ทุกคน:
1111
1\+\
1+\+
1\+\
ป้อนข้อมูลใด ๆ จะส่งผล/11111111
Xor จาก 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
นี่คือ pastebin ของกล่องทดสอบกริด 1 × 1 ทั้งหมด
เกณฑ์การให้คะแนน
การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ
โบนัส: คุณสามารถสร้าง "วงจร" ที่ยอดเยี่ยมได้อย่างไร
ป.ล. อย่าไปรบกวน "กระเบื้องดูโอเดียด" ของ Googling ฉันสร้างมันขึ้นมาเมื่อวานนี้ D
หากคุณต้องการพูดคุยเกี่ยวกับการขยายความคิดนี้เป็นภาษาโปรแกรมเต็มรูปแบบมาที่ห้องแชทนี้