น้ำที่เก็บไว้ใน scuplture แกนหกเหลี่ยม


22

ฉันมีแท่งหกเหลี่ยมติดกันเป็นรูปปั้นแปลก ๆ แท่งมีความยาว 1 ถึง 99 เซนติเมตร (ซม.) และ 1 ตารางเซนติเมตรในพื้นที่หน้าตัด แท่งทั้งหมดจะติดกาวบนใบหน้าหกเหลี่ยมถึงแท่งอื่นอย่างน้อยหนึ่ง แท่งอยู่ในแนวเดียวกันที่ขอบด้านล่าง

หลังจากฝนตกหนักประติมากรรมก็เต็มไปด้วยน้ำ ถือน้ำเท่าไหร่?

อินพุต

โปรแกรมของคุณควรอ่าน (ผ่าน stdin หรือไฟล์) จำนวนบรรทัดประกอบด้วยคู่ของช่องว่างและคู่ของตัวเลขที่ระบุความยาวของแท่งในรูปแบบนี้:

  aa  bb
cc  dd  ee
  ff  gg

แต่ละแท่ง (เช่น dd ที่นี่) ติดกาวได้สูงสุด 6 แท่งโดยรอบตามที่แสดงในตัวอย่าง แท่งที่หายไปคือหลุมและไม่รวบรวมน้ำ ตัวอย่างเช่นการป้อนข้อมูล

  04  04
04  01  03
  04  04

จะเป็นตัวแทนของประติมากรรมดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

แกนกลางมีความสูง1(ฉันไม่พบมุมที่ดีที่มองเห็นแท่งนั้นด้วย) ตอนนี้เสาเหนือแท่งนั้นสามารถกักเก็บน้ำไว้ได้ 2 ซม. ก่อนที่มันจะล้นเหนือ3แกนทางด้านขวา เนื่องจากไม่มีแท่งอื่น ๆ สามารถเก็บน้ำใด ๆ 2เหนือพวกเขาคำตอบจะเป็น นี่คือสองตัวอย่างที่ซับซ้อนมากขึ้น:

Example 2:
55  34  45  66
  33  21  27
23  12  01  77
  36  31  74
answer = 35 (  2 on top of 21 
             +11 on top of 12
             +22 on top of 01, before everything overflows over 23)

Example 3:
        35  36  77  22                      23  32  54  24
      33  07  02  04  21                  54  07  07  07  76
    20  04  07  07  01  20              54  11  81  81  07  76
  20  67  67  22  07  01  78          54  07  81  07  81  09  76
20  67  07  67  22  22  07  44  55  54  07  81  07  07  61  07  20
  67  57  50  50  07  07  14  03  02  15  81  99  91  07  81  04
67  07  50      50  87  39  45  41  34  81  07  07  89  07  81  79
  67  07  50  50  07  07  07  27  07  27  81  07  07  79  81  78
20  67  67  07  07  07  07  99  33  46  02  81  07  07  81  01  20
  33  07  07  01  05  01  92          20  02  81  07  81  15  32
    22  07  20  20  07  20              63  02  80  81  15  32
      45  20  01  20  39                  20  15  07  15  32
        23  20  20  29  43  21  18  41  20  66  66  43  21
      90                  99  47  07  20
    50                      20  02  48
  70                          56  20
                                90

answer = 1432

เอาท์พุต

โปรแกรมของคุณควรส่งออกจำนวนเต็มเดียวโดยให้ปริมาตรน้ำเป็นลูกบาศก์เซนติเมตร

คะแนน

คะแนนของคุณคือจำนวนไบต์ของซอร์สโค้ดของคุณ ชนะต่ำสุด

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้ามตามปกติ

ปริศนานี้ได้รับแรงบันดาลใจจาก Spoj คำถาม


4
ฉันมีปัญหาในการแสดงภาพนี้สองครั้งแรกที่ฉันอ่านดังนั้นฉันจึงมีอิสระในการเพิ่มไดอะแกรมและคำอธิบายเพิ่มเติมสำหรับตัวอย่างแรก หวังว่าคุณจะไม่รังเกียจ
Martin Ender

นี่คล้ายกับความท้าทายอื่น ๆ ที่เกี่ยวข้องกับรูปร่างที่เติมน้ำ
FUZxxl

2
@FZZxxl เรามีความท้าทายอื่น ๆ เช่นนั้น?
เครื่องมือเพิ่มประสิทธิภาพ

1
@FZZxxl ฉันจำได้แค่ความท้าทายนี้ซึ่งแตกต่างกันมาก
Martin Ender

@Optimizer อันนี้ค่อนข้างคล้ายกัน
Zgarb

คำตอบ:


4

Python 2, 222 ไบต์

import sys
y=h=v=0;B={}
for l in sys.stdin:
 z=y;y+=2j
 while l:
    if"0"<l:B[z]=int(l[:2])
    l=l[2:];z+=1
while B:C=B;B={b:B[b]for b in B if(h<B[b])+sum(3>abs(c-b)for c in B)/7};a=C==B;h+=a;v+=a*sum(h>B[b]for b in B)
print v

อ่านอินพุตผ่าน STDIN และเขียนผลลัพธ์ไปยัง STDOUT

คำอธิบาย

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

ในที่สุดรูปหกเหลี่ยมทั้งหมดจะถูกกำจัดและเราจะหยุด


คุณควรจะสามารถที่จะโกนตัวอักษรโดยใช้แทน-3<c-b<3 3>abs(c-b)
DLosc

@DLosc Ah แต่พวกเขาเป็นตัวเลขที่ซับซ้อน;)
Ell

มโนหร ไม่เข้าใจว่า
DLosc

2

ทับทิม 299

f=->i{s={}
l=i.lines
y=0
l.map{|r|x=0
r.scan(/../){s[[x,y]]=[v=$&.to_i,v<1?0:99];x+=1}
y+=1}
loop{break if s.map{|c,r|x,y=c
m = [[-1,-1],[1,-1],[-2,0],[2,0],[1,-1],[1,1]].map{|w,z|s[[x+w,y+z]]}.map{|n|n ?n[0]+n[1]:0}.min
r[1]=[0,m-r[0]].max if r[0]+r[1]>m&&r[1]>0}.none?}
s.map{|c,r|r[1]}.reduce :+}

คำอธิบายสั้น ๆ ของอัลกอริทึม:

  • แยกวิเคราะห์อินพุตและสำหรับแต่ละก้านจะบันทึกอาร์เรย์สององค์ประกอบของแบบฟอร์ม [rod_height, water_height]
  • แท่งจะอยู่ในแฮชและจัดทำดัชนีโดยพิกัด x, y
  • ส่วนการรั่วไหลของน้ำจะคำนึงถึงความสูงของก้าน / น้ำของเพื่อนบ้านทันที

รุ่นอ่านเพิ่มเติมเล็กน้อยสามารถใช้ได้ที่นี่: http://ideone.com/cWkamV

รันเวอร์ชัน golfed ออนไลน์ด้วยการทดสอบ: http://ideone.com/3SFjPN


scanรับอาร์กิวเมนต์บล็อก คุณก็สามารถทำscan(/../){...}. แทน 'สแกน (/../) map {| v | ... } . (You don't need the | v | `เพราะภายในscanบล็อกคุณสามารถ$&, $1ฯลฯ )
จอร์แดน

@ จอร์แดนข้อสังเกตที่ยอดเยี่ยม! ขอบคุณ!
Cristian Lupascu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.