Piramida IHIH


34

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 , standardowe luki są niedozwolone i najkrótsza odpowiedź w bajtach wygrywa!


Czy jest dopuszczalne, jeśli zwrócę strzałkę ciągów po jednym z każdego rzędu?
Rohan Jhunjhunwala,

Nie całkiem spełniałem kryteria wyzwania, ale przez przypadek zrobił coś fajnego ... Wypróbuj online!
Magic Octopus Urn

Odpowiedzi:


7

Pyth , 50 40 31 25 bajtów

j @ su, J + * \ - K + 2lheN + jR * 2; eN * \ - KjR "||" + * dK + J * dKQ]] \ | 
LXR "| -") CbjyW% Q2uy + K * \ - + 2lhG + jR * 2; GKQ] \ | 
juCGQuC + K * @ "- |" H + 3yH + jR * 2; GKQ \ |
j @ CBujR * @ "- |" H2CjR * 2; GQ \ |

Zestaw testowy.

Wyjaśnienie

Jest to algorytm rekurencyjny.

W każdej iteracji wykonujemy trzy czynności:

  1. wstawiaj i dodawaj spacje do każdej linii
  2. transponuj tablicę
  3. prepend i dołączyć do każdej linii albo "-"czy "|"w zależności od liczby iteracji.

Po iteracjach wyjścia nieparzyste zostaną transponowane. Dlatego transponujemy je.

j@CBujR*@"-|"H2CjR*2;GQ\|   input: Q
j@CBujR*@"-|"H2CjR*2;GQ\|Q  implicit filling of arguments


    u                 Q\|   for Q times, starting with "|", G as current output,
                            H as number of iterations:

                jR*2;G          prepend and append a space to each line
                                (using each line as separator, join [" "," "])
               C                transpose
     jR*      2                 prepend and append the following to each line:
        @"-|"H                      the H-th element of the string "-|" (modular indexing)

 @CB                     Q  select the Q-th element from [output,
                            transposed output] (modular indexing)
j                           join by newlines

Uwielbiam pomysł transponacji.
Tytus

12

Python, 165 145 133 123 bajtów

Rozwiązanie rekurencyjne:

def i(e):
 d="|";a=e*2;x=d+" "*(a-1)+d
 if e<1:return d
 if e%2:d,x=[" ","-"*(a+1)]
 return[x]+[d+z+d for z in i(e-1)]+[x]

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 dna "|"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.


2
Ładna odpowiedź i witamy na stronie! Nie musisz łączyć linii, lista ciągów jest w porządku. Kilka wskazówek: zmień linie 2 i 3 na if e<1:return'|'(bez nowej linii między nimi), a następnie usuń „else” i usuń dodatkowe wcięcie.
DJMcMayhem

1
możesz później wyjąć przestrzeń return. Możesz także łączyć linie bez ifs średnikami i oszczędzać na wcięciach
Maltysen,

1
Zredagowałem twoją odpowiedź. Jeśli nie podoba Ci się to, możesz przywrócić moje zmiany.
Leaky Nun

10

Cheddar , 186 177 165 154 148 131 bajtów

(n,b?,c?,q?,g=s->(n-=1)<0?s:g((q=(c=s.lines[0].len)%4>2?b='|'+" "*c+"|":b='-'*(c+2))+"\n"+s.sub(/^|$/gm,q?'|':' ')+"\n"+b))->g("|")

Wykorzystuje 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ć:

(
 n,    // Input
 b?,   // Stores row to add to top/bottom
 c?,   // Width of string 
 q?,   // false if I-ifying. true if not
 g=
   s->          // Main logic, s is generated string
    (n-=1)<0 ? s :   // Decrease input each iteration. Stop when 0
    g(               // Recurse with....
      (
        q= (         // Set `q` true if h-ifying. false if I-ifying
         c=s.lines[0].len    // Set `c` to width of string
        ) % 4>2 ?
        b='|'+" "*c+"|" :    // Set `b` to top/bottom row adding
        b='-'*(c+2)          // `*` is repeat, c is from before
      ) + "\n" + 
        s.sub(/^|$/gm,       // Add the following to beginning/end of each line
          q?'|':' '          // if H-ifying, add `|`s if I-ifying add spaces
        ) + "\n" + b         // Add bottom row, generated from before
    )
) -> g("|")     // Middle item is `|`

To był problem dla golfa, ale jego 55 bajtów jest krótszych niż oryginalne.


8

Python 2, 93 bajty

Dziurawa zakonnica zapisała 7 bajtów.

r=range(input()+1)
r=r[:0:-1]+r
for y in r:print''.join('| -'[[x%2,y%2+1][x&-2<y]]for x in r)

Formularz zamknięty: o: o
Leaky Nun

Ach, oczywiście: na początku potrzebowałem, int(x/2.)ponieważ brałem, range(-n,n+1)ale teraz mogę po prostu z nich korzystać. Dziękuję Ci!
Lynn,

Określiłem Python 2 w nagłówku, ponieważ samo powiedzenie „Python” zwykle oznacza, że ​​kod działa zarówno w Pythonie 2, jak i Pythonie 3, co nie ma miejsca w tym przypadku.
Mego

7

Matricks , 80 62 bajtów

Rozwiązanie iteracyjne (Rekurencja w Matricks jest trudna ...)

Biegnij z python matricks.py ihih.txt [[]] <input> --asciiprint

k124; FiQ% 2: v; b [m124: Q * 2 + 3: 1;]; a {z: Q * 2 + 1;} ;: b; v [m45: 1: Q * 2 + 3;] ; u {zQ * 2 + 1:;} ;;: 1: n ;;
k124; FiQ% 2: v; b [m124: Q * 2 + 3: 2;]; B1;: b; v [m45: 2: Q * 2 + 3;]; V1 ;;: 1: n ;;

Wyjaśnienie:

k124;                 # Set the matrix to '|'
F...:1:n;;            # Repeat input times, (Q is iteration variable)
  iQ%2:...:...;       # if statement, check if Q is odd or even
                      # Q is even,
    b;                # Make space to the left
    v[m45:2:Q*2+3;];  # Set the top 2 rows to '-'s
    V1;               # Rotate the matrix up 1 unit, moving the topmost row to the bottom
                      # Q is odd,
    v;                # Make space above
    b[m124:Q*2+3:2;]; # Set the 2 left columns to '|'s
    B1;               # Rotate the matrix left 1 unit, moving the leftmost row to the right

1
Wow, iteracyjny! Jestem pod wrażeniem.
Conor O'Brien,

@ ConorO'Brien Matricks został zbudowany do dynamicznego zmieniania rozmiaru matrycy, więc nie jest to tak imponujące, ale i tak dzięki!
Niebieski,

5

JavaScript (ES6), 92 90 bajtów

f=
(n,[h,c,v]=n&1?`-- `:` ||`)=>n?(c+=h.repeat(n+n-1)+c)+`
${f(n-1).replace(/^|$/gm,v)}
`+c:v
;
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

Rozwiązanie rekurencyjne polega na wykonaniu poprzedniej iteracji, dodaniu vznaku na boki, a następnie dodaniu cznaku do narożników i hznaku wzdłuż górnej i dolnej krawędzi. Zestaw znaków po prostu zmienia na przemian każdą iterację. Edycja: Zapisano 2 bajty, zwracając vkiedy n=0.


4

Dyalog APL , 52 43 bajty

{v=⊃⍵:h⍪⍨hs,⍵,sv,⍨v,s⍪⍵⍪s}⍣⎕⍪⊃v h s'|- '

v 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 razy

v=⊃⍵: jeśli lewy górny znak argumentu jest pionowy, wówczas:

  h⍪⍨ poziomy poniżej

  h⍪ poziomy powyżej

  s, spacje po lewej stronie

  ⍵,s argument ze spacjami po prawej stronie

jeszcze:

  v,⍨ pionów na prawo od

  v, pionów na lewo od

  s⍪ spacje powyżej

  ⍵⍪s argument ze spacjami poniżej

Wypróbuj APL online!



3

C, 110 bajtów

#define R(A,B,C)for(A=n,B=1;A<=n;putchar(C),A-=B|=-!A)
f(n,y,x,w,v){R(y,w,10)R(x,v,"| -"[x/2*2<y?y%2+1:x%2]);}

Wywołaj jako f(n). Dla 111 bajtów mógłbym:

f(n,y,x,w,v){for(y=n,w=1;y<=n;y-=w|=-!y,puts(""))for(x=n,v=1;x<=n;x-=v|=-!x)putchar("| -"[x/2*2<y?y%2+1:x%2]);}

tzn. #definezapisuje dokładnie jeden bajt.


3

Dyalog APL, 34 bajty

{⍉⍣⍵{b,b,⍨⍉s,⍵,⊃s b←' -|'~⊃⍵}⍣⍵⍪'|'}

{... }⍣⍵⍪'|'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 bdodaj spację do lewej i prawej ( wybiera s z wektora sb)

b,b,⍨⍉ transponuj i dodaj b po lewej i prawej stronie

W 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


Witamy w PPCG!
Stephen

Dzięki! Próbowanie dołączenia do imprezy teraz, dużo zabawy przy ich rozwiązywaniu :)
Gil


2

Cheddar, 85 bajtów

(n,r=(-n|>n).map(v->abs v))->r.map(y->r.map(x->"| -"[(x&-2)<y?y%2+1:x%2]).fuse).vfuse

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. ; -;


Można zrobić v->abs vw (abs)(EG r.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%
Downgoat

Nie, próbowałem tego: Runtime Error: `abs` has no behavior for types `Number` and `Number` (ponieważ mapprawdopodobnie odbiera zarówno element, jak i jego indeks).
Lynn,

ah: / właśnie miałem naprawić ten błąd dzisiaj> _>
Downgoat

2

APL (Dyalog Classic) , 34 bajty

'- |'[2+∘.(≤-(1+=)×2|⌈)⍨(⌽,0,⊢)⍳⎕]

Wypróbuj online!

(używa ⎕io←1)

⍳⎕ jest 1 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:

 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
  0  1  0  0  0  0  0  0  0  1  0
  0  1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1  1  0
  0  1  0  1  0  0  0  1  0  1  0
  0  1  0  1 ¯1 ¯1 ¯1  1  0  1  0
  0  1  0  1  0  1  0  1  0  1  0
  0  1  0  1 ¯1 ¯1 ¯1  1  0  1  0
  0  1  0  1  0  0  0  1  0  1  0
  0  1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1  1  0
  0  1  0  0  0  0  0  0  0  1  0
 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1

'- |'[2+ ]wprowadza te poprawne indeksy ⎕IO=1i wybiera odpowiednie znaki


1

Ruby, 81 78 77 bajtów

Jest 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.

->n{r=(-n..n).map &:abs;r.map{|y|puts r.map{|x|"| -"[x&-2<y ?y%2+1:x%2]}*""}}

Ungolfing:

def f(n)
  r = -n..n            # Range from -n to n (inclusive)
  r = r.map{|i|i.abs}  # Turns every element of r positive
  r.each do |y|
    s = ""             # a line of the fractal
    r.each do |x|      # build up the fractal based on x and y
      if x/2*2 < y
        s += " -"[y%2]
      else
        s += "| "[x%2]
      end
    end
    puts s             # print the line
  end
end

Możesz .map(&:abs)?
Lynn,

@Lynn Dobrze zauważony. Jakieś inne sugestie?
Sherlock9,

Pierwszy *nic nie robi. Możesz użyć *""zamiast .join. Ponadto użycie potacza każdą linię znakami cudzysłowu (wywołuje inspectargumenty), co może cię zdyskwalifikować.
Jordan

Możesz także usunąć nawiasy wokół &:abs( map &:abs). Możesz być w stanie coś zrobić Array#productzamiast zagnieżdżonych maps, ale utrudni to łamanie linii.
Jordan

@Jordan Pierwsze cztery wskazówki działają, ale r.product(r).map(jakkolwiek to działa) jest dłuższe i nie pozwala na łatwe łamanie linii.
Sherlock9,

1

MATLAB, 168 163 bajtów

Prawdopodobnie nie jest to najmądrzejszy sposób: Rozwijanie łańcucha ze wszystkich stron w nkrokach:

function s=g(n);s='|';for m=1:n;if mod(m,2);a=45;b=a;c=0;else a='|';b=0;c=a;end;s=[a repmat(b,1,2*m-1);repmat(c,2*m-1,1) s];s(:,end+1)=s(:,1);s(end+1,:)=s(1,:);end

Użycie: Zapisz jako g.m(czy muszę to dodać do liczby bajtów?) I wywołać np g(15).

Nie golfowany:

function s=g(n)

% // Initialize s
s = '|';

for m=1:n
   % // Decide if odd or even number and which symbol to add where
   if mod(m,2)
      a=45;b=a;c=0; % // char(45) is '-' and char(0) is ' ' (thx to Luis Mendo)
   else
      a='|';b=0;c=a;
   end
      % // Add symbols at top and left to s
      s = [a repmat(b,1,2*m-1);repmat(c,2*m-1,1) s];
      % // Add symbols at right and bottom to s
      s(:,end+1) = s(:,1);
      s(end+1,:) = s(1,:);
end

Możesz zastąpić ' 'przez 0(Matlab traktuje znak 0 jako spację) i '-' przez 45. Nazwa pliku nie musi być uwzględniana w liczbie bajtów
Luis Mendo,

1

Faktycznie , 48 45 44 bajtów

To 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!

u;±ux♂A╗╜`╝╜";2@%2╛%u╛(2±&<I'-' '|++E"£MΣ.`M

Oto 46-bajtowa wersja, która oddziela zagnieżdżone funkcje, dzięki czemu możemy zdefiniować "| -"mniej bajtów. Wypróbuj online!

u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£MΣ."%£M

Ungolfing:

Pierwszy algorytm

u         Increment implicit input.
;±u       Duplicate, negate, increment. Stack: [-n n+1]
x♂A       Range [-n, n+1). Abs(x) over the range.
╗         Save list to register 0. Let's call it res.
╜         Push res so we can iterate over it.
  `         Start function (with y from map() at the end)
  ╝         Save y to register 1.
  ╜         Push res so we can iterate over it.
    "         Start function as string (with x from map() at the end)
    ;         Duplicate x.
    2@%       x mod 2.
    2╛%u      y mod 2 + 1.
    ╛(2±&<I   If x&-2 < y, then y%2+1, else x%2.
    '-' '|++  Push "| -" (We're inside a string right now,
                          so we need to push each char individually)
    E         Grab index of "| -"
    "£        End string and turn into function.
  M         Map over res.
  Σ.        sum() (into a string) and print.
  `         End function.
M         Map over res.

Drugi algorytm

u;±ux♂A╗╜                  Create res as before.
`;2@%2╛%u╛(2±&<I"| -"E`#   The inner function from the first algorithm put into a list.
                             The only change to the function is the definition of "| -".
"╝╜  £MΣ."                 Most of the outer function from the first algorithm as a string.
   %r      %               %-formats the list into the outer function.
            £M             Turns the string into a function, maps over res.

u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£Mjest dłuższy niż obecnie (o 2 bajty), ale możesz znaleźć inspirację dla sposobów skrócenia tego, czego nie widzę.
Mego

1

Płótno , 19 18 17 14 bajtów

|╶[ e↷l|*e}╶[↷

Wypró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):

|               push "|" - the canvas
 ╶[       }     repeat input times
    e             encase the canvas in spaces horizontally
     ↷            rotate the canvas 90°
      l|*         push "-" repeated the canvas height times vertically
         e        and encase the canvas if two of those horizontally
           ╶[   repeat input times
             ↷    rotate the canvas 90°

Straciłbym 6 bajtów, gdyby poluzowali również to ograniczenie: P.
Magic Octopus Urn

@MagicOctopusUrn wellp, zrób dla mnie -5 bajtów: p (czy twoja odpowiedź również skorzysta z pętli transpozycji?)
dzaima

moja implementacja to pętla transpozycji: D.
Magic Octopus Urn

1

05AB1E , 29 28 bajtów

„|-S¹>∍ƶćsvy‚˜.Bζ}¹Fζ}»R.∞.∊

Wypró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.


„|-S                         # Push ['|','-']
    ¹>∍                      # Extended to input length.
       ƶ                     # Each element multiplied by its index.
        ćs                   # Extract head of list, swap remainder to top.
          v      }           # For each element in the '|-' list...
           y‚˜               # Wrap current 2D array with new entry, flatten.
              .Bζ            # Pad and transpose, leaving it transposed for the next addition.
                 }           # End loop.
                  ¹Fζ}       # Transpose N times.
                      »R     # Bring it all together into a newline string, reverse.
                        .∞.∊ # Mirror horizontally, then vertically with overlap.

0

Mathematica, 158 164 bajtów

f[n_]:=Print/@StringJoin/@Map[{{{"|","|", },{ , , }},{{"|", ,"-"},{ ,"-","-"}}}[[##]]&@@#&,Table[{1+i~Mod~2, 1+j~Mod~2, 2+Sign[Abs[i]-Abs[j]]}, {i,-n,n}, {j,-n,n}],{2}]

Oblicza matematycznie poprawny symbol na współrzędnych (i, j), gdzie oba biegną od -n do n. Człowiek sformatowany:

f[n_]:=Print/@
 StringJoin/@
  Map[
   {{{"|","|", },{ , , }},{{"|", ,"-"},{ ,"-","-"}}[[##]]&@@#&,
   Table[{1+i~Mod~2,1+j~Mod~2,2+Sign[Abs[i]-Abs[j]]},{i,-n,n},{j,-n,n}],
   {2}]

@ Adám Dziękujemy za wskaźnik do tego wątku!
Greg Martin

0

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.

function i($n){for($m=['|'];$k++<$n;){array_unshift($m,$m[]=str_repeat(' -'[$f=$k&1],2*$k-1));foreach($m as$i=>&$r)$r=($c='||- '[2*$f+($i&&$i<2*$k)]).$r.$c;}return$m;}

awaria

function h($n)
{
    for($m=['|'];$k++<$n;)
    {
        array_unshift($m,$m[]=str_repeat(' -'[$f=$k&1],2*$k-1));
        foreach($m as$i=>&$r)
            $r=($c='||- '[2*$f+($i&&$i<2*$k)]).$r.$c;
    }
    return$m;
}

bez golfa

function ihih($n)
{
    $m=['|'];                   // iteration 0
    for($k=1;$k<=$n;$k++)       // loop $k from 1 to $n
    {
        $f=$k&1;                        // flag for odd iterations
        // add lines:
        $r=str_repeat(' -'[$f],2*$k-1); // new line: ' ' for even, '-' for odd iterations
        $m[]=$r;                                // append
        array_unshift($m,$r);                   // prepend
        // add columns:
        foreach($m as$i=>&$r)           // for each line
        {
            $c='| '[$f];                        // '|' for even, ' ' for odd iterations
            if($f && (!$i || $i==2*$k)) $c='-'; // '-' in corners for odd iterations
            $r=$c.$r.$c;                        // prepend and append character
        }
    }
    return $m;
}

0

Perl 5 , 150 bajtów

sub h{my$i=pop;my$c=$i%2?$":'|';return(map{"$c$_$c"}h($i-1)),$i%2?'-'x($i*2+1):$c.$"x($i*2-1).$c if$i;()}say for reverse(@q=h<>),$q[0]=~s/---/ | /r,@q

Wypróbuj online!


0

Haskell , 110 bajtów

f 0=["|"]
f n|odd n=g ' '!n$'-'|1>0=g '|'$id!n$' '
g c=map$(c:).(++[c])
(g!n)c|p<-g.f$n-1=(:p)<>pure$c<$head p

Wypróbuj online!

Wyjaśnienie / Niegolfowany

Funkcja pomocnika gpobiera znak i listę ciągów, a następnie poprzedza i dołącza ten znak do każdego ciągu:

g c = map (\s-> [c] ++ s ++ [c])

Następnie operator (!)bierze funkcję ( g), liczbę ( n) i znak ( c). Następnie oblicza dane wyjściowe dla n-1, stosuje gdo niej funkcję i dodaje ciąg o tej samej szerokości składający się z cs na początku i na końcu:

(g ! n) c | prev <- g $ f (n-1), ln <- [c | _ <- head p]
          = [ln] ++ prev ++ [ln]

W związku z tym jesteśmy gotowi rekurencyjnie generować dane wyjściowe, najpierw musimy objąć przypadek podstawowy:

f 0 = ["|"]

A potem rekursja:

-- for odd n: the previous output needs a space at the end and beginning and then a string of '-' characters at the top and bottom
f n | odd n     = (g ' ' ! n) '-'
-- for even n: the previous output needs a line of spaces at the top and bottom and then each line needs to be enclosed with '|' characters
    | otherwise = g '|' $ (id ! n ) ' '


0

Stax , 22 bajty

âeò↕\┐▄┤╚╬8φ8Δ☺Pä≤δ₧߃

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

'|          string literal "|"
{           begin block to repeat
  . |G      push " |", then jump to trailing `}` below 
  '-z2lG    push ["-",[]], then jump to trailing `}` below again
}N          repeat block according to number specified in input
m           output each row in grid

}           goto target - `G` from above jumps to here
  i@        modularly index into pair using iteration index
  ~         push to input stack
  {;|Sm     surround each row with the extracted element
  M         transpose grid

Uruchom ten

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.