Altıgen bir çubuk heykelinde tutulan su


22

Tuhaf bir heykele yapıştırılmış altıgen çubuk demetim var. Çubuklar, kesit alanında 1 ila 99 santimetre (cm) uzunluğunda ve 1 kare cm'dir. Tüm çubuklar altıgen bir yüze en az bir başka çubuğa yapıştırılmıştır. Çubukların hepsi alt kenarlarında hizalanır.

Şiddetli yağışlardan sonra heykel su doludur. Ne kadar su tutuyor?

Giriş

Programınız, bu formattaki çubukların uzunluğunu belirten boşluk çiftleri ve sayı çiftlerinden oluşan bir dizi satırı (stdin veya bir dosya aracılığıyla) okumalıdır:

  aa  bb
cc  dd  ee
  ff  gg

Her çubuk (burada dd gibi), örneklerde gösterildiği gibi maksimum 6 çevreleyen çubuğa yapıştırılmıştır. Kayıp çubuklar deliklerdir ve su toplamazlar. Örneğin, giriş

  04  04
04  01  03
  04  04

Aşağıdaki heykeli temsil eder:

görüntü tanımını buraya girin

Merkez çubuk yüksektir 1(bu çubuğun da görünür olduğu yerde iyi bir açı bulamadım). Şimdi, çubuğun üzerindeki sütun 3, sağdaki çubuğun üzerine taşmadan önce 2 cm su tutabilir . Diğer çubukların hiçbiri üstlerinde su tutamadığından, cevap olacaktır 2. İşte iki tane daha karmaşık örnek:

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

Çıktı

Programınız, su hacmini santimetre küp cinsinden veren tek bir tamsayı çıkarmalıdır.

Gol

Puanınız kaynak kodunuzun bayt sayısıdır. En düşük kazanır.

Standart boşluklar her zamanki gibi yasaktır.

Bu yapboz bir SPOJ Soru'dan esinlenmiştir .


4
Bunu ilk okuduğumda bunu iki kez görselleştirmekte zorlandım, bu yüzden bir diyagram ekleme özgürlüğünü ve ilk örnek için biraz daha açıklama aldım. Umarım sakıncası yoktur.
Martin Ender

Bu gerçekten su ile doldurma şekilleri içeren diğer zorluklara benzer.
FUZxxl,

2
@Fuzxxl gibi başka zorluklarımız var?
Doktor

1
@ FUZxxl Sadece bu zorluğu hatırlıyorum , ki bu çok farklı.
Martin Ender

@Optimizer Bu biraz benzer.
Zgarb

Yanıtlar:


4

Python 2,222 bayt

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 üzerinden girişi okur ve sonucu STDOUT konumuna yazar.

açıklama

Sıfırdan başlıyoruz ve su seviyesini aşamalı olarak şu şekilde arttırıyoruz: Su seviyesinin h olduğunu ve 1 cm su eklemek istediğimizi varsayalım . H veya daha az yükseklikte altıgenleri, su altında gitmek üzere olan (ya da zaten su altında olanları) “ suya batmışdiyeceğiz . Su, altı komşuyla çevrili olmayan herhangi bir altıgen altıgene akacak. Tüm bu altıgenleri ortadan kaldırırız; Tabii ki, şimdi diğer bazı sualtı altıgen altı komşulardan daha az olabilir ve onların da elimine edilmesi gerekir. Bu şekilde yakınsamaya kadar devam ediyoruz, yani kalan su altı altıgenlerinin tümü altı tane komşusu olana kadar. Bu noktada, sualtı altıgenlerin sayısını (kazanılan su hacmi) toplam sayıya ekliyoruz ve su seviyesini arttırıyoruz.

Sonunda, tüm altıgenler ortadan kaldırılmış olacak ve duruyoruz.


Bir karakteri kullanarak -3<c-b<3 yerine tıraş edebilmelisiniz 3>abs(c-b).
DLosc

@DLosc Ah, ama onlar karmaşık sayılar;)
Ell

Büyüleyici. Onu yakalayamadım.
DLosc

2

Ruby 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 :+}

Algoritmanın kısa açıklaması:

  • girişi ayrıştırır ve her çubuk için formun iki elemanlı bir dizisini kaydeder [rod_height, water_height]
  • çubuklar bir karma içine yerleştirilir ve x, y koordinatlarıyla indekslenir
  • su sızdıran kısım, acil komşuların çubuk / su yüksekliklerini dikkate alır.

Burada biraz daha okunabilir bir sürüm var: http://ideone.com/cWkamV

Golf versiyonunu çevrimiçi olarak testlerle çalıştırın: http://ideone.com/3SFjPN


scanbir blok argümanı alır. Sadece yapabilirsiniz scan(/../){...}. Bunun yerine (/../) tarama' haritasına {| v | ...} . (You don't need the | v | `İçinde çünkü scanyapabilirsiniz blok $&, $1vs.)
Ürdün

@Jordan Harika gözlemler! Teşekkürler!
Cristian Lupascu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.