Khi học sinh lần đầu tiên được dạy về kỹ thuật chứng minh cảm ứng toán học , một ví dụ phổ biến là vấn đề ốp lưới 2 N × 2 N với các hình tam giác hình chữ L , để trống một không gian lưới được xác định trước. (N là một số nguyên không âm.)
Tôi sẽ để lại cho bạn để đi qua bằng chứng nếu bạn chưa biết điều đó. Có nhiều tài nguyên thảo luận về nó.
Nhiệm vụ của bạn ở đây là viết một chương trình lấy giá trị cho N, cũng như tọa độ của không gian lưới để trống và in một biểu diễn ASCII của lưới lát tromino kết quả.
Nhân vật O
sẽ lấp đầy khoảng trống và 4 vòng quay của tromino của chúng ta sẽ trông như thế này:
|
+-
|
-+
-+
|
+-
|
(Vâng, nó có thể mơ hồ +
đi theo đó -
và |
cho một số sắp xếp nhất định, nhưng điều đó ổn.)
Chương trình của bạn phải hoạt động cho N = 0 (đối với lưới 1 × 1) tối đa N = 8 (đối với lưới 256 × 256). Nó sẽ được đưa ra các giá trị x và y là tọa độ cho O
:
- x là trục hoành. x = 1 là cạnh lưới bên trái, x = 2 N là cạnh lưới bên phải.
- y là trục tung. y = 1 là cạnh lưới trên cùng, y = 2 N là cạnh lưới dưới cùng.
Cả x và y luôn nằm trong phạm vi [1, 2 N ].
Vì vậy, đối với N, x và y đã cho, chương trình của bạn phải in lưới 2 N × 2 N , được lát hoàn toàn bằng các hình tam giác hình chữ L, ngoại trừ tọa độ lưới x, y sẽ là một O
.
Ví dụ
Nếu N = 0, thì x và y đều phải là 1. Đầu ra đơn giản là
O
Nếu N = 1, x = 1 và y = 2, đầu ra sẽ là
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (ví dụ: hình ảnh trên trang này ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Chi tiết
- Bạn có thể viết một hàm lấy 3 số nguyên thay vì viết toàn bộ chương trình. Nó sẽ in hoặc trả về chuỗi lưới.
- Lấy đầu vào từ stdin, dòng lệnh, (hoặc hàm args nếu bạn viết hàm).
- Đầu ra có thể tùy chọn chứa một dòng mới đào tạo.
- Bạn không bắt buộc phải sử dụng phương pháp ốp lát mà bằng chứng thường gợi ý. Chỉ có vấn đề là lưới được lấp đầy bằng các hình tam giác hình chữ L bên cạnh
O
. (Trominoes có thể không bị cắt hoặc đi ra khỏi giới hạn lưới.)
Mã ngắn nhất tính bằng byte thắng. Tiebreaker là bài trước. ( Bộ đếm byte tiện dụng. )
if p!=i
; danh sách bên trong.join()
không cần[]
;(1-i%2)
có thể được thực hiện như~i%2
; bạn có thể sử dụng giải nén lặp để viếtt,l,a=[],...
như*t,l,a=...
;if n==0
có thể được kiểm traif n<1
vìn
không thể âm tính; cuối cùng"\n".join
có thể được thực hiện bằng cách in từng phần tử, vì các quy tắc chung cho phép in thay cho trả lại;if p!=i
có thểif p-i
bởi vì các giá trị khác không là Truthy.