Fascynuje mnie, jak litery „H” i „I” są bardzo podobne. „H” oznacza poziomy obrys otoczony dwoma pionowymi obrysami; „I” jest pionowym obrysem otoczonym dwoma poziomymi obrysami (w zależności od czcionki). Założę się, że można to zagnieździć ... Wiesz, co mi to przypomina? Fraktale !!!
Zdefiniujmy piramidę „IHIH” w następujący sposób: Pierwszą iteracją jest reprezentacja litery „I” w ASCII:
---
|
---
Następna iteracja ma pionowy skok po obu stronach.
| |
|---|
| | |
|---|
| |
Jeśli widzisz „I” pośrodku jako pojedynczy pociągnięcie poziome, to ta druga iteracja jest w zasadzie „H”. Trzecia iteracja dodaje poziomy obrys na górze i na dole
-------
| |
|---|
| | |
|---|
| |
-------
Ponownie, jeśli widzisz „H” pośrodku jako pojedynczy pionowy skok, to ta iteracja jest w zasadzie „I”. Ten wzór trwa, naprzemiennie między literami „H” i „I” przy każdej iteracji. Dla porównania, oto 6 pierwszych iteracji:
1:
---
|
---
2:
| |
|---|
| | |
|---|
| |
3:
-------
| |
|---|
| | |
|---|
| |
-------
4:
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
5:
-----------
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
-----------
6:
| |
|-----------|
| | | |
| |-------| |
| | | | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | | | | |
| |-------| |
| | | |
|-----------|
| |
Wyzwanie:
Napisz program lub funkcję, która wypisze N -tą iterację piramidy IHIH i opcjonalny znak nowej linii. Twój wkład będzie pojedynczą dodatnią liczbą całkowitą w dowolnym rozsądnym formacie, jaki chcesz. Nie musisz obsługiwać nieprawidłowych danych wejściowych, np. Liczb całkowitych, liczb mniejszych niż 1 itp. Twój program musi co najmniej generować prawidłowe dane wyjściowe dla danych wejściowych do 20. Ponieważ jest to gra w golfa , standardowe luki są niedozwolone i najkrótsza odpowiedź w bajtach wygrywa!
Odpowiedzi:
Pyth ,
50403125 bajtówZestaw testowy.
Wyjaśnienie
Jest to algorytm rekurencyjny.
W każdej iteracji wykonujemy trzy czynności:
"-"
czy"|"
w zależności od liczby iteracji.Po iteracjach wyjścia nieparzyste zostaną transponowane. Dlatego transponujemy je.
źródło
Python,
165145133123 bajtówRozwiązanie rekurencyjne:
Wywoływany za pomocą
print ("\n".join(i(int(sys.argv[1]))))
, gdzie parametrem jest numer iteracji piramidy IHIH.Dzięki @DJMcMayhem za zaoszczędzenie 20 bajtów. Wykorzystanie idei tych sugestii pozwoliło zaoszczędzić kolejne 12 bajtów. Dzięki @Maltysen za sugestie, które skróciły nieco więcej bajtów.
Funkcja ustawia ogranicznik
d
na"|"
i spacje pośrednie na" "
(dla iteracji nieparzystych), zajmuje się powrotem w zdegenerowanym przypadku, a następnie resetuje ogranicznik na" "
i spacje pośrednie"-"
na iteracje o parzystych numerach. Funkcja zwraca listę ciągów znaków dla każdego wiersza IHIH, po osadzeniu wyniku rekurencyjnego wywołania funkcji w odpowiednim miejscu na liście.źródło
if e<1:return'|'
(bez nowej linii między nimi), a następnie usuń „else” i usuń dodatkowe wcięcie.return
. Możesz także łączyć linie bezif
s średnikami i oszczędzać na wcięciachCheddar ,
186177165154148131 bajtówWykorzystuje rekurencję. Dodanie wyjaśnienia po zakończeniu gry w golfa.
Wypróbuj online!
Wyjaśnienie
Ten jest też trochę skomplikowany. Śledź wszystkie zmienne, których używam, ale postaram się to uprościć:
To był problem dla golfa, ale jego 55 bajtów jest krótszych niż oryginalne.
źródło
Python 2, 93 bajty
Dziurawa zakonnica zapisała 7 bajtów.
źródło
int(x/2.)
ponieważ brałem,range(-n,n+1)
ale teraz mogę po prostu z nich korzystać. Dziękuję Ci!Matricks ,
8062 bajtówRozwiązanie iteracyjne (Rekurencja w Matricks jest trudna ...)
Biegnij z
python matricks.py ihih.txt [[]] <input> --asciiprint
Wyjaśnienie:
źródło
JavaScript (ES6),
9290 bajtówRozwiązanie rekurencyjne polega na wykonaniu poprzedniej iteracji, dodaniu
v
znaku na boki, a następnie dodaniuc
znaku do narożników ih
znaku wzdłuż górnej i dolnej krawędzi. Zestaw znaków po prostu zmienia na przemian każdą iterację. Edycja: Zapisano 2 bajty, zwracającv
kiedyn=0
.źródło
Dyalog APL ,
5243 bajtyv h s←'|- '
Przypisuje trzy znaki do trzech nazwisk ( v ertical, h orizontal, s tempo)⊃
pierwszy, tj|
⍪
zrobić w stół 1 × 1{
...}⍣⎕
zdobądź dane wejściowe i zastosuj funkcję stężeń tyle razyv=⊃⍵:
jeśli lewy górny znak argumentu jest pionowy, wówczas:h⍪⍨
poziomy poniżejh⍪
poziomy powyżejs,
spacje po lewej stronie⍵,s
argument ze spacjami po prawej stronie⋄
jeszcze:v,⍨
pionów na prawo odv,
pionów na lewo ods⍪
spacje powyżej⍵⍪s
argument ze spacjami poniżejWypróbuj APL online!
źródło
Brachylog , 84 bajtów
Wypróbuj online!
Port mojej odpowiedzi w Pyth .
źródło
C, 110 bajtów
Wywołaj jako
f(n)
. Dla 111 bajtów mógłbym:tzn.
#define
zapisuje dokładnie jeden bajt.źródło
Dyalog APL, 34 bajty
{
...}⍣⍵⍪'|'
Zastosuj funkcję w nawiasach klamrowych,⍵
zaczynając od macierzy znaków 1x1|
. Wynik każdej aplikacji jest argumentem dla następnej aplikacji.s b←' -|'~⊃⍵
s to spacja, a b to pasek nie w lewym górnym rogu argumentu (' -|'~'-'
usuwa poziomy pasek i pozostawia spację i pionowy pasek)s,⍵,⊃s b
dodaj spację do lewej i prawej (⊃
wybiera s z wektora sb)b,b,⍨⍉
transponuj i dodaj b po lewej i prawej stronieW przypadku liczb nieparzystych pozostawia to transponowany wynik, dlatego wymagana jest ostateczna transpozycja.
⍉⍣⍵
Czas transpozycji⍵
(raz wystarczyłby, ale krótszy do kodowania w ten sposób)TryAPL online
źródło
Cheddar , 107 bajtów
Wypróbuj online!
źródło
Cheddar, 85 bajtów
Moja pierwsza odpowiedź na Cheddar. Wypróbuj online!
Jeśli spróbuję napisać
r=(-n|>n).map(v->abs v).map
,r(y->r(x->…))
interpreter ulega awarii. ; -;źródło
v->abs v
w(abs)
(EGr.map((abs))
), która zwróci funkcję, która ma zachowanie funkcji abs. np.(+)(1,2)
->3
.(^)(2,6)
-> 64. Też wielkie wow na obgryzanie mnie o prawie 50%Runtime Error: `abs` has no behavior for types `Number` and `Number`
(ponieważmap
prawdopodobnie odbiera zarówno element, jak i jego indeks).APL (Dyalog Classic) , 34 bajty
Wypróbuj online!
(używa
⎕io←1
)⍳⎕
jest1 2 ... N
(⌽,0,⊢)
to pociąg, który zamienia go w-N ... -1 0 1 ... N
∘.( )⍨
wykonuje nawiasy dla każdej pary współrzędnych⍺ ⍵
pociąg
(≤-(1+=)×2|⌈)
lub jego równoważnik dfn{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}
wytwarza macierz taką jak:'- |'[2+ ]
wprowadza te poprawne indeksy⎕IO=1
i wybiera odpowiednie znakiźródło
Ruby,
817877 bajtówJest to oparte na odpowiedzi Lynna na Python . Sugestie dotyczące gry w golfa mile widziane.
Edycja: 3 bajty dzięki Lynn. Korekty i gra w golfa 1 bajt dzięki Jordanowi.
Ungolfing:
źródło
.map(&:abs)
?*
nic nie robi. Możesz użyć*""
zamiast.join
. Ponadto użyciep
otacza każdą linię znakami cudzysłowu (wywołujeinspect
argumenty), co może cię zdyskwalifikować.&:abs
(map &:abs
). Możesz być w stanie coś zrobićArray#product
zamiast zagnieżdżonychmap
s, ale utrudni to łamanie linii.r.product(r).map
(jakkolwiek to działa) jest dłuższe i nie pozwala na łatwe łamanie linii.MATLAB,
168163 bajtówPrawdopodobnie nie jest to najmądrzejszy sposób: Rozwijanie łańcucha ze wszystkich stron w
n
krokach:Użycie: Zapisz jako
g.m
(czy muszę to dodać do liczby bajtów?) I wywołać npg(15)
.Nie golfowany:
źródło
' '
przez0
(Matlab traktuje znak 0 jako spację) i'-'
przez45
. Nazwa pliku nie musi być uwzględniana w liczbie bajtówFaktycznie ,
484544 bajtówTo jest próba przeniesienia mojej Ruby odpowiedź na Właściwie. To zdecydowanie za długo i sugestie dotyczące gry w golfa są bardzo mile widziane. Wypróbuj online!
Oto 46-bajtowa wersja, która oddziela zagnieżdżone funkcje, dzięki czemu możemy zdefiniować
"| -"
mniej bajtów. Wypróbuj online!Ungolfing:
Pierwszy algorytm
Drugi algorytm
źródło
u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M
jest dłuższy niż obecnie (o 2 bajty), ale możesz znaleźć inspirację dla sposobów skrócenia tego, czego nie widzę.Płótno ,
19181714 bajtówWypróbuj tutaj!
Gdyby mi wolno było wypisywać co drugie wyjście obrócone o 90 °, ostatnie 4 znaki mogłyby zostać usunięte.
Objaśnienie (niektóre znaki zostały zmienione na ~ monospace):
źródło
05AB1E ,
2928 bajtówWypróbuj online!
-1 dzięki Dzaima ...
To jest iteracyjne rozwiązanie.
Zasadniczo Dokonuje się tego poprzez utworzenie następującego wzorca:
Następnie parami, transponując każdy element razem i dodając wypełnienie.
Po transpozycji po każdej iteracji powstaje pojedynczy róg wzoru.
Następnie możemy użyć poleceń odbicia 05AB1E.
źródło
Mathematica,
158164 bajtówOblicza matematycznie poprawny symbol na współrzędnych (i, j), gdzie oba biegną od -n do n. Człowiek sformatowany:
źródło
PHP, 166 bajtów
grałem w golfa ponad 100 bajtów po pierwszym podejściu i wciąż jest to najdłuższa odpowiedź tutaj.
awaria
bez golfa
źródło
Perl 5 , 150 bajtów
Wypróbuj online!
źródło
Haskell , 110 bajtów
Wypróbuj online!
Wyjaśnienie / Niegolfowany
Funkcja pomocnika
g
pobiera znak i listę ciągów, a następnie poprzedza i dołącza ten znak do każdego ciągu:Następnie operator
(!)
bierze funkcję (g
), liczbę (n
) i znak (c
). Następnie oblicza dane wyjściowe dlan-1
, stosujeg
do niej funkcję i dodaje ciąg o tej samej szerokości składający się zc
s na początku i na końcu:W związku z tym jesteśmy gotowi rekurencyjnie generować dane wyjściowe, najpierw musimy objąć przypadek podstawowy:
A potem rekursja:
źródło
J , 37 bajtów
TIO
źródło
Stax , 22 bajty
Uruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło