Когда учеников впервые учат доказательной технике математической индукции , типичным примером является проблема мозаики 2 N × 2. наложения сетки N на L-образные тромино , оставляя одно заданное пространство сетки пустым. (N - некоторое неотрицательное целое число.)
Я оставлю это вам, чтобы просмотреть доказательства, если вы еще этого не знаете. Есть много ресурсов, которые обсуждают это.
Ваша задача здесь состоит в том, чтобы написать программу, которая принимает значение для N, а также координаты пространства сетки, чтобы оставить пустым, и печатает ASCII-представление результирующей мозаики Tromino.
Персонаж O
заполнит пустое пространство, и 4 поворота нашего тромино будут выглядеть так:
|
+-
|
-+
-+
|
+-
|
(Да, это может быть неоднозначно, что +
идет с какой -
и |
для определенных договоренностей, но это нормально.)
Ваша программа должна работать при N = 0 (для сетки 1 × 1), по крайней мере, до N = 8 (для сетки 256 × 256). Будут даны значения x и y, которые являются координатами для O
:
- х горизонтальная ось. x = 1 - левый край сетки, x = 2 N - правый край сетки.
- у вертикальная ось. y = 1 - верхний край сетки, y = 2 N - нижний край сетки.
И x, и y всегда находятся в диапазоне [1, 2 N ].
Таким образом, для заданных N, x и y ваша программа должна вывести 2 N × 2 N сетку , полностью покрытую L-образными тромино, за исключением координаты сетки x, y, которая будет являться 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 целых числа вместо написания всей программы. Он должен напечатать или вернуть строку сетки.
- Возьмите ввод из стандартного ввода, командной строки (или аргументов функции, если вы пишете функцию).
- Выходные данные могут дополнительно содержать один обучающий перевод строки.
- Вы не обязаны использовать метод листов, который обычно предлагает доказательство. Имеет значение только то, что сетка заполнена L-образными тромино, кроме
O
. (Тромино нельзя разрезать или выходить за границы сетки.)
Самый короткий код в байтах побеждает. Tiebreaker - более ранний пост. ( Удобный счетчик байтов. )
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
потому, что ненулевые значения являются правдой.