Коли учнів вперше навчають про доказову техніку математичної індукції , поширеним прикладом є проблема обв’язки сітки 2 N × 2 N Ґ -подібними тром’янами , залишаючи порожнім один заздалегідь заданий простір. (N - деяке невід’ємне ціле число.)
Я залишу вас перейти доказ, якщо ви цього ще не знаєте. Є багато ресурсів, які обговорюють це.
Ваше завдання тут - написати програму, яка приймає значення для N, а також координати простору сітки, щоб залишити порожнім, і роздруковує ASCII-представлення отриманої сітки з плиткою tromino.
Персонаж O
заповнить порожній простір, і 4 обертання нашого тромiно виглядатимуть так:
|
+-
|
-+
-+
|
+-
|
(Так, це може бути неоднозначно, +
з чим -
і |
для певних домовленостей, але це нормально.)
Ваша програма повинна працювати для N = 0 (для сітки 1 × 1) до щонайменше N = 8 (для сітки 256 × 256). Даються значення x і y, які є координатами для O
:
- x - горизонтальна вісь. x = 1 - лівий край сітки, x = 2 N - правий край сітки.
- y - вертикальна вісь. y = 1 - верхній край сітки, y = 2 N - нижній край сітки.
І x, і y завжди знаходяться в діапазоні [1, 2 N ].
Отже, для заданих N, x і y ваша програма повинна надрукувати сітку 2 N × 2 N , повністю покриту плиткою у формі L, за винятком координат сітки x, y, яка буде an O
.
Приклади
Якщо N = 0, то обидва x і y повинні бути 1. Вихід є простим
O
Якщо N = 1, x = 1, а y = 2, то виведенням буде
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (наприклад, зображення на цій сторінці ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Деталі
- Ви можете записати функцію, яка приймає 3 цілих числа, а не писати всю програму. Він повинен надрукувати або повернути рядок сітки.
- Візьміть введення з stdin, командного рядка (або аргументів функції, якщо ви пишете функцію).
- Вихідний варіант може додатково містити один навчальний новий рядок.
- Вам не потрібно використовувати метод плитки, який зазвичай пропонує доказ. Має значення лише те, що сітка заповнена L-подібними тром’янами, крім
O
. (Trominoes може не різатися або виходити за межі сітки.)
Виграє найкоротший код у байтах. Tierereaker - це раніше повідомлення. ( Зручний лічильник байтів. )
if p!=i
; список всередині.join()
не потрібен[]
;(1-i%2)
можна зробити як~i%2
; ви можете використовувати ітерабельний розпакування, щоб записатиt,l,a=[],...
як*t,l,a=...
;if n==0
може бути перевірено якif n<1
тому, щоn
не може бути негативним; остаточне"\n".join
може бути зроблено шляхом друку кожного елемента, оскільки загальні правила дозволяють друкувати замість повернення;if p!=i
може бутиif p-i
тому, що ненульові значення - Truthy.