มดสามารถสะกดคำโดยการเดินบนลูกบาศก์ได้ไหม?


10

เขียนฟังก์ชันที่รับพารามิเตอร์สองตัวคือจำนวนเต็มบวกnและรายการคำ

ได้รับก้อนn -by- n -by- nหน่วยกำหนดอักษรแบบสุ่ม (แอริโซนา) ให้กับแต่ละหน่วยพื้นผิว (สำหรับลูกบาศก์ 3x3x3 จะมีหน่วยพื้นผิว 9 หน่วยในแต่ละใบหน้า)

จากนั้นตรวจสอบว่ามีความเป็นไปได้ไหมที่มดเดินไปตามพื้นผิว (ด้วยความสามารถในการข้ามใบหน้า) เพื่อสะกดคำที่ให้มาแต่ละคำ สมมติว่าในการสะกดคำตัวอักษรจะต้องขึ้น / ลงหรือซ้าย / ขวาติดกัน แต่ไม่จำเป็นต้องอยู่บนใบหน้าเดียวกัน [ แก้ไข, เพื่อความชัดเจน:มดสามารถย้อนเส้นทางและใช้ตัวอักษรมากกว่าหนึ่งครั้ง หน่วยพื้นผิวแต่ละหน่วยนับเป็นอักขระเดียวดังนั้นหากต้องการสะกดคำด้วยตัวอักษรซ้ำ ๆ (เช่น "ดู") มดจะต้องไปที่สามหน่วยที่อยู่ติดกัน]

ฟังก์ชั่นควรส่งออกสองสิ่ง:

1) ตัวอักษรแต่ละตัวในแต่ละหน้าในแบบที่โทโพโลยีสามารถอนุมานได้ ตัวอย่างเช่นสำหรับ 2x2x2 cube เอาต์พุตที่ยอมรับได้จะมีลักษณะดังนี้:

   QW
   ER
TY OP UI
DF JK XC
   AS
   GH
   LZ
   VB

2) แต่ละคำพร้อมกับบูลีนที่แสดงว่ามดเป็นไปได้หรือไม่ที่จะสะกดคำโดยการเดินไปตามพื้นผิวของลูกบาศก์ ตัวอย่างเช่น

1 ask
0 practical
1 pure
0 full

ความท้าทายโบนัส (จะไม่ส่งผลต่อคะแนนเพียงเพื่อความสนุกสนาน):แทนที่จะnเป็นตัวแทนเพียงขนาดของก้อนให้nยังเป็นตัวแทนของมิติของรูปร่าง งั้นnของ 2 จะได้ 2x2 สแควร์; n 3 จะให้ผลผลิตลูกบาศก์ 3x3x3; และnจาก 4 จะให้ผลเป็น 4x4x4x4 tesseract


1
ฉันคิดว่าคุณต้องให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการที่ลูกบาศก์ควรจะส่งออก ตัวอย่างเช่นตัวอักษรทั้งหมดสามารถอยู่ในบรรทัดเดียวได้หากเรารู้อยู่เสมอว่าควรจะจัดการอย่างไร
Doorknob

1
ตราบใดที่โทโพโลยีสามารถอนุมานได้ฉันไม่ต้องการวางข้อ จำกัด เพิ่มเติมใด ๆ เกี่ยวกับวิธีการส่งออกตัวอักษร ตัวอย่างหลายบรรทัดของฉันในคำอธิบายเป็นตัวอย่างแทนที่จะเป็นเชิงอธิบาย
jawns317

3
ดูเหมือนว่ามดสามารถเปลี่ยนทิศทางได้ ควรระบุไว้อย่างชัดเจน สามารถหมุนได้ 180 องศาและใช้ตัวอักษรเดียวกันได้สองครั้งหรือไม่? คุณสามารถค้นหาqwqหรือqqในคิวบ์ตัวอย่างได้หรือไม่
Zgarb

3
นอกจากนี้มดสามารถใช้ตัวอักษรมากกว่าหนึ่งครั้งได้หรือไม่?
lirtosiast

1
กฎการกระจายตัวอักษรแบบสุ่มมีอะไรบ้าง? ตัวอย่างของคุณไม่แสดงตัวอักษรที่ซ้ำกัน แต่ด้วยอัลกอริธึมที่ง่ายซึ่งตัวอักษรแต่ละตัวถูกเลือกอย่างอิสระจากความเป็นไปได้ทั้งหมด 26 ตัวโอกาสของการทำซ้ำเป็นศูนย์จึงไม่น่าเป็นไปได้สูง เห็นได้ชัดว่ามี N> 2 จะต้องมีการทำซ้ำ คุณควรระบุสิ่งนี้ให้ชัดเจนยิ่งขึ้นในกรณีที่มีคนลองคิวบ์ด้วยตัวอักษรต่างกันเพียงสองตัวที่กระจายแบบสุ่มทั่วทั้งคิวบ์
เลเวลริเวอร์เซนต์

คำตอบ:


3

ทับทิม 272 ไบต์

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

รูปแบบออกเป็น0หรือ1ต่อคำถามแทนพื้นเมืองทับทิมและtrue falseขึ้นบรรทัดใหม่ (แทนที่จะเว้นวรรค) ใช้เพื่อแยกบูลีนและคำ ความเข้าใจของฉันคือว่านี่เป็นการตีความที่ยอมรับได้ของข้อกำหนดเอาต์พุต แต่ถ้าไม่ผลกระทบต่อจำนวนไบต์จะน้อย

f=->n,l{c=''
x=[p=6*n,1,-p,-1]
(m=3*p*n).times{|i|c<<(5+i/n%6-i/n/p&6==6?65+rand(26):i%p==p-1?10:46)}
q=m+3*n
puts c

g=->w,i,d{w==''?$r=1:c[i]<?A?g[w,(i+x[d])%q,d^1]:w[0]==c[i]&&4.times{|j|g[w[1..-1],(i+x[j])%q,j^1]}}

l.each{|w|$r=0
m.times{|i|c[i]>?@&&g[w,i,0]}
puts $r,w}}

เอาท์พุต

หลังจากประมาณ 50 สายเช่นนี้:

f[4,['PPCG','CODE','GOLF','ANT','CAN','CUBE','WORD','WALK','SPELL']]

ในที่สุดฉันก็ได้เอาต์พุตต่อไปนี้พร้อมกับเพลงฮิต 2 เพลง ANTอยู่ที่ด้านล่างขวาขึ้นไปข้างบนและANแบ่งกันด้วยโดยCANมีการCล้อมรอบไปทางซ้ายบน

....KCAAXRHT...........
....ALRZXRKL...........
....NDDLCMCT...........
....ETQZHXQF...........
........FYYUSRZX.......
........CFNPAUVX.......
........ZTJVHZVQ.......
........AUWKGVMC.......
............XWKSDWVZ...
............DPLUVTZF...
............DMFJINRJ...
............ZRXJIAFT...
0
PPCG
0
CODE
0
GOLF
1
ANT
1
CAN
0
CUBE
0
WORD
0
WALK
0
SPELL

คำอธิบาย

ก้อนที่เลือกแฉโดยเฉพาะถูกเลือกนั้นได้รับการคัดเลือกมาบางส่วนเพื่อความสะดวกในการวาด แต่ส่วนใหญ่เพื่อความสะดวกในการค้นหา

อักขระที่ไม่ใช่ตัวอักษร (จุดบวกขึ้นบรรทัดใหม่ที่ท้ายบรรทัดแต่ละบรรทัด) เป็นส่วนสำคัญของฟิลด์ที่อาจพบมดได้

การค้นหาจะดำเนินการโดยฟังก์ชั่น recursive ซึ่งซ้อนในการทำงานg fหากคำที่ส่งผ่านเป็นสตริงว่างเปล่าการค้นหาเสร็จสมบูรณ์และ$rตั้งค่าเป็น 1 หากมดอยู่ในช่องสี่เหลี่ยมตัวอักษรซึ่งสอดคล้องกับตัวอักษรตัวแรกของคำการค้นหาจะดำเนินต่อไปในทั้งสี่ทิศทาง: ฟังก์ชั่นถูกเรียกอีกครั้ง ด้วยคำที่สั้นลงโดยการลบอักษรตัวแรกของมัน ในกรณีนี้พารามิเตอร์ทิศทางจะถูกละเว้น การเคลื่อนย้ายทำได้โดยการเรียกซ้ำด้วยดัชนีเซลล์ที่เปลี่ยนแปลงโดยค่าในx.ผลลัพธ์ของการบวกจะถูกนำไปเป็นขนาดของกริดบวกกับอีกครึ่งบรรทัด ซึ่งหมายความว่าบรรทัดล่างล้อมรอบไปด้านบนและในทางกลับกันด้วยการชดเชยแนวนอนที่ถูกต้อง

หากมดอยู่ในจตุรัสที่ไม่มีตัวอักษรเธอจะต้องคดเคี้ยวไปมาในลักษณะบันไดจนกว่าเธอจะพบสแควร์จดหมาย เธอจะซิกแซกในทิศทางตะวันออกเฉียงใต้หรือทิศตะวันตกเฉียงเหนือ สิ่งนี้ถูกจำลองโดยการเรียกซ้ำโดยใช้dพารามิเตอร์ที่มี XORed ด้วย 1 แต่ละครั้งเพื่อติดตามการเคลื่อนไหวของเธอ จนกว่าเธอจะไปถึงจตุรัสจดหมายถัดไปจะไม่มีการตัดทอนคำอินพุต สิ่งอำนวยความสะดวกนี้สามารถทำได้โดยการสอบถามซ้ำเช่นเดียวกับที่ใช้เมื่อเราค้นหาในพื้นที่ด้วยตัวอักษร ความแตกต่างคือการเรียกซ้ำมีเพียงสาขาเดียวเมื่อมดอยู่ในพื้นที่ช่องว่างเมื่อเทียบกับ 4 ในพื้นที่ตัวอักษร

รหัสความคิดเห็น

->n,l{                                   #n=square size, l=list of words to search
  c=''                                   #empty grid
  x=[p=6*n,1,-p,-1]                      #offsets for south, east, north, west. p is also number of characters per line
  (m=3*p*n).times{|i|                    #m=total cells in grid. for each cell
    c<<(5+i/n%6-i/n/p&6==6?              #apppend to c (according to the formula)
      65+rand(26):                       #either a random letter
      i%p==p-1?10:46)                    #or a "whitespace character" (newline, ASCII 10 or period, ASCII 46)
  }
  q=m+3*n                                #offset for vertical wraparound = grid size plus half a row.                           
  puts c                                 #print grid

  g=->w,i,d{                             #search function. w=word to search for, i=start index in grid, d=direction
    w==''?                               #if length zero, already found,
      $r=1:                              #so set flag to 1. Else
      c[i]<?A?                           #if grid cell is not a letter
        g[w,(i+x[d])%q,d^1]:             #recursively call from the cell in front, with the direction reflected in NW-SE axis
        w[0]==c[i]&&                     #else if the letter on the grid cell matches the start of the word
          4.times{|j|                    #for each direction (iterate 4 times, each time a different direction is "in front")
            g[w[1..-1],(i+x[j])%q,j^1]}  #recursively call from the cell in front. Chop first letter off word. 
   }                                       #Direction parameter is XORed (reflected in NW-SE axis) in case ant hits whitespace and has to zigzag.

   l.each{|w|                            #for each word in the list
     $r=0                                #set global variable $r to zero to act as a flag
     m.times{|i|c[i]>?@&&g[w,i,0]}       #call g from all cells in the grid that contain a letter 
     puts $r,w}                          #output flag value and word
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.