คุณสามารถพับ hexomino ให้เป็นลูกบาศก์ได้หรือไม่?


24

หนึ่งในของเล่นที่ชื่นชอบของเด็กของฉันเป็นชุดเช่นนี้ จริงๆแล้วมันเป็นของเล่นโปรดของฉัน - ฉันเล่นกับมันมาแล้ว นี่คือหนึ่ง:

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

อินพุต

ข้อมูลจะประกอบด้วย hexomino หนึ่งตัวที่สร้างขึ้นจากสี่เหลี่ยมแบบนี้:

+-+
| |
+-+

ตัวอย่างเช่น heximino อินพุตที่ถูกต้องคือ:

+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
  | |
  +-+

เอาท์พุต

  • ค่าความจริงหาก hexomino สามารถพับลงในคิวบ์หรือ
  • ค่าความผิดพลาดเป็นอย่างอื่น

เพื่อช่วยเราทำงานนิดหน่อยวิกิพีเดียมีกราฟิกที่ดีของ:

  • 35 hexominoes ทั้งหมด:

  • Hexominoes ทั้ง 11 ตัวที่พับเป็นลูกบาศก์:

หมายเหตุ

  • อินพุต hexominoes อาจมีการหมุนหรือการสะท้อนใด ๆ ไม่ใช่เฉพาะที่แสดงในภาพด้านบน
  • อินพุต hexominoes อาจมีช่องว่างนำ แต่จะถูกจัดตำแหน่งอย่างถูกต้องด้วยความเคารพต่อตัวเอง
  • อินพุต hexominoes อาจมีช่องว่างต่อท้ายที่ส่วนท้ายของบรรทัดและขึ้นบรรทัดใหม่ที่ส่วนท้ายของอินพุต

1
คุณช่วยอธิบายได้ไหมว่าทำไมถึงมีแท็กการประมวลผลภาพที่นี่ ไม่ว่าจะเป็นคำถามหรือคำตอบก็ไม่ต้องทำการประมวลผลภาพใด ๆ เพื่อแก้ไขปัญหา
เครื่องมือเพิ่มประสิทธิภาพ

ชี้แจงเกี่ยวกับพื้นที่นำหน้า / ส่วนท้าย: ช่องว่างนำหน้า / ต่อท้ายที่ไม่จำเป็นในแต่ละแถวและขึ้นบรรทัดใหม่ที่ไม่จำเป็นในอินพุตหรือไม่ ฉันควรจะจัดการอินพุต 1,000+ ตัวอักษรหรือไม่
edc65

@ edc65 ใช่คุณควรคาดหวังพื้นที่สีขาวที่ไม่จำเป็นที่คุณอธิบาย ขนาดอินพุตสูงสุด 1,000 ตัวอักษรดูเหมือนว่าสมเหตุสมผล - ฉันจะแก้ไขใน
Digital Trauma

อืมมม ฉันสงสัยว่าในจำนวนที่เท่ากันของลูกบาศก์หกเหลี่ยมที่สามารถบีบอัดวางบนหน้าสิ่งพิมพ์ได้อย่างไร
luser droog

คำตอบ:


7

PMA / หอย , 130

.!(z\ |o{c..!(z\ }3){w=(..!(z\ )|b..!(z\ )o{..!(z\ }2|c{..!(z\ }1,2w..!(z\ )|w{..!(z\ }1,2c..!(z\ }4o..!(z\ )(..!(z\ )|n..!(z\ )`2

หรือมากกว่า "อ่านง่าย"

?
.!(z\  | o{c..!(z\ }3  )
{w =( ..!(z\ ) | b ..!(z\ ) o {..!(z\ }2  | c {..!(z\ }1,2w..!(z\ ) | w {..!(z\ }1,2c..!(z\  }4
o  ..!(z\ ) ( ..!(z\ ) | n ..!(z\ ) `2

ผิดปกติปัญหามาพร้อมที่สามารถจัดการได้โดยคุณสมบัติจำนวน จำกัด ดำเนินการจนถึง !(z\ )รูปแบบการกำหนดว่าตำแหน่งปัจจุบันที่พื้นที่ในช่วงกลางของตารางโดยใช้ยืนยันในเชิงลบที่มีช่องว่างในบาง "octilinear" ทิศทาง แนวคิดทั่วไปคือการตรวจสอบรูปแบบที่วางสี่เหลี่ยมจัตุรัสในแต่ละตำแหน่งที่จำเป็น 5 แห่งที่เกี่ยวข้องกับสี่เหลี่ยมจัตุรัสที่การแข่งขันเริ่มต้นขึ้น นอกจากนี้ยังต้องตรวจสอบว่ามันไม่ได้อยู่ในบล็อกสี่เหลี่ยม 2x2 ก่อนที่โปรแกรมจะทำงานฉันต้องแก้ไขข้อบกพร่องด้วยการแยกวงเล็บ

หาก hexomino ไม่แม็พคิวบ์0จะถูกพิมพ์ หากเป็นเช่นนั้นจะมีการพิมพ์จำนวนเต็มบวกบางส่วน (จำนวนการจับคู่)

ฉันปรับตัว กำเนิดโพลีโอมิโนนี้เพื่อสร้างกรณีทดสอบที่เป็นไปได้ทั้งหมด:

n=input()
r=range
T=lambda P:set(p-min(p.real for p in P)-min(p.imag for p in P)*1j for p in P)
A=[]
for i in r(1<<18):
 P=[k%3+k/3*1j for k in r(18)if i>>k&1]
 C=set(P[:1])
 for x in P:[any(p+1j**k in C for k in r(4))and C.add(p)for p in P]
 P=T(P)
 if not(C^P or P in A or len(P)-n):
  #for y in r(4):print''.join(' *'[y+x*1j in P] for x in r(6))
  o = [ [' ']*13 for _ in r(9)]
  for y in r(4):
   for x in r(6):
    if y+x*1j in P: X=2*x;Y=2*y; o[Y][X]=o[Y+2][X]=o[Y][X+2]=o[Y+2][X+2]='+'; o[Y][X+1]=o[Y+2][X+1]='-';o[Y+1][X+2]=o[Y+1][X]='|'
  print '\n'.join(map(''.join,o))
  A+=[T([p*1j**k for p in P])for k in r(4)]

hahahahahahahah เพิ่มเติม "อ่านง่าย"
เครื่องมือเพิ่มประสิทธิภาพ

5

ทับทิม, 173 148 145 143 ไบต์

h=->b,c{[c.count(c.max),c.count(c.min),3].max*2<b.max-b.min}
->s{x=[];y=[];i=j=0
s.bytes{|e|e==43&&x<<i|y<<j;i=e<32?0*j+=1:i+1}
h[x,y]||h[y,x]}

การเปลี่ยนแปลงล่าสุด: /2ทางด้านขวาของ<แทนที่ด้วย*2ทางด้านซ้าย อนุญาตให้กำจัดหนึ่งชุด()

คำอธิบาย

รหัสอยู่ในสองส่วน: ฟังก์ชั่นหลักที่ไม่มีชื่อที่แยกวิเคราะห์และฟังก์ชั่นเสริมชื่อที่กำหนดให้กับตัวแปร hที่ทำการตรวจสอบ

ฟังก์ชั่นหลักสแกน bytewise ผ่านสตริงเพิ่ม x และ y พิกัดi,jของ+สัญลักษณ์ที่พบและx[] y[]จากนั้นโทรhสองครั้ง ครั้งแรกที่ถือว่า hexomino เป็นแนวนอน ( x[]ประกอบด้วยความยาวและy[]ความกว้าง) และครั้งที่สองที่ถือว่าเป็นแนวตั้ง

ฟังก์ชั่นhใช้เวลาพิกัดยาวในอาร์เรย์bแล้วพิกัด widthwise cในอาร์เรย์ มันจะคำนวณความยาว (สี่เหลี่ยม) (b.max.b.min)/2โดยการแสดงออก หากนี่น้อยกว่าหรือเท่ากับ 3, hexomino ควรได้รับการประเมินในทิศทางอื่น ๆhfalseผลตอบแทน

การตรวจสอบ hexominos จะแสดงให้เห็นว่าหากความยาวเท่ากับ 4, hexominos เหล่านั้นที่จะพับเข้าในลูกบาศก์จะมีไม่เกิน 2 สี่เหลี่ยม (3 +สัญลักษณ์) ในแถวแรกและแถวสุดท้ายในแถวแรกและครั้งสุดท้าย สี่เหลี่ยมส่วนใหญ่กระจุกตัวอยู่ที่แถวกลางซึ่งจะกลายเป็นเส้นศูนย์สูตรของลูกบาศก์ เงื่อนไขนี้กลายเป็นสิ่งที่จำเป็นและเพียงพอสำหรับ hexomino ที่มีความยาว 4 ซึ่งจะพับเป็นลูกบาศก์

มี hexomino เพียงความยาว 5 เดียวที่จะพับเป็นลูกบาศก์ มันมี 3 สี่เหลี่ยม (4 +สัญลักษณ์) ในแถวแรกและแถวสุดท้าย hexominos อื่น ๆ ทั้งหมดที่มีความยาว 5 มี 5 หรือมากกว่า+สัญลักษณ์ในแถวแรกหรือแถวสุดท้าย

มีความยาวหกเหลี่ยมเพียงหกเดียวเท่านั้นมี 6 +สัญลักษณ์ในแต่ละแถว

เมื่อรวมทั้งหมดเข้าด้วยกันมันก็เพียงพอแล้วที่จะตรวจสอบว่าความยาวของ hexomino มากกว่า 3 และจำนวนของ+สัญลักษณ์ในแถวแรกและแถวสุดท้าย (แล้วแต่จำนวนใดจะสูงกว่า) น้อยกว่าความยาว

Ungolfed ในโปรแกรมทดสอบ

#checking function as explained in text
h=->b,c{[c.count(c.max),c.count(c.min),3].max<(b.max-b.min)/2}

#main function for parsing
f=->s{
  x=[]                 #separate assignments required, 
  y=[]                 #otherwise we get 2 pointers to the same array
  i=j=0                #start coordinates 0,0
  s.bytes{|e|          #scan string bytewise
    e==43&&x<<i|y<<j     #if byte is a + symbol (ascii 43) add the coordinates to arrays x and y
    i=e<32?0*j+=1:i+1    #if byte is before ascii 32 assume newline, increment j and zero i. Otherwise increment i
  }
  h[x,y]||h[y,x]       #call h twice, with x and y in each possible order
}



#VALID INPUTS
puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
  | |
  +-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
+-+
| |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]

puts f["
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
      | |
      +-+"]

puts f["
    +-+
    | |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
    +-+
    | |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]


puts f["
  +-+
  | |
+-+-+-+-+
| | | | |
+-+-+-+-+
    | |
    +-+"]
puts f["
  +-+
  | |
+-+-+-+
| | | |
+-+-+-+-+
    | | |
    +-+-+"]  
puts f["
+-+-+
| | |
+-+-+-+
  | | |
  +-+-+-+
    | | |
    +-+-+"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+-+
      | | | |
      +-+-+-+
"]


#INVALID INPUTS

puts f["
  +-+-+-+
  | | | |
  +-+-+-+
  | | | |
  +-+-+-+
"]


puts f["
  +-+-+-+-+-+-+
  | | | | | | |
  +-+-+-+-+-+-+

"]


puts f["
  +-+-+
  | | |
  +-+-+
  | |
  +-+
  | |
  +-+
  | |
  +-+
  | |
  +-+
"]

puts f["
  +-+-+-+-+-+
  | | | | | |
  +-+-+-+-+-+
    | |
    +-+
"]

puts f["
      +-+
      | |
  +-+-+-+-+-+
  | | | | | |
  +-+-+-+-+-+
"]

puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+-+
        | | |
        +-+-+"]

puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
      | | |
      +-+-+
"] 


puts f["
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
  | | | |
  +-+ +-+
"]

puts f["
 +-+   +-+
 | |   | |
 +-+-+-+-+
 | | | | |
 +-+-+-+-+
"]

puts f["
   +-+-+
   | | |
 +-+-+-+-+
 | | | | |
 +-+-+-+-+
"]

puts f["
  +-+
  | |
  +-+
  | |
  +-+-+-+-+
  | | | | |
  +-+-+-+-+
"]

puts f["
  +-+
  | |
  +-+-+-+
  | | | |
  +-+-+-+
  | |
  +-+
  | |
  +-+
"]

puts f["
  +-+
  | |
+-+-+-+
| | | |
+-+-+-+
| |
+-+
| |
+-+"]

puts f["
  +-+-+
  | | |
  +-+-+
  | |
  +-+-+
  | | |
  +-+-+
    | |
    +-+
"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+
    | | | |
    +-+-+-+
"]

puts f["
  +-+-+-+
  | | | |
  +-+-+-+
      | |
      +-+-+
      | | |
      +-+-+
"]


puts f["
  +-+-+-+
  | | | |
  +-+-+-+-+
      | | |
      +-+-+
        | |
        +-+
"]

pentonimo → hexonimo ในข้อความของคุณ?
Paŭlo Ebermann

3

JavaScript (ES6), 443 431

แก้ไขการแก้ไขข้อบกพร่องปัญหาระหว่างการแยกวิเคราะห์อินพุตลบคอลัมน์ว่าง

F=t=>(a=b=c=d=e=f=g=h=0,M=Math.min,
t=t.split('\n').filter(r=>r.trim()>''),
t=t.map(r=>r.slice(M(...t.map(r=>r.search(/\S/))))),
t.map((r,i)=>i&1&&[...r].map((_,j)=>j&1&&r[j-1]==r[j+1]&t[i-1][j]==t[i+1][j]&r[j-1]=='|'
&&(y=i>>1,x=j>>1,z=y*5,w=x*5,a|=1<<(z+x),e|=1<<(w+y),b|=1<<(4+z-x),f|=1<<(4+w-y),c|=1<<(20-z+x),g|=1<<(20-w+y),d|=1<<(24-z-x),h|=1<<(24-w-y)
))),~[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056].indexOf(M(a,b,c,d,e,f,g,h)))

นั่นเป็นเรื่องที่ยาวมากและอีกต่อไปเมื่อแยกวิเคราะห์อินพุตเป็นส่วนใหญ่ของงาน

สิ่งที่ฉันทำคือ verifyng ถ้าอินพุตที่กำหนดเป็นหนึ่งใน hexominoes ที่พับได้ 11 ตัว

Hexomino ที่สามารถพับได้แต่ละอันสามารถแมปกับ 5x5 บิตแมปได้ (มากถึง 8 ที่แตกต่างกันพร้อมด้วยการหมุนและการหมุน) ใช้บิตแมปเป็นตัวเลข 25 บิตฉันได้พบค่าขั้นต่ำสำหรับเลขฐานสิบหกที่ระบุไว้ 11 รายการโดยใช้รหัสต่อไปนี้ (ด้วยรูปแบบอินพุตที่ง่ายมาก)

h=[ // Foldable hexominoes
'o\noooo\no', ' o\noooo\n o', // pink
'o\noooo\n   o', ' o\noooo\n  o', 'ooo\n  ooo', 'oo\n oo\n  oo', //blue
'o\noooo\n o', 'o\noooo\n  o', 'oo\n ooo\n o', 'oo\n ooo\n  o', 'o\nooo\n  oo' // gray
]
n=[]
h.forEach(t=>(
  a=[],
  t.split('\n')
    .map((r,y)=>[...r]
      .map((s,x)=>s>' '&&(
         a[0]|=1<<(y*5+x),a[1]|=1<<(x*5+y),  
         a[2]|=1<<(y*5+4-x),a[3]|=1<<(x*5+4-y),  
         a[4]|=1<<(20-y*5+x),a[5]|=1<<(20-x*5+y),  
         a[6]|=1<<(24-y*5-x),a[7]|=1<<(24-x*5-y))
     )
  ),
n.push(Math.min(...a))
))

ที่ให้ [1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]

ดังนั้นในสตริงอินพุตฉันต้องทำเช่นเดียวกันเพื่อค้นหาบิตแมปขนาดเล็กจากนั้นคืนค่าเป็นจริงถ้าจำนวนนี้มีอยู่ในรายการ precalc ของฉัน

// Not so golfed 

F=t=>(  
  a=b=c=d=e=f=g=h=0,M=Math.min,
  t=t.split('\n').filter(r=>r.trim()>''), // remove blank lines
  t=t.map(r=>r.slice(M(...t.map(r=>r.search(/\S/))))), // remove blank colums to the left
  t.map((r,i)=>i&1&&[...r] // only odd rows
   .map((_,j)=>j&1&& // only odd columns
      r[j-1]==r[j+1]&t[i-1][j]==t[i+1][j]&r[j-1]=='|' // found a cell
         &&(y=i>>1,x=j>>1,z=y*5,w=x*5, // find bitmaps for 8 rotations/simmetries
            a|=1<<(z+x),e|=1<<(w+y),  
            b|=1<<(4+z-x),f|=1<<(4+w-y),  
            c|=1<<(20-z+x),g|=1<<(20-w+y),  
            d|=1<<(24-z-x),h|=1<<(24-w-y)  
    ))),
   ~[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056].indexOf(Math.min(a,b,c,d,e,f,g,h)) // look for min
)

เรียกใช้ตัวอย่างเพื่อทดสอบใน Firefox


ยกโทษให้ฉันถ้าฉันพลาดบางอย่าง แต่คุณไม่สามารถ,\nt=tเริ่มต้นจากบรรทัดที่สอง / จุดเริ่มต้นของบรรทัดที่สามได้หรือไม่?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴทบทวนหกเดือนต่อมารหัสการแยกวิเคราะห์สามารถทำให้ 10 ... สั้นลง 15 ไบต์ ตามที่ฉันต้องการการมอบหมายให้ t ในบรรทัดที่ 2 และอีกครั้งในบรรทัดที่ 3 เพราะในบรรทัดที่ 3 มันถูกใช้เพื่อค้นหาจำนวนตัวอักษรว่างเปล่าที่จะตัดที่ด้านซ้าย
edc65
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.