Kiedy uczniowie najpierw uczy o lustrzanym techniki indukcji , typowym przykładem jest problem płytki do 2 N x 2 N siatkę o kształcie litery L trominoes , pozostawiając jedną określoną przestrzeń siatki pusty. (N jest jakąś nieujemną liczbą całkowitą).
Pozostawiam tobie przejrzenie dowodu, jeśli jeszcze go nie znasz. Istnieje wiele zasobów, które to omawiają.
Twoim zadaniem tutaj jest napisanie programu, który przyjmuje wartość N, a także współrzędne przestrzeni siatki, aby pozostawić puste, i drukuje reprezentację ASCII wynikowej siatki kafelkowej Tromino.
Postać O
wypełni puste miejsce, a 4 obroty naszego tromino będą wyglądały następująco:
|
+-
|
-+
-+
|
+-
|
(Tak, to może być dwuznaczne, +
z którym -
i |
dla niektórych uzgodnień, ale to jest ok.)
Twój program musi działać dla N = 0 (dla siatki 1 × 1) do co najmniej N = 8 (dla siatki 256 × 256). Otrzymają wartości xiy, które są współrzędnymi dla O
:
- x jest osią poziomą. x = 1 to lewa krawędź siatki, x = 2 N to prawa krawędź siatki.
- y jest osią pionową. y = 1 to górna krawędź siatki, y = 2 N to dolna krawędź siatki.
Zarówno xiy są zawsze w zakresie [1, 2 N ].
Tak więc dla danego N, x i y twój program musi wydrukować siatkę 2 N × 2 N , wyłożoną kafelkami całkowicie za pomocą puzonów w kształcie litery L, z wyjątkiem współrzędnej siatki x, y, która będzie O
.
Przykłady
Jeśli N = 0, wówczas xiy muszą być równe 1. Wynik jest prosty
O
Jeśli N = 1, x = 1, ay = 2, wynikiem będzie
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (np. Obraz na tej stronie ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Detale
- Możesz napisać funkcję, która przyjmuje 3 liczby całkowite zamiast pisać cały program. Powinien wydrukować lub zwrócić ciąg siatki.
- Weź dane wejściowe ze stdin, wiersza poleceń (lub argumentów funkcji, jeśli piszesz funkcję).
- Dane wyjściowe mogą opcjonalnie zawierać jeden nowy wiersz szkolenia.
- Nie jest wymagane stosowanie metody układania płytek, którą zwykle sugeruje dowód. Ważne jest tylko to, że siatka jest wypełniona puzonami w kształcie litery L oprócz
O
. (Puzonów nie można wycinać ani wychodzić poza granice siatki).
Najkrótszy kod w bajtach wygrywa. Tiebreaker jest wcześniejszym postem. ( Poręczny licznik bajtów. )
if p!=i
; lista w środku.join()
nie potrzebuje[]
;(1-i%2)
można to zrobić jako~i%2
; możesz użyć iterowalnego rozpakowywania do pisaniat,l,a=[],...
jako*t,l,a=...
;if n==0
można zaznaczyć jako,if n<1
ponieważn
nie może być ujemny; finału"\n".join
można prawdopodobnie dokonać poprzez wydrukowanie każdego elementu, ponieważ ogólne zasady zezwalają na drukowanie zamiast zwrotu;if p!=i
może być,if p-i
ponieważ niezerowe wartości są prawdziwe.