IHIH Piramidi


34

"H" ve "I" harflerinin birbiriyle nasıl aynı olduğunu çok etkileyici buluyorum. "H", iki dikey vuruşla çevrili yatay bir harekettir; "I", iki yatay konturla çevrili dikey bir kontur (fontunuza bağlı olarak). Bahse girerim bu yuvalanmış olabilir ... Bana neyi hatırlattığını biliyor musun? Fraktallar !!!

"IHIH" piramidini şu şekilde tanımlayalım: İlk yineleme, "I" harfinin ASCII temsilidir:

---
 |
---

Bir sonraki yinelemenin her iki tarafında dikey bir vuruş var.

|   |
|---|
| | |
|---|
|   |

Ortadaki "I" yi tek bir yatay strok olarak görürseniz, bu ikinci yineleme temel olarak bir "H" olur. Üçüncü yineleme, alt ve üste yatay bir vuruş ekler

-------
 |   |
 |---|
 | | |
 |---|
 |   |
-------

Yine, ortadaki "H" yi tek bir dikey vuruş olarak görürseniz, bu yineleme temelde bir "I" dir. Bu desen her yinelemede "H" ile "I" arasında değişerek devam eder. Başvuru için, ilk 6 yinelemeler:

1:
---
 |
---

2:
|   |
|---|
| | |
|---|
|   |

3:
-------
 |   |
 |---|
 | | |
 |---|
 |   |
-------

4:
|       |
|-------|
| |   | |
| |---| |
| | | | |
| |---| |
| |   | |
|-------|
|       |

5:
-----------
 |       |
 |-------|
 | |   | |
 | |---| |
 | | | | |
 | |---| |
 | |   | |
 |-------|
 |       |
-----------

6:
|           |
|-----------|
| |       | |
| |-------| |
| | |   | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | |   | | |
| |-------| |
| |       | |
|-----------|
|           |

Meydan okuma:

Bir program ya da işlev verir Yazın , N'inci IHIH piramidin iterasyon, ve isteğe bağlı bir arka yeni satır. Girişiniz, istediğiniz makul biçimde tek bir pozitif tamsayı olacaktır. Geçersiz girişleri, örneğin tamsayı olmayanları, 1'den küçük sayıları, vb. Sayıları vb. İşlemeniz gerekmez. Programınız en azından 20'ye kadar olan girişler için doğru çıktıyı üretmelidir. Buna , standart boşluklara izin verilmez ve bayt cinsinden en kısa cevap kazanır!


Her satırda bir tane korkudan oluşan bir ok döndürürsem kabul edilebilir mi?
Rohan Jhunjhunwala

Zorluk ölçütlerini tam olarak karşılayamadım, ancak kazayla havalı bir şeyler yaptınız ... Çevrimiçi deneyin!
Magic Octopus Urn,

Yanıtlar:


7

Pyth , 50 40 31 25 bayt

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 \ |
CBujR @ j * @ "- |" H2CjR * 2; GQ \ |

Test odası.

açıklama

Bu özyinelemeli bir algoritmadır.

Her yinelemede üç işlem yaparız:

  1. her satıra bir boşluk ekle ve ekle
  2. diziyi devretmek
  3. Her bir satırı hazırlayın veya ekleyin "-"veya "|"yineleme sayısına bağlı olarak ekleyin .

Yinelemelerden sonra, tek numaralı çıkışlar aktarılacaktır. Bu nedenle, onları transpoze ediyoruz.

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

Çeviri fikrini seviyorum.
Titus

12

Python, 165 145 133 123 bayt

Özyinelemeli bir çözüm:

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]

İle adı verilen print ("\n".join(i(int(sys.argv[1]))))bir parametre IHIH piramidin yineleme sayıdır.

20 byte tasarruf için @DJMcMayhem teşekkürler. Bu önerilerin arkasındaki fikri daha da ileri götürmek, 12 bayt daha kurtardı. Daha fazla bayt kesilen öneriler için @Maltysen'e teşekkür ederiz.

Fonksiyon setleri ayraç diçin "|"ve araya giren boşluklar " "(tek sayılı tekrarlamalar için), dejenere durumda dönen fiyatlar, ardından sınırlayıcı sıfırlar " "ve araya giren boşluklar "-"çift sayılı tekrarlamalar için. İşlev, tekrarlayan bir çağrının sonucunu listedeki doğru yerdeki fonksiyona gömülmüş olarak, IHIH'nin her satırı için bir dizi listesi döndürür.


2
Güzel cevap ve siteye hoş geldiniz! Satırlara katılmanıza gerek yoktur, dizelerin listesi iyidir. Birkaç ipucu: 2. ve 3. satırları değiştirin if e<1:return'|'(aralarında yeni satır yok), sonra "diğerini" kaldırın ve fazladan çentiği çıkarın.
DJMcMayhem

1
sonra boşluğa varabilirsiniz return. Ayrıca, satırları ifnoktalı virgül olmadan s ile birleştirebilir ve girintiden tasarruf edebilirsiniz
Maltysen

1
Cevabınızı düzenledim. Lütfen beğenmezseniz düzenlemelerimi geri almaktan çekinmeyin.
Sızdıran Rahibe

10

Cheddar , 186 177 165 154 148 131 bayt

(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("|")

Özyineleme kullanır. Golf bittikten sonra açıklama katacak.

Çevrimiçi deneyin!

açıklama

Bu biraz karmaşık, kullandığım tüm değişkenleri de takip et ama basit tutmaya çalışacağım:

(
 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 `|`

Bu golf için bir acıydı ama orijinali olan 55 byte daha kısadı.


8

Python 2, 93 bayt

Sızdıran Rahibe 7 bayt kurtardı.

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)

Kapalı form: o: o
Çatlaklı Rahibe

Ahh, tabii ki: ilk başta ihtiyacım vardı int(x/2.)çünkü alıyordum range(-n,n+1)ama şimdi sadece bunları kullanabilirim. Teşekkür ederim!
Lynn

Python 2'yi başlıkta belirttim çünkü basitçe "Python" demek genellikle kodun Python 2 veya Python 3 altında çalıştığı anlamına gelir; buradaki durum böyle değildir.
Mego

7

Matricks , 80 62 bayt

Yinelemeli bir çözüm (Matricks'de Recursion zor ...)

İle koş python matricks.py ihih.txt [[]] <input> --asciiprint

k124; FEA% 2: v b [M 124: burada Q * 2 + 3: 1]; bir {z: S * 2 + 1;} ;: b v [M45: 1: Q * 2 + 3] u {ZQ * 2 + 1:;} ;;: 1: n ;;
k124; FEA% 2: v b [M 124: burada Q * 2 + 3: 2]; B1, b v [M45: 2: Q * 2 + 3]; V1 ;;: 1: n ;;

Açıklama:

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
Vay, yinelemeli! Etkilendim.
Conor O'Brien,

@ ConorO'Brien Matricks, dinamik matris yeniden boyutlandırma için üretildi, bu yüzden bu etkileyici değil, yine de teşekkürler!
Mavi

5

JavaScript (ES6), 92 90 bayt

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>

Özyinelemeli çözüm, önceki yinelemeyi alarak, vtaraflara ckarakter ekleyerek, sonra karakterleri köşelere ve hkarakterin üst ve alt kısımlarına ekleyerek çalışır . Karakter kümesi her yinelemeyi değiştirir. Düzenleme: vNe zaman döndürerek 2 bayt kaydedildi n=0.


4

Dyalog APL , 52 43 bayt

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

v h s←'|- 'atar üç isim için üç karakter ( v ertical, h orizontal, s hızı)

ilki, yani |

1 × 1 tablo haline getirmek

{... }⍣⎕girdi alın ve sıkıştırılmış işlevi birçok kez uygulayın.

v=⊃⍵: Argümanın sol üst karakteri dikey ise, o zaman:

  h⍪⍨ aşağıdaki ufuklar

  h⍪ yukarıdaki ufuklar

  s, solundaki boşluklar

  ⍵,s sağdaki boşluklarla argüman

Başka:

  v,⍨ sağında dikey

  v, soluna dikey

  s⍪ yukarıdaki boşluklar

  ⍵⍪s Aşağıdaki boşluklarla argüman

TryAPL çevrimiçi!



3

C, 110 bayt

#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]);}

Olarak çağır f(n). 111 bayt için şunları yapabilirdim:

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]);}

yani, #definetam olarak bir bayt kaydeder.


3

Dyalog APL, 34 bayt

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

{... 1x1 karakter matrisi ile başlayan }⍣⍵⍪'|'parantez içindeki fonksiyonu uygulayın| . Her uygulamanın sonucu, bir sonraki uygulamanın argümanıdır.

s b←' -|'~⊃⍵s boşluktur ve b, argümanın sol üst köşesinde olmayan çubuktur ( ' -|'~'-'yatay çubuğu kaldırır ve boşluk ve dikey çubuğu bırakır)

s,⍵,⊃s bsola ve sağa boşluk ekle ( vektör sb'den s seçer)

b,b,⍨⍉ transpozit ve sola ve sağa b ekleyin

Tek sayılar için bu, aktarılan sonucu bırakır, bu nedenle son bir aktarma gerekir.

⍉⍣⍵Devrik zamanlar (bir kez yeterli olur, ancak bu şekilde kodlamak için daha kısa olur)

TryAPL çevrimiçi


PPCG'ye Hoşgeldiniz!
Stephen,

Teşekkürler! Şimdi partiye katılmaya çalışıyorum, çok eğlenceliler :)
Gil


2

Çedar, 85 bayt

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

Benim ilk Cheddar cevabı. Çevrimiçi deneyin!

Yazmaya çalışırsam r=(-n|>n).map(v->abs v).map, sonra r(y->r(x->…))tercüman çöker. , -;


Sen yapabilir v->abs viçine (abs)(ör r.map((abs))abs fonksiyonunun davranışa sahip bir işlev döndürecek). örneğin (+)(1,2)-> 3. (^)(2,6)-> 64. Aynı zamanda beni neredeyse% 50 oranında aşan büyük vay
Downgoat

Hayır, bunu denedim: Runtime Error: `abs` has no behavior for types `Number` and `Number` (çünkü mapmuhtemelen elemanı ve dizinini, hem alır.)
Lynn

ah: / i bugün bu hatayı düzeltmek
üzereydi

2

APL (Dyalog Klasik) , 34 bayt

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

Çevrimiçi deneyin!

(kullanımları ⎕io←1 )

⍳⎕ olduğu 1 2 ... N

(⌽,0,⊢) içine dönüşen bir tren -N ... -1 0 1 ... N

∘.( )⍨ Her bir koordinat çifti için parantezleri çalıştırır. ⍺ ⍵

tren (≤-(1+=)×2|⌈)veya dfn eşdeğeri aşağıdaki {(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}gibi bir matris üretir:

 ¯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+ ]bu geçerli dizinleri yapar ⎕IO=1ve karşılık gelen karakterleri seçer.


1

Yakut, 81 78 77 bayt

Bu dayanmaktadır Lynn'in Python cevabına . Golf önerileri kabul edilir.

Düzenle: Lynn sayesinde 3 bayt. Ürdün sayesinde düzeltmeler ve golf 1 bayt.

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

Eğer Can .map(&:abs)?
Lynn

@ Lynn Çok iyi tespit edildi. Başka bir önerin var mı?
Sherlock9

İlki *hiçbir şey yapmıyor. Sen kullanabilirsiniz *""yerine .join. Ayrıca, pher bir satırı kullanarak inspectsizi diskalifiye edebilecek tırnak işaretleriyle ( bağımsız değişkenleri çağırır ) çevreler .
Jordan,

Ayrıca, etrafındaki parantezleri kaldırabilirsiniz &:abs( map &:abs). Array#productİç içe maps yerine bir şey yapabilirsin , ancak satır sonlarını zorlaştıracaktır.
Ürdün

@Jordan İlk dört ipucunuz işe yarıyor, ancak r.product(r).map(ancak bu işe yarıyor) uzundur ve satır kesmelerine çok kolay bir şekilde izin vermiyor.
Sherlock9

1

MATLAB, 168 163 bayt

Muhtemelen bunu yapmanın en akıllıca yolu değildir: Her tarafta bir dize nadımlarla genişletmek :

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

Kullanımı: Farklı kaydet g.m(bunu bayt sayısına eklemek zorunda mıyım?) Ve örneğing(15) ;

Ungolfed:

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

Sen yerini alabilir ' 'tarafından 0(bir boşluk olarak Matlab davranır Char 0) ve '-' tarafından 45. Dosya adı bayt sayımına dahil edilmek zorunda değildir
Luis Mendo

1

Aslında , 48 45 44 bayt

Bu Ruby cevabımı Aslında olarak işaretleme girişimidir. Bu çok uzun ve golf önerileri çok takdir ediliyor. Çevrimiçi deneyin!

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

Burada iç içe geçmiş fonksiyonları ayıran 46 baytlık bir sürüm tanımlanmıştır. "| -" daha az sayıda bayt olarak . Çevrimiçi deneyin!

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

Ungolfing:

İlk algoritma

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.

İkinci algoritma

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."%£Mşu anda sahip olduğunuzdan daha uzun (2 byte), ancak göremediğim süreyi kısaltmanın yollarını bulabilirsin.
Mego

1

Tuval , 19 18 17 14 bayt

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

Burada dene!

90 ° döndürülmüş diğer tüm çıkışları çıkarmam için izin verilirse, son 4 karakter kaldırılabilir.

Açıklama (bazı karakterler ~ monospace olarak değiştirildi):

|               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°

Bu kısıtlamayı da gevşetmeleri durumunda 6 bayt kaybederim: P.
Magic Octopus Urn

@MagicOctopusUrn wellp, benim için -5 bayt yap: p (cevabınız devrik bir döngüden de faydalanabilir mi?)
dzaima

Benim uygulaması olan bir devrik döngü: D.
Magic Octopus Urn,

1

05AB1E , 29 28 bayt

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

Çevrimiçi deneyin!

-1 Dzaima sayesinde ...

Bu yinelemeli bir çözümdür.


Temelde Bu, aşağıdaki deseni oluşturarak yapılır:

['|','--','|||',...]

Ardından, ikili olarak her bir elemanı birlikte transpoze edin ve dolguyu ekleyin.

Her yinelemeden sonra kopyalayarak, kalıbın tek bir köşesini oluşturduk.

Daha sonra 05AB1E'nin yansıma komutlarını kullanabiliriz.


„|-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 bayt

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}]

Matematiksel olarak her ikisinin de -n'den n'e çalıştığı koordinatlarda (i, j) doğru sembolü hesaplar. İnsan biçimlendirilmiş:

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 Bu konuya işaretçi için teşekkür ederiz!
Greg Martin

0

PHP, 166 bayt

ilk yaklaşımımdan 100 bayttan fazla golf oynadım ve hala buradaki en uzun cevap.

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

Yıkmak

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

ungolfed

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 bayt

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

Çevrimiçi deneyin!


0

Haskell , 110 bayt

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

Çevrimiçi deneyin!

Açıklama / Ungolfed

Yardımcı işlev g, bir karakter ve bir dizelerin listesini alır, daha sonra bu karakterleri önceden izler ve her dizeye ekler:

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

Daha sonra operatör (!)bir işlev ( g), bir sayı ( n) ve bir karakter ( c) alır. Daha sonra için çıktısını hesaplar, n-1işlevi uygular gve aynı genişlikte cs dizesini başlangıç ​​ve bitişe ekler :

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

Bunlarla çıktıları tekrarlı olarak üretmeye hazırız, önce temel durumu ele almamız gerekiyor:

f 0 = ["|"]

Ve sonra özyineleme:

-- 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 bayt

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

Koş ve hata ayıkla

Ambalajsız, ağzı açılmış ve yorumlanmış gibi görünüyor.

'|          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

Bunu çalıştır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.