Nhiệm vụ này là một phần của Câu đố đẩy lập trình Premier định kỳ đầu tiên .
Bạn nhận được một hệ thống phân cấp của các mục theo định dạng sau:
2
Hat
1
Gloves
cần phải được đặt trong hộp, như vậy:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
Trong định dạng đầu vào, các số bắt đầu một hộp có nhiều mục như số chỉ định. Hộp thứ nhất có hai vật phẩm trong đó (Mũ và hộp chứa Găng tay), hộp thứ hai chỉ chứa một vật phẩm duy nhất - găng tay.
Có thể thấy, hộp cũng có thể sống trong hộp. Và chúng luôn được làm tròn ... loại (góc nhọn là mối nguy hiểm và chúng tôi không muốn điều đó).
Dưới đây là các chi tiết khó chịu cho những người muốn sử dụng từng chút thời gian mà thông số kỹ thuật đưa ra. Tâm trí bạn, không đọc thông số kỹ thuật là không có lý do để gửi giải pháp sai. Có một kịch bản thử nghiệm và một vài trường hợp thử nghiệm ở cuối.
Đặc điểm kỹ thuật
Hộp được xây dựng từ các nhân vật sau:
|
(U + 007C) được sử dụng để xây dựng các cạnh dọc.-
(U + 002D) được sử dụng để xây dựng các cạnh ngang.'
(U + 0027) là các góc dưới tròn..
(U + 002E) là các góc trên tròn.
Do đó, một hộp trông như thế này:
.--. | | '--'
Lưu ý rằng mặc dù Unicode cũng có các góc tròn và các ký tự vẽ hộp thích hợp, nhưng tác vụ này chỉ ở dạng ASCII. Nhiều như tôi yêu thích Unicode Tôi nhận ra rằng có những ngôn ngữ và môi trường ngoài kia không hoàn toàn xuất hiện trong thập kỷ thứ hai đến thập kỷ trước.
Các hộp có thể chứa một chuỗi các mục là văn bản hoặc các mục khác. Các mục riêng lẻ trong một hộp được hiển thị từ trên xuống dưới. Trình tự A, B, C do đó biểu hiện như sau:
.---. | A | | B | | C | '---'
Điều này tất nhiên áp dụng cho các hộp lồng nhau, đó là một mục giống như văn bản. Vì vậy, chuỗi A, B, Box (C, Box (D, E)), F sẽ hiển thị như sau:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
Các hộp điều chỉnh kích thước của chúng theo nội dung và các hộp lồng nhau luôn mở rộng theo kích thước của bố mẹ chúng. Luôn có một khoảng trắng trước và sau nội dung, sao cho cả hộp văn bản và hộp lồng nhau quá gần với cạnh của hộp bên ngoài. Nói tóm lại, những điều sau là sai:
.---. |Box| '---'
Và sau đây là chính xác:
.-----. | Box | '-----'
Trông cũng đẹp hơn nhiều :-)
Các mục văn bản (xem Đầu vào bên dưới) phải được sao chép chính xác.
Luôn có một hộp cấp cao nhất (xem XML). Tuy nhiên, một hộp có thể chứa một số hộp khác.
Đầu vào
Đầu vào được đưa ra trên đầu vào tiêu chuẩn; để kiểm tra dễ dàng hơn có khả năng chuyển hướng từ một tập tin.
Đầu vào được đưa ra theo dòng, với mỗi dòng đại diện cho một mục văn bản để đặt vào hộp hiện tại hoặc mở một hộp mới.
Mỗi dòng được kết thúc bởi một ngắt dòng.
Các mục văn bản được đánh dấu bằng một dòng không bao gồm một số (xem bên dưới). Văn bản sử dụng các ký tự chữ cái, dấu cách và dấu chấm câu (
.,-'"?!()
). Văn bản sẽ không bắt đầu hoặc kết thúc bằng một khoảng trắng và nó sẽ luôn có ít nhất một ký tự.Một hộp bắt đầu với một dòng duy nhất có một số trong đó. Con số cho biết kích thước của hộp, tức là số lượng vật phẩm sau đây được đặt vào nó:
2 A B
mang lại một hộp có hai mục văn bản:
.---. | A | | B | '---'
Một hộp sẽ luôn chứa ít nhất một mục.
Phần cuối của hộp không được đánh dấu rõ ràng bằng một dòng; thay vào đó các hộp được đóng hoàn toàn sau khi số lượng vật phẩm quy định được đưa vào chúng.
Một hộp luôn chỉ là một vật phẩm duy nhất, bất kể có bao nhiêu vật phẩm trong đó. Ví dụ
3 A 4 a b c d B
sẽ mang lại một hộp có ba vật phẩm, thứ hai là một hộp khác có bốn vật phẩm.
Nesting cũng không ảnh hưởng đến thực tế là một hộp chỉ là một mục duy nhất.
Hạn mức
Mức lồng tối đa là năm . Tức là có nhiều nhất năm hộp bên trong nhau. Điều này bao gồm một ngoài cùng.
Có tối đa mười mặt hàng mỗi hộp.
Các mục văn bản có độ dài tối đa 100 ký tự.
Đầu ra
- Đầu ra là hộp kết xuất bao gồm tất cả các mục chứa và lồng nhau theo các quy tắc được nêu ở trên.
- Đầu ra phải được đưa ra trên đầu ra tiêu chuẩn và nó phải khớp chính xác. Không có khoảng trắng hàng đầu hoặc dấu được cho phép.
- Mỗi dòng phải được kết thúc bằng một ngắt dòng, bao gồm cả dòng cuối cùng.
Điều kiện chiến thắng
- Mã ngắn nhất sẽ thắng (tức là nhận được câu trả lời được chấp nhận).
Mẫu đầu vào 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Sản lượng mẫu 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Mẫu đầu vào 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Sản lượng mẫu 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Mẫu đầu vào 3
1
1
1
1
1
Extreme nesting Part Two
Sản lượng mẫu 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Mẫu đầu vào 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Sản lượng mẫu 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Kiểm tra tập lệnh
Vì việc cung cấp thông tin chi tiết có thể rất khó khăn, đôi khi chúng tôi ( Ventero và tôi) đã chuẩn bị một kịch bản thử nghiệm, bạn có thể chạy giải pháp của mình để kiểm tra xem nó có đúng không. Nó có sẵn ở cả tập lệnh PowerShell và tập lệnh bash . Cầu nguyện là : <test-script> <program invocation>
.
CẬP NHẬT: Các kịch bản thử nghiệm đã được cập nhật; có một số trường hợp thử nghiệm không tôn trọng các giới hạn tôi đã xác định. Tập lệnh kiểm tra PowerShell không sử dụng so sánh phân biệt chữ hoa chữ thường để kiểm tra kết quả. Tôi hy vọng mọi thứ đều ổn bây giờ. Số lượng các trường hợp thử nghiệm đã giảm xuống còn 156, mặc dù trường hợp cuối cùng bây giờ khá ... lớn.
CẬP NHẬT 2: Tôi đã tải lên trình tạo trường hợp thử nghiệm của mình . Được viết bằng C # , nhắm mục tiêu thời gian chạy .NET 2. Nó chạy trên Mono. Nó có thể giúp mọi người kiểm tra việc thực hiện của họ. Như một trường hợp xấu nhất chắc chắn đưa ra các giới hạn trong nhiệm vụ bạn có thể thử:
nb.exe 1 10 10 5 100 100 | my invocation
sẽ chỉ tạo các hộp cho đến mức trong cùng và sử dụng cả số lượng mục tối đa trên mỗi hộp và độ dài tối đa của các mục văn bản. Mặc dù vậy, tôi đã không đưa trường hợp thử nghiệm này vào tập lệnh thử nghiệm, vì nó khá lớn và sản lượng thậm chí còn lớn hơn.
CẬP NHẬT 3: Tôi đã cập nhật tập lệnh kiểm tra PowerShell có xu hướng bị lỗi tùy thuộc vào cách kết thúc dòng trong tập lệnh và dòng kết thúc giải pháp được in. Bây giờ nó nên là bất khả tri cho cả hai. Xin lỗi lần nữa vì sự nhầm lẫn.