Nước được giữ trong một scuplture hình lục giác


22

Tôi có một loạt các thanh lục giác dán lại với nhau thành một tác phẩm điêu khắc kỳ lạ. Các thanh dài từ 1 đến 99 cm (cm) và 1 cm vuông trong khu vực cắt ngang. Tất cả các thanh được dán trên một mặt lục giác với ít nhất một thanh khác. Các thanh được căn chỉnh ở cạnh dưới cùng của chúng.

Sau một vài cơn mưa lớn, tác phẩm điêu khắc đầy nước. Nó chứa bao nhiêu nước?

Đầu vào

Chương trình của bạn nên đọc (thông qua stdin hoặc tệp) một số dòng bao gồm các cặp khoảng trắng và cặp chữ số chỉ định độ dài của các thanh theo định dạng này:

  aa  bb
cc  dd  ee
  ff  gg

Mỗi thanh (như dd ở đây) được dán tối đa 6 thanh xung quanh như trong ví dụ. Thiếu que là lỗ và không thu thập nước. Ví dụ: đầu vào

  04  04
04  01  03
  04  04

sẽ đại diện cho tác phẩm điêu khắc sau đây:

nhập mô tả hình ảnh ở đây

Thanh trung tâm là chiều cao 1(tôi không tìm thấy một góc tốt trong đó thanh đó cũng có thể nhìn thấy). Bây giờ cột phía trên thanh đó có thể chứa 2 cm nước, trước khi nó tràn qua 3thanh bên phải. Vì không có loại que nào khác có thể giữ bất kỳ nước nào phía trên chúng, câu trả lời sẽ là 2. Đây là hai ví dụ phức tạp hơn:

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

Đầu ra

Chương trình của bạn sẽ xuất ra một số nguyên duy nhất cho thể tích nước tính bằng centimet khối.

Ghi bàn

Điểm của bạn là số byte của mã nguồn của bạn. Chiến thắng thấp nhất.

Các sơ hở tiêu chuẩn bị cấm như bình thường.

Câu đố này được lấy cảm hứng từ một câu hỏi SPOJ .


4
Tôi đã gặp khó khăn khi hình dung điều này trong hai lần đầu tiên tôi đọc nó, vì vậy tôi đã tự do thêm một sơ đồ và giải thích thêm một chút cho ví dụ đầu tiên. Hy vọng bạn không phiền.
Martin Ender

Điều này thực sự giống với những thách thức khác liên quan đến hình dạng chứa đầy nước.
FUZxxl

2
@FUZxxl chúng ta có những thử thách khác như thế không?
Tối ưu hóa

1
@FUZxxl Tôi chỉ nhớ lại thử thách này , rất khác.
Martin Ender

@Optimizer Cái này có phần giống nhau.
Zgarb

Câu trả lời:


4

Python 2, 222 byte

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

Đọc đầu vào thông qua STDIN và ghi kết quả vào STDOUT.

Giải trình

Chúng tôi bắt đầu từ 0 và tăng dần mực nước như sau: Giả sử mực nước là h và chúng tôi muốn thêm 1 cm nước. Chúng ta sẽ gọi các hình lục giác có chiều cao h hoặc thấp hơn, những hình lục giác sắp đi (hoặc đã có) dưới nước, " ngập nước ". Nước sẽ tràn qua bất kỳ hình lục giác chìm nào không được bao quanh bởi sáu người hàng xóm. Chúng tôi loại bỏ tất cả các hình lục giác như vậy; tất nhiên, bây giờ một số hình lục giác chìm khác có thể có ít hơn sáu hàng xóm và chúng cũng cần phải được loại bỏ. Chúng tôi tiếp tục theo cách này cho đến khi hội tụ, tức là cho đến khi tất cả các hình lục giác chìm còn lại có chính xác sáu hàng xóm. Tại thời điểm này, chúng tôi thêm số lượng hình lục giác chìm (khối lượng nước thu được) vào tổng số và tăng mức nước.

Cuối cùng, tất cả các hình lục giác sẽ bị loại bỏ và chúng tôi dừng lại.


Bạn sẽ có thể cạo một nhân vật bằng cách sử dụng -3<c-b<3 thay vì 3>abs(c-b).
DLosc

@DLosc À, nhưng chúng là số phức;)
Ell

Hấp dẫn. Không nắm bắt được điều đó.
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 :+}

Mô tả ngắn gọn về thuật toán:

  • phân tích cú pháp đầu vào và cho mỗi thanh lưu một mảng hai phần tử có dạng [Rod_height, water_height]
  • các thanh được đặt trong một hàm băm và được lập chỉ mục bởi tọa độ x, y của chúng
  • phần rò rỉ nước có tính đến độ cao que / nước của hàng xóm ngay lập tức

Phiên bản dễ đọc hơn một chút có sẵn tại đây: http://ideone.com/cWkamV

Chạy phiên bản golf trực tuyến với các bài kiểm tra: http://ideone.com/3SFjPN


scanmất một đối số khối. Bạn chỉ có thể làm scan(/../){...}. Thay vì 'quét (/../) bản đồ {| v | ...} . (You don't need the | v | `vì Bên trong scankhối bạn có thể $&, $1vv)
Jordan

@Jordan Quan sát tuyệt vời! Cảm ơn!
Cristian Lupascu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.