ABAA / ABBB: Bu özyinelemeli 2D deseni oluşturun


30

Aşağıdaki ilginç özyinelemeli desen ile karşılaştığımda sonsuz direnç ağları (uzun hikaye) ile uğraşıyordum:

|-||
|---

Bu desenin her örneği, uzun olduğundan iki kat daha geniştir. Desenin bir seviyesinden diğerine geçmek için bu dikdörtgeni iki alt bloğa ayırırsınız (her biri NxN karesidir):

AB =
|-||
|---

so A = 
|-
|-

and B = 
||
--

Bu yarımlar daha sonra aşağıdaki desene göre çoğaltılır ve yeniden düzenlenir:

ABAA
ABBB

giving

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

Meydan okuma

Bir sayı verilen , bu özyinelemeli tasarımın yinelenen Nçıktılar bir program / işlev yazın N. Bu golf.

G / Ç formatı nispeten esnek: tek bir dize, bir dize listesi, bir 2D karakter dizisi, vb. Döndürebilirsiniz. Ayrıca, 0 veya 1 dizinlemeyi de kullanabilirsiniz.

Örnekler

Desenin ilk birkaç yinelemesi aşağıdaki gibidir:

N = 0
|-

N = 1
|-||
|---

N = 2
|-|||-|-
|---|-|-
|-||||||
|-------

N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------

N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------

Bu yapıyı hesaplamak için kısa bir cebirsel yolu olup olmadığını merak ediyorum.


"Cebirsel" ile ne demek istiyorsun?
user202729

4
@ user202729 Belki de f(n,x,y)belirli bir koordinatın -veya içermesi gerektiğini doğrudan hesaplayabilen bazı "basit" matematik formülleri var |. Modulo işlemleri veya bitsel işlemleri içerebilir. Şimdiye kadar gördüğüm tekniklerin tümü, teknik özelliklerde gösterildiği gibi, kesme / birleştirme dizilerini içerir.
PhiNotPi

3
f(x,y)ayrıca çalışır, çünkü eğer x,ygeçerliyse sonuç bağlı değildirn
amara

2
Çıkış 1 indekslenebilir, yani giriş 1 veriyor |-mu?
Zgarb

2
Bu kayıp mı? Q
qwr

Yanıtlar:


13

APL (Dyalog Klasik) , 29 25 bayt

'|-'[{a,⊖⌽⍉~a←⍪⍨⍵}⍣⎕⍉⍪⍳2]

Çevrimiçi deneyin!

⍳2 vektör 0 1

2x1'lik bir matrise dönüştürür

transpoze eder, böylece 1x2 olur

değerlendirilmiş girdi

{ }⍣⎕ birçok kez uygulayan bir işlevi uygulayın

⍪⍨⍵ argümanı kendi üstüne - 2x2 matrisle birleştirmek

a← hatırla a

~ negate

devrik

yatay olarak ters çevir

dikey olarak ters çevir

a,asolda birleştirmek

'|-'[ ]matrisi dizedeki indeksler olarak kullanın '|-', yani 0'a |ve 1'e-


10

JavaScript (Node.js) , 130 ... 106 94 92 bayt

Alternatif yöntemimden golf oynadım ve karakterleri düzelttim, -14 bayt Thanks @Shaggy

f=n=>n?f(n-1).replace(/.+/g,x=>(g=i=>x.replace(/./g,p=>p<i?s[i]+s[i]:s))`0`+`
`+g`1`):s="|-"

Çevrimiçi deneyin!

Orijinal yaklaşımım ( 106 102 bayt)

f=n=>n?[0,1].map(j=>f(n-1).split`
`.map(x=>x+x.substr((i=x.length/2)*j,i).repeat(2)).join`
`).join`
`:"|-"

-4 bytes Teşekkürler @Shaggy

f=n=>n?[0,1].map(j=>f(n-1).split`
`.map(x=>x+(y=x.substr((i=x.length/2)*j,i))+y).join`
`).join`
`:"|-"

Çevrimiçi deneyin!

Açıklama ve Ungolfed:

function f(n) {                     // Main Function
 if (n != 0) {                      //  If n != 0: (i.e. not the base case)
  return [0, 1].map(                //   Separate the pattern into 2 parts
  function(j) {                     //   For each part:
   return f(n - 1).split("\n")      //    Split the next depth into lines
    .map(function(x) {              //    For each line in the result:
    return x                        //     The common part: "AB"
     + x.substr(
      (i = x.length / 2) * j        //     Take A if j == 0, B if j == 1
      , i                           //     Take half the original length
     ).repeat(2);                   //     Double this part
   }).join("\n");                   //    Join all lines together
  }).join("\n");                    //   Join the two parts together
 }
 else return "|-";                  //  If not (base case): return "|-";
}

Orijinal alternatif yöntemim, "|"->"2", "-"->"1"izin veriliyorsa, 105 104 bayt:

f=n=>n?f(n-1).replace(/[12]+/g,x=>(g=(y,i)=>y.replace(/1|2/g,p=>[,i?11:22,21][p]))(x,0)+`
`+g(x,1)):"21"

Çevrimiçi deneyin!

Sadece bu soruna yönelik cebirsel bir yöntem buldum.

x=>y=>"|-||--"[(f=(x,y,t=0,m=2**30,i=!(y&m)*2+!(x&m)<<1)=>m?f(x^m,y^m,([18,0,90][t]&3<<i)>>i,m>>1):t)(x>>1,y)*2+x%2]

Çevrimiçi deneyin!

(nihayetinde uzunluk orjinal cevabımla karşılaştırılabilir bir fonksiyon)

f(n, x, y)nAşağıdaki sübstitüsyon yinelemesinde (x, y) bloğundaki blok tipini hesaplar :

0 => 0 1      1 => 0 0      2 => 1 1
     0 2           0 0           2 2

nereden 0 = "|-", 1 = "||", 2 = "--"başlayalım f(0, 0, 0) = 0.

Ardından, g(x)(y)sembolü orijinal desenin (x, y) değerinde hesaplar.


İlk çözümünüz için 102 bayt .
Shaggy


1
İkinci çözümünüzü 95 baytlık
Shaggy



9

Stax , 24 17 15 bayt

╛ä├¼àz[{╧↑;ε╖>╠

Koş ve hata ayıkla

İşte aynı programın ascii gösterimi.

'|'-{b\2*aa+c\}N\m

Temel fikir 0 nesil ızgarayla başlamak ve ardından ızgarayı genişleten bir bloğu tekrarlamak.

'|'-                    Push "|" and "-"
     {         }N       Get input and repeat block that many times.
      b                 Copy two top stack values
       \2*              Zip two parts, and double the height
          aa            Roll the top of the stack down to 3rd position.
            +           Concatenate two grids vertically
             c\         Copy result and zip horizontally
                  \     Zip the two parts horizontally
                   m    Output each row

8

Tuval , 17 16 bayt

|∙-╶[∔αω+:∔;:+}+

Burada dene!

Açıklama, 1 girişi için yığını gösteren:

|∙-               push "|" and "-" - the initial halves  "|", "-"
   ╶[         }   repeat input times                     
     ∔              add the two parts vertically         "|¶-"
      αω            get the original arguments to that   "|¶-", "|", "-"
        +           and add those horizontally           "|¶-", "|-"
         :∔         and add to itself vertically         "|¶-", "|-¶|-"
           ;        get the vertically added parts       "|-¶|-", "|¶-"
            :+      and add to itself horizontally       "|-¶|-", "||¶--"
               +  finally, add the halves together       "|-||¶|---"

α/ ωÇalışmak için ayarlanan değerlerin doğru şekilde kopyalanmadığı bir hatayı düzelterek 16 bayta güncellendi (Kanvas'ın tamamen değişmez olması gerekiyordu, ama ne yazık ki değildi).


6

Python 2 , 88 77 bayt

-11 bayt thansk için Lynn

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

Çevrimiçi deneyin!


Bu liste kavramalarını 77'de bir araya getirebilirsiniz: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)]
Lynn

4

Perl 5 , 72 bayt

@1='|-';$l=@1,map{/.{$l}/;push@1,$_.$' x2;$_.=$&x2}@1for 1..<>;say for@1

Çevrimiçi deneyin!


1
Şuna göre optimize edildi 66: $.=map{s/.{$.}$/$&$$ /,push@1,$. $ & X3} @ 1 (@ 1 = "| -") x <>; @ 1 için söyle
Ton Hospel

4

Kabuğu , 17 bayt

!¡§z+DȯṁmDTm½;"|-

1 endeksli. Çevrimiçi deneyin!

açıklama

!¡§z+DȯṁmDTm½;"|-  Implicit input: a number n.
              "|-  The string "|-".
             ;     Wrap in a list: ["|-"]
 ¡                 Iterate this function on it:
                    Argument is a list of lines, e.g. L = ["|-||","|---"]
           m½       Break each line into two: [["|-","||"],["|-","--"]]
          T         Transpose: [["|-","|-"],["||","--"]]
      ȯṁ            Map and concatenate:
        mD           Map self-concatenation.
                    Result: ["|-|-","|-|-","||||","----"]
   z+               Zip using concatenation
  §  D              with L concatenated to itself: ["|-|||-|-","|---|-|-","|-||||||","|-------"]
                   Result is the infinite list [["|-"],["|-||","|---"],["|-|||-|-","|---|-|-","|-||||||","|-------"],...
!                  Take n'th element, implicitly display separated by newlines.

3

Jöle , 21 19 bayt

;"/;`,Ẏ;`€$
⁾|-Ç¡ZY

Çevrimiçi deneyin!


Açıklama:

Başlangıçta, değer ⁾|-budur ["|","-"].

Verilen son link ( Ç) [A, B]geri dönecektir.

   AB     AA
[  AB  ,  BB  ]

. ¡Arda son bağlantı (giriş) sayısını ve uygulamak ZYbiçimleri o.

Son link için açıklama:

-----------------
;"/;`,Ẏ;`€$  Monadic link. Value = [A, B]
;"/          Accumulate vectorized concatenate. Calculates (A ;" B).
             Represented as a matrix, it's |AB| (concatenated horizontally)
   ;`        Concatenate with self.      |AB|
                                Value =  |AB|  (concatenate vertically)
     ,    $  Pair with ...
      Ẏ        Tighten.  |A|    (concatenate vertically)
                 Value = |B|
       ;`€     Concatenate each with self.    |AA|
                                      Value = |BB|  (duplicate horizontally)


2

Haskell , 86 bayt

(%)=zipWith(++)
f 0=["|-"]
f n|(a,b)<-unzip$splitAt(2^(n-1))<$>f(n-1)=a%b%a%a++a%b%b%b

Çevrimiçi deneyin!

Oldukça basit. Çıktı, dizelerin bir listesidir. Önceki sürümü alıp her satırı ikiye böldükten sonra bunları kullanarak iki yeni listeye topladık unzip. O zaman dizileri doğru bir şekilde bir araya getirme meselesi.


1

J , 49 bayt

f=.3 :'''|-''{~((,.[:|.[:|."1[:|:-.)@,~)^:y,:0 1'

Ngn'in APL çözümünün sakarca çevirisi. Bunu yapmakta zorlandım - herhangi bir tavsiyeye minnettar kalacağım.

Çevrimiçi deneyin!


1

Kömür , 47 46 bayt

M²↖|-¶¶FENX²ι«F²C±ι⁰C⁰ιC⊗ι±ιC׳ι±ι≦⊗ιM±ι±ιT⊗ιι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

M²↖|-¶¶

Aşağıdaki döngü için tutarlı bir imleç konumu elde etmek için, adım 0'ı (-2, -2) konumuna basmalı ve imleci (-2, 0) bırakmalıyım. (Bu, Kömür'deki bir hatadan kaynaklanıyor olabilir.)

FENX²ι«

N2'nin ilk güçleri üzerinde döngü .

F²C±ι⁰C⁰ιC⊗ι±ιC׳ι±ι

Bir önceki çıktının kopyalarını çeşitli ofsetlerle yapın ve sonuçta içinde bir dikdörtgen içinde istenen bir sonraki adımı içeren bir kanvas elde edilir.

≦⊗ιM±ι±ιT⊗ιι

Dikdörtgenin konumuna getirin ve tuvali kesin.

Alternatif çözüm, ayrıca 46 bayt:

M²→|-FENX²ι«F432C×Iκι׳ιF245C×Iκι⊗ι≦⊗ιJ⊗ιιT⊗ιι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

M²→|-

Bu zaman adımı 0, (2, 0) pozisyonunda yazdırılmalıdır, ancak en azından imleç pozisyonunun önemi yoktur.

FENX²ι«

N2'nin ilk güçleri üzerinde döngü .

F432C×Iκι׳ιF245C×Iκι⊗ι

Bir önceki çıktının kopyalarını çeşitli ofsetlerle yapın ve sonuçta içinde bir dikdörtgen içinde istenen bir sonraki adımı içeren bir kanvas elde edilir.

≦⊗ιJ⊗ιιT⊗ιι

Dikdörtgenin konumuna getirin ve tuvali kesin.


1

R , 126 bayt

function(n,k=cbind){o=matrix(c("|","-"),1,2)
if(n>0)for(i in 1:n)o=rbind(k(a<-o[,x<-1:(2^(i-1))],b<-o[,-x],a,a),k(a,b,b,b))
o}

Çevrimiçi deneyin!

A döndürür matrix. Doğrulama kolaylığı için güzel bir şekilde yazdırmasını sağlamak için TIO bağlantısında bir miktar kod var.




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.