Gawędziłem z nieskończonymi sieciami rezystorów (długa historia), kiedy natknąłem się na następujący interesujący wzorzec rekurencyjny:
|-||
|---
Każde wystąpienie tego wzoru jest dwa razy szersze niż wysokie. Aby przejść z jednego poziomu wzoru na następny, należy rozbić ten prostokąt na dwa podbloki (z których każdy jest kwadratem NxN):
AB =
|-||
|---
so A =
|-
|-
and B =
||
--
Połówki te są następnie powielane i układane zgodnie z następującym wzorem:
ABAA
ABBB
giving
|-|||-|-
|---|-|-
|-||||||
|-------
Wyzwanie
Napisz program / funkcję, która przy danej liczbie N
wyświetli N
iterację tego rekurencyjnego projektu. To jest golf.
Format we / wy jest względnie łagodny: możesz zwrócić pojedynczy ciąg, listę ciągów, tablicę znaków 2D itp. Dozwolona jest dowolna końcowa spacja. Możesz także użyć indeksowania 0 lub 1.
Przykłady
Pierwsze kilka iteracji wzoru jest następujące:
N = 0
|-
N = 1
|-||
|---
N = 2
|-|||-|-
|---|-|-
|-||||||
|-------
N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------
N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------
Zastanawiam się, czy istnieje jakiś krótki algebraiczny sposób obliczenia tej struktury.
f(n,x,y)
która może bezpośrednio obliczyć, czy dana współrzędna powinna zawierać-
lub|
. Może to obejmować operacje modulo lub operacje bitowe. Techniki, które do tej pory widziałem, obejmują wycinanie / łączenie tablic, jak pokazano w specyfikacji.f(x,y)
działa również, ponieważ jeślix,y
jest poprawny, wynik nie zależy odn
|-
?Odpowiedzi:
APL (Dyalog Classic) ,
2925 bajtówWypróbuj online!
⍳2
jest wektorem0 1
⍪
zamienia to w macierz 2x1⍉
transponuje go, więc staje się 1x2⎕
oceniane wejście{
}⍣⎕
zastosuj funkcję wiele razy⍪⍨⍵
połącz argument na wierzchu - macierz 2x2a←
pamiętaj jaka
~
negować⍉
transponować⌽
odwrócić w poziomie⊖
odwrócić w pioniea,
konkatenuj za
po lewej stronie'|-'[
]
użyj macierzy jako wskaźników w ciągu'|-'
, tzn. zamień 0 na|
1 na-
źródło
JavaScript (Node.js) ,
130...1069492 bajtyGrałem w golfa z mojej alternatywnej metody i ustalania znaków, -14 bajtów Dzięki @Shaggy
Wypróbuj online!
Moje oryginalne podejście (
106102 bajtów)-4 bajty Dzięki @ShaggyWypróbuj online!
Wyjaśnienie i nieprzygotowany:
Moja oryginalna metoda alternatywna, jeśli
"|"->"2", "-"->"1"
jest dozwolona,105104 bajtów:Wypróbuj online!
Właśnie wymyśliłem jakąś metodę algebraiczną dotyczącą tego problemu.
Wypróbuj online!
(wreszcie funkcja o długości porównywalnej z moją pierwotną odpowiedzią)
f(n, x, y)
oblicza typ bloku w bloku (x, y) przyn
iteracji następującego podstawienia:skąd
0 = "|-", 1 = "||", 2 = "--"
, począwszy odf(0, 0, 0) = 0
.Następnie
g(x)(y)
oblicza symbol w (x, y) oryginalnego wzoru.źródło
Stax ,
241715 bajtówUruchom i debuguj
Oto reprezentacja ascii tego samego programu.
Podstawową ideą jest rozpoczęcie od siatki 0 generacji, a następnie powtórzenie bloku, który rozszerza siatkę.
źródło
Płótno ,
1716 bajtówWypróbuj tutaj!
Objaśnienie, pokazując stos dla danych wejściowych 1:
Zaktualizowano do 16 bajtów, naprawiając błąd, w wyniku którego wartości ustawione dla
α
/ω
do działania nie zostały poprawnie skopiowane (Canvas ma być w pełni niezmienny, ale, niestety, nie był).źródło
Python 2 ,
8877 bajtów-11 bajtów Thansk do Lynn
Wypróbuj online!
źródło
f=lambda x:x<1and['|-']or[n+2*n[i:i+2**x/2]for i in(0,2**x/2)for n in f(x-1)]
Perl 5 , 72 bajtów
Wypróbuj online!
źródło
66
:$.=map{s/.{$.}$/$&$
$/,push@1,$
. $ & X3} @ 1for (@ 1 = "| -") x <>; powiedzmy dla @ 1`Łuska , 17 bajtów
1-indeksowany. Wypróbuj online!
Wyjaśnienie
źródło
Galaretka ,
2119 bajtówWypróbuj online!
Wyjaśnienie:
Początkowo wartość wynosi
⁾|-
, to znaczy["|","-"]
.Ostatni
Ç
podany link ( )[A, B]
powróci.
¡
Wielokrotnie zastosować ostatnie ogniwo (wejście) liczbę razy iZY
formaty to.Objaśnienie ostatniego linku:
źródło
Czysty ,
121106 bajtówWypróbuj online!
źródło
Haskell , 86 bajtów
Wypróbuj online!
Dość proste. Dane wyjściowe to lista ciągów znaków. Bierzemy poprzednią wersję i dzielimy każdą linię na pół, a następnie zbieramy je na dwie nowe listy za pomocą
unzip
. Następnie wystarczy po prostu połączyć tablice we właściwy sposóbźródło
J , 49 bajtów
Niezdarne tłumaczenie rozwiązania APL firmy ngn. Miałem problemy z dorozumieniem - docenię każdą radę.
Wypróbuj online!
źródło
Węgiel drzewny ,
4746 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Aby uzyskać spójną pozycję kursora dla następnej pętli, muszę wydrukować krok 0 w pozycji (-2, -2) i pozostawić kursor w pozycji (-2, 0). (Może to być spowodowane błędem w Charcoal.)
Pętla nad pierwszymi
N
potęgami 2.Wykonaj kopie poprzedniego wydruku z różnymi przesunięciami, w wyniku czego płótno zawiera żądany następny krok w prostokącie.
Przejdź do pozycji tego prostokąta i przytnij płótno.
Alternatywne rozwiązanie, również 46 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Ten krok czasowy 0 musi być wydrukowany w pozycji (2, 0), ale przynajmniej pozycja kursora nie ma znaczenia.
Pętla nad pierwszymi
N
potęgami 2.Wykonaj kopie poprzedniego wydruku z różnymi przesunięciami, w wyniku czego płótno zawiera żądany następny krok w prostokącie.
Przejdź do pozycji tego prostokąta i przytnij płótno.
źródło
R , 126 bajtów
Wypróbuj online!
Zwraca a
matrix
. W linku TIO jest trochę kodu, który pozwala ładnie wydrukować i ułatwić weryfikację.źródło
K (ngn / k) , 25 bajtów
Wypróbuj online!
źródło
Wolfram Language (Mathematica) ,
6765 bajtówWypróbuj online!
Prosta realizacja rekurencji. Zwraca tablicę znaków zawiniętych na liście.
źródło