กระเบื้อง 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\+\
ป้อนข้อมูลใด ๆ จะส่งผล/1111
1111
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
หากคุณต้องการพูดคุยเกี่ยวกับการขยายความคิดนี้เป็นภาษาโปรแกรมเต็มรูปแบบมาที่ห้องแชทนี้