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.f
jest to funkcja rekurencyjna. Właściwie muszę przywrócić formatowanie wyjściowesplit()
po każdym samodzielnym wywołaniu.A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D)))
,t+=[...]
w drugim przedostatnim wierszu można zapisać jakot+=...,
(dodanie krotki zamiast listy) i nie jestem pewien, czy ten działa, aleA if B else C
może być zapisany jakoB and A or C
(również w drugi-ostatni wiersz), ale tylko wtedy, gdy A nigdy nie jest fałszem (co chyba nie jest?)JavaScript (ES6) 317
414Dużo pracy w golfa, ale wciąż dość długo.
Uruchom snippet, aby przetestować (lepiej wyglądać przy użyciu znaków blokowych Unicode - ale nawet nieco dłużej)
Pokaż fragment kodu
źródło
IDL 8.3+, 293 bajty
To za długo, staram się to ograniczyć, ale jeszcze tam nie dotarłem.
Wyjścia:
I ... tylko dla zabawy ...
źródło
Ruby Rev 1, 288
Jako anonimowy dosłowny lambda. Pokazane w programie testowym (literał lambda to
->(n,a,b){...}
)Ruby Rev 0, 330 bez golfa
Obecnie jedyne, o co twierdzę, to eliminacja komentarzy, niepotrzebnych nowych linii i wcięć.
To jest mój pierwszy właściwy algorytm zakodowany w Rubim i to była ciężka praca. Jestem pewien, że jest co najmniej 50 znaków, których można wyeliminować, ale na razie zrobiłem wystarczająco dużo. Istnieją prawdziwe horrory, na przykład wejście. Prawdopodobnie można to naprawić za pomocą funkcji lub lambda zamiast programu, ale funkcja wewnętrzna,
t
która rysuje puzony, nadal potrzebuje dostępu do zmiennych globalnych. Muszę do tego wymyślić składnię.Cechą mojej odpowiedzi, której nie ma w innych, jest to, że inicjuję tablicę ciągów
|
znaków. Oznacza to, że muszę tylko narysować+-
lub-+
, które są obok siebie na tej samej linii.źródło
Haskell, 170 bajtów
Uruchom online w Ideone
Przykładowy przebieg:
źródło