ฉันสามารถสร้างรูปร่างนั้นด้วยบล็อกแผ่นพื้นและบันไดได้หรือไม่?


13

พิจารณากริดสองมิติแบบสี่เหลี่ยมผืนผ้าที่แต่ละเซลล์สามารถว่างเปล่า ( .) หรือเต็ม ( 0)

เช่น

..00....
0000....
.00000..
000...00
..000000
000.00..

ตารางถือว่าไม่สิ้นสุดเซลล์ทั้งหมดที่อยู่นอกขอบเขตที่ปรากฎนั้นว่างเปล่า

เป้าหมายคือเพื่อปิดช่องว่างที่เต็มไปและปล่อยให้ช่องว่างว่างเปิดโดยใช้ก้อนอิฐรูปทรง 7 ก้อนที่แต่ละก้อนใช้พื้นที่ 4 เซลล์ (2 × 2) ของตาราง

นี่คืออิฐ 7 ก้อน:

  • บล็อก - 1 ตัวแปร

    11
    11
    
  • แผ่นพื้น - 2 รูปแบบ

    ..
    22
    33
    ..
  • บันได - 4 รูปแบบ

    .4
    44
    5.
    55
    66
    .6
    77
    7.

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

ดังนั้นวิธีหนึ่งที่จะครอบคลุม (aka แก้) ตัวอย่างข้างต้นเป็นเช่นนี้:

..11....
2211....
.47733..
447...22
..771133
227.11..

(ก้อนอิฐที่อยู่ใกล้เคียงกันยังคงสามารถทำให้เกิดความกำกวมได้

ที่ไม่ถูกต้องวิธีแก้ปัญหาสำหรับ

000000
000000

คือ

566774
556744

เพราะก้อนอิฐไม่ได้เรียงตัวกันเป็นกริดที่ใหญ่ขึ้นหรือครอบครองเพียงเซลล์เดียว

ทางออกที่ถูกต้องที่นี่คือ 3 บล็อกในแถว:

111111
111111

และอีกวิธีที่ถูกต้องเกี่ยวข้องกับ 6 แผ่น:

......
222222
333333
......

ดังนั้นทราบว่าบางส่วนกริดป้อนข้อมูลมีการแก้ปัญหาหลาย

ที่ไม่ถูกต้องวิธีแก้ปัญหาสำหรับ

00.00
00...

คือ

11.33
11...

เพราะอิฐไม่จัดแนวกับกริดที่ใหญ่ขึ้น แผ่นพื้นจะต้องเลื่อนไปทางซ้ายหรือขวาทีละแผ่น แต่แน่นอนว่าแผ่นปิดจะไม่สมบูรณ์ ตารางการป้อนข้อมูลนี้มีวิธีการแก้ปัญหาไม่มี

ท้าทาย

เขียนโปรแกรมที่ใช้ (ผ่านบรรทัด stdin / command) บล็อกสี่เหลี่ยมของข้อความของ.'s และ0' s ที่แสดงถึงกริดที่จะครอบคลุม

หากมีวิธีการแก้ปัญหาครอบคลุมที่ถูกต้องให้พิมพ์ (ผ่าน stdout) วิธีใดวิธีหนึ่งในลักษณะเดียวกับข้างต้นแทนที่ทั้งหมด0ของด้วยความเหมาะสม1ผ่าน7อิฐ

หากไม่มีวิธีแก้ปัญหาโปรแกรมของคุณไม่ควรแสดงผลอะไรเลยเพียงแค่ปิดเสียงอย่างเงียบ ๆ

หมายเหตุ

  • อินพุตและเอาต์พุตไม่จำเป็นต้องมีขนาดสี่เหลี่ยมผืนผ้าเหมือนกัน เอาต์พุตของคุณสามารถมีแถวและ / หรือคอลัมน์ที่ไม่เกี่ยวข้องทั้งหมด.(ตราบเท่าที่พวกเขาไม่ได้ทำให้การแก้ปัญหา)

  • นอกจากนี้ยังเป็นไรที่จะตัดแต่งแถวและคอลัมน์ของทั้งหมด.หากไม่มีผลกับช่องว่างที่เติม เช่น

    222222
    333333
    

    เป็นทางออกที่ถูกต้องในการ

    000000
    000000
    

    ในทางกลับกันคอลัมน์ว่างสองคอลัมน์ใน00..00ไม่สามารถลบออกได้เนื่องจากจะทำให้พื้นที่ว่างเต็มไป

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

  • กริดที่ว่างเปล่า (ทั้งหมด.) และตาราง 0 × 0 เล็กน้อยนั้นไม่ใช่กรณีที่คุณต้องกังวล แต่0กริด1 × 1 นั้นก็เช่นเดียวกับกริดอื่น ๆ ทั้งหมดที่มีอย่างน้อยหนึ่ง0ตาราง (คุณอาจไม่ถือว่าความกว้างหรือความสูงของกริดอินพุตเป็นเลขคู่!)

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

  • คุณอาจจะใช้ใด ๆ ที่แตกต่างกัน 9 ASCII พิมพ์. 0 1 2 3 4 5 6 7ตัวอักษรในสถานที่ของ เพียงแค่บอกว่าสิ่งที่คุณใช้ทดแทนคืออะไร! ขึ้นบรรทัดใหม่จะต้องคงอยู่เหมือนเดิม

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นโพสต์โหวตสูงสุด

ความท้าทายนี้ได้แรงบันดาลใจจากบล็อก , แผ่นพื้นและบันไดในMinecraft , ซึ่งเป็นไปตามกฎเดียวกันอธิบายไว้ที่นี่ หากคุณสนุกกับPPCGและ Minecraft คุณอาจต้องการที่จะตรวจสอบPPCG Minecraft เซิร์ฟเวอร์


3
ดูเหมือนว่าเซิร์ฟเวอร์ Minecraft ไม่ได้ใช้งานในสคริปต์กอล์ฟ - น่าเบื่อ :-)
Thomas Weller

5
@ThomasWeller มีการใช้งานอีกครั้งใน CJam เพื่อบันทึกสองสามไบต์
Alex A.

คำตอบ:


6

Python - 525 491 478 430 ไบต์

r=range
def t(s):
 m=s.find("\n")+1
 for q in r(4):
  try:
   for i in r(-q%2,m-1,2):
    for j in r(-q/2,len(s)/m,2):
     k,g=j*m+i,""
     b=[k,k+1,k+m,k+m+1]
     for z in b:g+=a(s,z)
     for z in b:
      if a(s,z)!="d":s=s[:z]+`dict(dddd=0,zzdd=3,ddzz=2,zzzd=7,zzdz=6,zdzz=5,dzzz=4,zzzz=1)[g]`+s[z+1:]
   return s
  except:d
def a(v,i):
 try:
  if v[i]!="\n":return v[i]
  return "d"
 except:return "d"

คำอธิบาย:นี่คือรหัสกอล์ฟครั้งแรกของฉันดังนั้นมันอาจไม่เหมาะสม แต่นี่เป็นวิธีการทำงาน ฟังก์ชัน t (s) ให้ผลลัพธ์สำหรับสตริงที่ผ่านเข้ามาขั้นแรกค้นหาจำนวนคอลัมน์จากนั้นจะผ่านการแปลที่แตกต่างกันสี่แบบที่เป็นไปได้โดย 1 (ไม่มีซ้ายซ้ายขึ้นซ้ายบน) และพยายามแก้ไข สำหรับแต่ละคน มันจะดูที่บล็อก 2x2 แต่ละอันและแมปไปยังหมายเลขบล็อกที่ถูกต้องซึ่งกำหนดโดยพจนานุกรมและเปลี่ยนค่าศูนย์เป็นตัวเลข

หากพบสิ่งที่ไม่ได้อยู่ในพจนานุกรมมันจะละทิ้งออฟเซ็ตเฉพาะนั้นและเริ่มใหม่ด้วยอันถัดไป ถ้ามันผ่านทั้ง 4 ออฟเซ็ตโดยไม่ต้องหาทางออกที่ถูกต้องมันจะจบลงโดยไม่แสดงผลลัพธ์ใด ๆ a (v, i) อนุญาตให้ใช้ค่าดีฟอลต์นอกสตริงและละเว้นอักขระบรรทัดใหม่ แม้ว่ามันอาจจะจบลงด้วยการแก้ปัญหาบางส่วนผ่านช่วงเวลาของการทำงานก็มักจะแทนที่พวกเขาด้วยการแก้ไขครั้งสุดท้ายถ้ามันมีอยู่

แก้ไข:ใช้การแม็พอักขระอื่น: -> d, 0 -> z, ตัวเลขอื่น ๆ ทั้งหมดไปที่ตัวเอง สิ่งนี้ใช้กับทั้งอินพุตและเอาต์พุต


1
ยินดีต้อนรับสู่ PPCG! เรามีเคล็ดลับในการเล่นกอล์ฟใน Python ; โดยที่ฉันคิดว่าคุณสามารถบันทึกไบต์
lirtosiast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.