การงอแบบโค้งงอ


9

การเป็นโปรแกรมเมอร์การดูพวกเราดิ้นรนไม่น่าสนใจมาก วันนี้เราเปลี่ยนสิ่งนั้น! ในการท้าทายนี้คุณจะมีส่วนร่วมและยืดหยุ่น hexaflexagons

เกี่ยวกับ

สำหรับวิดีโอแนะนำดูวิดีโอวิหารบน flexagons

รูปทรงโค้งงอเป็นรูปทรงที่คุณสามารถโค้งงอเพื่อเผยให้เห็นใบหน้าอื่นนอกเหนือจากด้านบนและด้านล่าง เราสร้าง hexahexaflexagon ซึ่งมี 6 หน้า ดูภาพด้านล่างเกี่ยวกับวิธีพับ hexahexaflexagon จากแถบกระดาษ

ก่อสร้าง hexahexaflexagon

Aแสดงให้เห็นถึงทั้งสองด้านของแถบ สามเหลี่ยมสีขาวสองอันติดกัน นี่คือวิธีที่คุณจะดิ้น:

การงอ flexagon

ด้านล่างนี้เป็นแผนผังของรัฐที่เป็นไปได้และความสัมพันธ์:

ไดอะแกรม v6

วงกลมสีแสดงถึงสามเหลี่ยม 6 รูปด้วยหมายเลขเดียวกันจากภาพแรก เส้นแบ่งแต่ละอันมีสองสี - ด้านล่างส่วนใหญ่แสดงถึงด้านหลัง (สิ่งที่คุณจะเห็นว่าคุณจะพลิกงอของคุณไปรอบ ๆ ) ซึ่งคุณไม่ต้องพิจารณาในความท้าทายนี้

วงกลมสีเทาในพื้นหลังแทนวิธีที่คุณสามารถดิ้น flexagon คุณอยู่ในสถานะใดก็ตาม: มี 4 วิธีที่แตกต่างกันจะดิ้นมันที่เราเรียกเหล่านี้Left, Right, และUp Downคุณไม่ได้งอตามทิศทางเหล่านี้จริง ๆ บิตที่สำคัญคือบางอันอยู่ตรงข้ามกัน
หากคุณอยู่ในศูนย์กลางคุณสามารถใช้LeftและRightไปยังศูนย์อื่น ๆ จะได้รับจากศูนย์ที่คุณใช้และUp Downหากคุณไม่ได้อยู่ตรงกลางคุณจะไม่สามารถใช้งานได้LeftRightหรือ

Left/Down = clockwise
Right/Up  = anti-clockwise

ท้าทาย

สร้างฟังก์ชั่นหรือโปรแกรมที่ใช้เป็นอินพุตสิ่งที่ควรจะอยู่บนใบหน้าด้านหน้า 18 หน้าและใบหน้าด้านหลัง 18 รูปของเฟล็กกอนลำดับของซ้ายขวาขวาขึ้นและลงและกลับมามองเห็นใบหน้าทั้ง 8 หลังจากที่โค้งงอ

การคำนวณตัวอย่างที่ซับซ้อน:

flex "hexaflexaperplexia" 
     "flexagationdevices" 
     [Right, Right, Left]

Divide a strip of paper into 18 triangles:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3   Front
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6   Back

Write "hexaflexaperplexia" on the front of the paper strip:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3

hexaflexaperplexia
123123123123123123
h  a  e  p  p  x     Face 1, Initially the front face
 e  f  x  e  l  i    Face 2, Initially the back face
  x  l  a  r  e  a   Face 3, Initially hidden


Write "flexagationdevices" on the back of the paperstrip:
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6

flexagationdevices
445566445566445566
fl    at    ev       Face 4, up from 3
  ex    io    ic     Face 5, up from 2
    ag    nd    es   Face 6, up from 1


Flex it [Right, Right, Left]
  The initial visible face is 1: "haeppx"
  flexing Right ..
  The current visible face is 2: "efxeli"
  flexing Right ..
  The current visible face is 3: "xlarea"
  flexing Left ..
  The current visible face is 2: "efxeli"
  flexed [Right, Right, Left]!

outputting "efxeli"

ตัวอย่างการนำไปใช้: http://jdoodle.com/a/18A

อินพุตและเอาต์พุตที่คาดหวัง:

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

> abcdefghijklmnopqr stuvwxyz1234567890 UL
= I can't flex that way :(

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

กฎระเบียบ

  • คุณสามารถรับอินพุตและส่งคืนเอาต์พุตในวิธีที่สมเหตุสมผล
  • หากอินพุตเป็นไปไม่ได้คุณควรระบุในบางวิธีที่แตกต่างจากเอาต์พุตปกติ
  • ช่องโหว่มาตรฐานใช้
  • Codegolfนี่คือ รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


2

Haskell (แลมบ์บ็อต), 270 234 ไบต์

(!)=((map(snd<$>).groupBy((.fst).(==).fst).sortOn fst).).zip.cycle
o n(a,b)|n>1||b<1=(mod(a+[-1,1,0,0]!!n)3,mod(b+[0,0,-1,1]!!n)3)
(x&y)d|(g,h)<-foldl(flip(.))id(o<$>d)(0,0)=([0,1,2]!x++[3,3,4,4,5,5]!y)!!([0,5,1,1,4,2,2,3,0]!!(3*g+h))

การใช้งาน:

> (&) "hexaflexaperplexia" "flexagationdevices" [1,3]
"exioic"

[0,1,2,3] = [ซ้าย, ขวา, ขึ้น, ลง]

ขอบคุณ @Damien เป็นจำนวนมาก!


1
การใช้|b/=0=[]!!1คืออะไร? คุณสามารถบันทึกการเขียนใหม่บางฟังก์ชั่นในรูปแบบ pointfree ได้ไม่กี่ไบต์: \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
ดาเมียน

@Damien |b/=0=[]!!1เพียงแค่โยนข้อยกเว้นถ้าคุณพยายามที่จะดิ้นเป็นไปไม่ได้
BlackCap

1
ตกลงคุณสามารถทำให้มันง่ายขึ้นโดยการทำo n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)เช่นนี้จะทำให้เกิดข้อยกเว้นรูปแบบที่ไม่ครบถ้วนสมบูรณ์
ดาเมียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.