Ổn định cấu trúc gạch


8

Gạch và ổn định được xác định

Câu hỏi này sử dụng định nghĩa tương tự của gạch và độ ổn định như cấu trúc gạch có ổn định không?

Hãy [__]đại diện cho một viên gạch

         .
         .
         .
  BRK?BRK?BRK?BRK?  
BRK?BRK?BRK?BRK?BRK?
  BRK?BRK?BRK?BRK?  
BRK?BRK?BRK?BRK?BRK? . . .
  BRK?BRK?BRK?BRK?  
BRK?BRK?BRK?BRK?BRK?

đại diện cho một sự sắp xếp hoặc cấu trúc tùy ý của những viên gạch này, với mỗi hàng khác được bù bằng một nửa viên gạch, như thường thấy trong xây dựng gạch. Cấu trúc có thể mở rộng lên và sang phải vô thời hạn, nhưng biểu diễn chuỗi sẽ luôn là một khối văn bản hình chữ nhật hoàn hảo (có các khoảng trắng ở nơi cần thiết) có chiều rộng chia hết cho 4.

Mỗi BRK?trong cấu trúc có thể là một viên gạch ( [__]) hoặc khoảng trống (4 khoảng trắng).

Ví dụ, một cấu trúc có thể (không ổn định - đọc tiếp) là

[__]    [__]    [__]
  [__]        [__]  
[__][__]    [__]    

Sự ổn định của cấu trúc là quan trọng và cấu trúc chỉ ổn định nếu mỗi một viên gạch của nó ổn định.

Có ba cách một viên gạch riêng lẻ có thể ổn định:

  1. Bất kỳ gạch trên mặt đất (dòng gạch thấp nhất) là ổn định.
  2. Bất kỳ viên gạch nào có hai viên gạch trực tiếp bên dưới đều ổn định:

      [__]   <- this brick is stable
    [__][__] <- because these bricks hold it up
    
  3. Bất kỳ viên gạch nào có một viên gạch cả trên và dưới nó trên cùng một mặt đều ổn định:

      [__]  [__]
    [__]      [__] <- these middle bricks are stable
      [__]  [__]      because the upper and lower bricks clamp them in
    
    [__]          [__]
      [__]      [__]   <- these middle bricks are NOT stable
        [__]  [__]
    

(Vâng, tôi biết những quy tắc này không chính xác về mặt vật lý.)

Các thách thức cuối cùng là về việc xác định nếu một cấu trúc ổn định. Đây là về việc ổn định những người không.

Thử thách

Viết chương trình sắp xếp các viên gạch có khả năng không ổn định và thêm các viên gạch mới vào các khoảng trống để làm cho mọi thứ ổn định, in kết quả. Điều này được thực hiện mà không làm tăng kích thước tổng thể của khối văn bản đầu vào.

Mục tiêu là tạo ra một thuật toán làm cho cấu trúc ổn định bằng cách thêm càng ít gạch càng tốt.

JSFiddle ( nguồn ) này cho phép bạn tạo ra các sắp xếp ngẫu nhiên của các viên gạch để sử dụng trong khi kiểm tra chương trình của bạn. (Ước gì tôi có thể xếp các đoạn thay thế.) WidthLà số lượng gạch trên lớp cơ sở, Heightlà số lượng các lớp gạch và Densitylà một phần của các không gian gạch được lấp đầy.

Ví dụ, với Width = 5, Height = 3, Density = 0.6một đầu ra có thể là

....[__]....[__]....
..[__]....[__]......
[__]............[__]

Một cách để ổn định điều này với 4 viên gạch mới là

....[__]....[__]....
..[__][__][__][__]..
[__][__]....[__][__]

Chương trình của bạn phải có khả năng ổn định bất kỳ cấu trúc cục gạch nào mà JSFiddle có thể tạo.

  • Điều này bao gồm chuỗi rỗng (được coi là ổn định).
  • Những viên gạch sẽ luôn như vậy [__]. Dấu chấm ( .) chỉ được sử dụng cho rõ ràng. Chương trình của bạn có thể sử dụng dấu chấm hoặc khoảng trắng cho không gian trống.
  • Cấu trúc có thể đã ổn định, trong trường hợp đó không có gì cần phải làm (ngoài việc in nó).
  • JSFiddle luôn tạo ra các cấu trúc có thể được ổn định (bằng cách tránh Width = 1và gạch ở các góc trên cùng). Bạn có thể dựa vào điều này. (Làm đầy tất cả trừ các góc trên cùng chắc chắn sẽ ổn định mọi thứ nhưng điều này rõ ràng là không tối ưu.)
  • Giả sử không có đầu vào không hợp lệ. Lấy đầu vào dưới dạng chuỗi theo cách bạn muốn. In cấu trúc ổn định thành thiết bị xuất chuẩn hoặc tương tự.
  • Hãy nhớ rằng kích thước khối văn bản không nên thay đổi kích thước.
  • Gạch có sẵn không thể được di chuyển hoặc gỡ bỏ. Vị trí của các viên gạch mới phải tuân theo mô hình lưới bù cho mọi hàng khác. Tất cả các viên gạch phải hoàn toàn trong giới hạn.
  • Điều được khuyến khích (nhưng không bắt buộc) là bạn in các viên gạch có sẵn [XX]thay vì [__], để mọi người có thể thấy rõ hơn cách giải pháp của bạn hoạt động.

Chấm điểm

Ở dưới cùng của JSFiddle là 8 cách sắp xếp gạch không ổn định được xác định trước. (Họ sử dụng [__].nên giữ nguyên như vậy trừ khi bạn sử dụng [XX]và / hoặc thay vào đó.) Một số là ngẫu nhiên và một số do tôi tự tạo. Để tính điểm của bạn, hãy lần lượt chạy chương trình của bạn trên từng điểm và tính tổng số viên gạch mới được thêm vào mỗi viên.

Càng ít gạch mới bạn đã thêm càng tốt. Bài nộp với số điểm thấp nhất sẽ thắng. Trong trường hợp quan hệ, câu trả lời cũ nhất sẽ thắng.

Nếu mọi thứ trở nên gây tranh cãi, tôi có thể thêm một vài trường hợp được xác định trước và đánh giá người chiến thắng dựa trên chúng.

Ghi chú thêm

  • Chương trình của bạn cần chạy theo thứ tự phút trên máy tính hiện đại cho chiều rộng và chiều cao lưới gạch dưới 100. (Tối đa 10 phút trên máy tính như thế này .)
  • Bạn không thể mã hóa đầu ra của mình cho 8 cấu trúc được xác định trước. Chương trình của bạn phải đối xử với họ vì nó sẽ đối xử với bất kỳ sự sắp xếp nào khác.
  • Vui lòng bao gồm một hoặc hai đầu ra ví dụ hoặc bất kỳ cấu trúc thú vị nào bạn muốn chia sẻ. :)
  • Vấn đề này có phần liên quan đến việc tìm một cây bao trùm tối thiểu .

Tôi nên chỉ ra rằng ví dụ "ổn định" trong "Thử thách" không thực sự ổn định theo các tiêu chí đã nêu.
COTO

@COTO Thật vậy. Đã sửa.
Sở thích của Calvin

trong ví dụ của bạn, gạch đáy ở giữa không cần thiết để ổn định cấu trúc.
John Dvorak

@JanDvorak: Nó nói "một cách" để ổn định, không phải "cách tối ưu", vì vậy về mặt kỹ thuật, đó không phải là một lỗi. Nhưng tôi đồng ý rằng việc lấy gạch dưới cùng ra ngoài có thể giúp lái xe về nhà thực tế là trực giác vật lý không phải là bạn của chúng ta trong vấn đề này. ;)
COTO

@JanDvorak COTO đã đúng, không quan trọng là nó không tối ưu, nhưng dù sao tôi cũng đã thay đổi nó.
Sở thích của Calvin

Câu trả lời:


3

Java - 5.056 viên gạch

  • 20x20, 0,03 - 75
  • 15x81, 0,05 - 431
  • 50x50, 0,20 - 882
  • 99x99, 0,01 - 2,567
  • Bàn đạp đồng bằng - 269
  • Nhà đơn giản - 129
  • Tháp Criss-Cross - 323
  • Cầu bắt đầu - 380

Mã nguồn có thể xem được ở đây .

Mã này chạy trong vài mili giây cho bất kỳ 8 đầu vào ghi điểm nào. Có một số đầu ra tối ưu đáng chú ý, đặc biệt là trong các tháp chéo và 99x99 trường hợp. Tôi có một vài ý tưởng về cách cải thiện thói quen, nhưng nó khá cồng kềnh, và do đó tôi sẽ để nó một mình cho đến bây giờ.

Các kết quả đầu ra tàn sát các định luật vật lý đến mức hài. : D

Một số mẫu được hiển thị dưới đây.

Đầu ra 20x20, 0,03

................................................................................
..........[XX]..................................................................
........[  ][  ]................................................................
..........[  ]..................................................................
............[  ]................................................................
..........[  ]..................................................................
............[  ]....................[XX]........................................
..........[  ]....................[  ][  ]......................................
....[XX]....[  ]....................[  ]........................................
..[  ][  ][  ][  ]................[  ]..........................................
....[XX]....[  ][XX]................[  ]........................................
..[  ]........[  ]................[XX]..........................................
....[  ]........[  ]............[  ][  ]........................................
..[  ]........[  ]................[  ]..........................................
....[  ]........[  ]............[XX]................................[XX]........
..[  ]........[  ]....[XX]........[  ]................[XX]........[  ][XX][  ]..
....[  ]........[  ][  ][  ]....[  ]....[XX]........[  ][  ]........[  ][  ][XX]
..[  ][  ]....[  ]....[  ]........[XX][  ][  ]........[  ]........[  ]....[  ]..
....[  ]........[  ]....[  ]....[  ]....[  ]............[  ]........[  ]....[  ]
......[XX]....[  ]....[  ]........[  ][  ]............[  ]........[  ]....[  ]..
....[  ]........[  ]....[  ]....[  ]....[  ]....[XX]....[  ]........[  ]....[  ]

Nhà đầu ra đơn giản

................................................................................
................................................................................
................................................................................
......................................[XX]......................................
....................................[XX][XX]....................................
..................................[XX][  ][XX]..................................
................................[XX][  ][  ][XX]................................
..............................[XX][  ]....[  ][XX]..............................
............................[XX][  ]........[  ][XX]............................
..........................[XX][  ]............[  ][XX]..........................
........................[XX][  ]................[  ][XX]........................
......................[XX][  ]....................[  ][XX]......................
....................[XX][  ]........................[  ][XX]....................
..................[XX][  ]............................[  ][XX]..................
................[XX][  ]................................[  ][XX]................
..............[XX][  ]....................................[  ][XX]..............
............[XX][  ]........................................[  ][XX]............
..........[XX][  ]............................................[  ][XX]..........
........[XX][  ]................................................[  ][XX]........
......[XX][  ]................................................[  ][  ][XX]......
....[XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX]....
......[XX][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]........[XX]....
......[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]........[XX]....
......[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ]........[XX]....
......[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ][  ][  ]....[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ][  ][  ]........[XX]....
......[XX]....[XX][XX][XX][XX][  ]....[XX][XX][XX][XX][XX][XX]........[XX]......
....[XX]....[  ]....[  ]....[  ]....[  ]....[  ]....[  ][  ]............[XX]....
......[XX]....[XX]....[  ][XX]........[XX]....[  ]....[  ][XX]........[XX]......
....[XX]....[  ]....[  ][  ][  ]....[  ]....[  ]........[  ]............[XX]....
......[XX]....[XX]....[  ][XX]........[XX]....[  ]........[XX]........[XX]......
....[XX]....[  ]........[XX]........[  ]....[  ]........[  ]............[XX]....
......[XX]....[XX]........[XX]........[XX][XX][XX][XX][XX][XX]........[XX]......
....[XX]....[  ]........[  ]........[  ]....[  ][  ][  ][  ]............[XX]....
......[XX]....[XX]........[XX]........[  ]....[  ]....[  ]............[XX]......
....[XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX]....

2

Con trăn, 18992

Đây là giải pháp đơn giản nhất và điểm số tồi tệ nhất có thể. Nó chỉ để tham khảo; điều để đánh bại. Nó lấp đầy mọi không gian trống trừ hai góc trên cùng bằng gạch, đảm bảo sự ổn định.

s = '''
....[__]....[__]....
..[__]....[__]......
[__]............[__]
'''

def brickify(structure):
    structure = filter(lambda x: x, s.replace('__', 'XX').split('\n'))
    if not structure:
        return '', 0
    if len(structure) > 1 and len(structure) % 2:
        structure[0] = '----' + structure[0][4:-4] + '----'
    added = 0
    offset = False
    for i in range(len(structure)-1,-1,-1):
        line = structure[i]
        if offset:
            line = line[2:-2]
        added += line.count('....')
        line = line.replace('....', '[__]')
        if offset:
            line = '..' + line + '..'
        structure[i] = line
        offset = not offset
    structure[0] = structure[0].replace('----', '....')
    return structure, added

s, a = brickify(s)

#print '\nNew bricks:', a

for line in s:
    print line

Để sử dụng sao chép cấu trúc ban đầu vào dấu ngoặc kép ở đầu chương trình.

Ở đây, nó được chạy trên ngôi nhà, thêm 609 viên gạch:

..[__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][__][__][__][XX][__][__][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][__][__][XX][XX][__][__][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][__][__][XX][__][XX][__][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][__][XX][__][__][XX][__][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][__][XX][__][__][__][XX][__][__][__][__][__][__][__]..
[__][__][__][__][__][__][__][XX][__][__][__][__][XX][__][__][__][__][__][__][__]
..[__][__][__][__][__][__][XX][__][__][__][__][__][XX][__][__][__][__][__][__]..
[__][__][__][__][__][__][XX][__][__][__][__][__][__][XX][__][__][__][__][__][__]
..[__][__][__][__][__][XX][__][__][__][__][__][__][__][XX][__][__][__][__][__]..
[__][__][__][__][__][XX][__][__][__][__][__][__][__][__][XX][__][__][__][__][__]
..[__][__][__][__][XX][__][__][__][__][__][__][__][__][__][XX][__][__][__][__]..
[__][__][__][__][XX][__][__][__][__][__][__][__][__][__][__][XX][__][__][__][__]
..[__][__][__][XX][__][__][__][__][__][__][__][__][__][__][__][XX][__][__][__]..
[__][__][__][XX][__][__][__][__][__][__][__][__][__][__][__][__][XX][__][__][__]
..[__][__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__][__]..
[__][__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][XX][XX][XX][__][__][XX][XX][XX][XX][XX][XX][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][XX][__][__][__][__][XX][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][XX][__][__][__][__][XX][__][__][XX][__]..
[__][XX][__][__][__][__][XX][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][XX][XX][XX][XX][XX][XX][__][__][XX][__]..
[__][XX][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][__][XX][__]
..[__][XX][__][XX][__][__][XX][__][__][__][__][__][__][__][__][__][__][XX][__]..
[__][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][XX][__]

Số lượng gạch mà nó thêm vào cho mỗi trong số 8 cấu trúc được xác định trước theo thứ tự là

374 1107 2041 9627 506 609 1088 3640 (sum to 18992)

Dòng 20, gạch 19 bị thiếu một khung bên trái.
golfer9338

@ golfer9338 Cảm ơn bạn đã chú ý. Đã sửa trong bài và jsfiddle.
Sở thích của Calvin

Không làm cho nó quá thông minh, nhưng bạn có cần thêm bất kỳ viên gạch nào vào hàng trên cùng không?
Sparr

@Sparr Không bạn không. Nhưng điều này nhằm đưa ra điểm số tồi tệ nhất có thể giống như một cuộc biểu tình.
Sở thích của Calvin
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.