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 và
.
.
.
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:
- Bất kỳ gạch trên mặt đất (dòng gạch thấp nhất) là ổn định.
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
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ế.) Width
Là số lượng gạch trên lớp cơ sở, Height
là số lượng các lớp gạch và Density
là 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.6
mộ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 = 1
và 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 [__]
và .
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 .