六角形のロッドscupltureに保持されている水


22

私は奇妙な彫刻に接着された六角形の棒の束を持っています。棒の長さは1〜99センチメートル(cm)で、断面積は1平方センチメートルです。すべてのロッドは、六角形の面で少なくとも1本の他のロッドに接着されています。ロッドはすべて下端で揃えられています。

大雨の後、彫刻は水で満たされています。それはどれくらいの水を保持しますか?

入力

プログラムは、(stdinまたはファイルを介して)スペースのペアと次の形式のロッドの長さを指定する数字のペアで構成される行を読み込む必要があります。

  aa  bb
cc  dd  ee
  ff  gg

例に示すように、各ロッド(ここのddなど)は、最大6本の周囲のロッドに接着されています。不足しているロッドは穴であり、水を収集しません。たとえば、入力

  04  04
04  01  03
  04  04

次の彫刻を表します。

ここに画像の説明を入力してください

中央の棒は高さです1(その棒が見える角度が見つかりませんでした)。これで、そのロッドの上のコラム3は、右側のロッドから溢れる前に2 cmの水を保持できます。他のロッドはどれもその上に水を保持できないため、答えはになります2。次に、さらに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
最初の2回はこれを視覚化するのに苦労したので、図を追加して最初の例についてもう少し説明を加えました。気にしないでください。
マーティンエンダー

これは、水で満たされた形状を含む他の課題と本当に似ています。
-FUZxxl

2
@FUZxxlそのような他の課題がありますか?
オプティマイザー

1
@FUZxxl私はこの挑戦だけを思い出しますが、それは非常に異なっています。
マーティンエンダー

@Optimizer これはやや似ています。
ズガルブ

回答:


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以下の六角形と呼び、水中に向かっている(または既に水没している)六角形を「水中」と呼びます。6つの隣人に囲まれていない水没した六角形から水がこぼれます。そのような六角形をすべて排除します。もちろん、現在、いくつかの他の水没した六角形の隣人は6人未満である可能性があり、それらも同様に排除する必要があります。収束するまで、つまり、残りのすべての水没した六角形に正確に6つの近傍ができるまで、この方法を続けます。この時点で、水没した六角形の数(得られた水量)を合計カウントに追加し、水位を増分します。

最終的に、すべての六角形が除去され、停止します。


-3<c-b<3 代わりにを使用してキャラクターを剃ることができるはずです3>abs(c-b)
DLosc

@DLoscああ、しかし、それらは複素数です;)
エル

魅力的です。それをキャッチしませんでした。
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]の形式の2要素配列を保存します
  • ロッドはハッシュに配置され、x、y座標によってインデックスが付けられます
  • 水漏れ部分は、すぐ隣のロッド/水位を考慮します

少し読みやすいバージョンはこちらから入手できます:http : //ideone.com/cWkamV

テスト済みのゴルフバージョンをオンラインで実行します:http : //ideone.com/3SFjPN


scanブロック引数を取ります。あなただけ行うことができますscan(/../){...}。代わりに(/../)スキャン」の地図に{| V | ...} . (You don't need the | V | `インサイドので、scanあなたができるブロック$&$1など)
ヨルダン

@ジョルダン素晴らしい観測!ありがとう!
クリスチャンルパスク16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.