Dizine alınmış bir fraktal çizme


14

Giriş

Bu meydan okumada, 2 × 2 matris şu şekilde endekslenir:

0 1
2 3

Biz bir aile tanımlamak fraktal benzeri desenler F(L), nerede Lbir uzunluk- olan nbu endekslerin listesi ve F(L)boyutu vardır .2n-1 × 2n-1

  • Eğer L == []öyleyse F(L), 1 × 1 paternidir #.
  • Eğer L != [], o zaman F(L)aşağıdaki gibi inşa edilir. Izin vermek ilk Pdesen Lkaldırıldı elde edilen desen olsun . Noktalarla dolu dört boyutlu ızgara alın ve dizine eklenmiş ızgarayı desenle değiştirin . Ardından, aralarındaki bir karma katmanı kullanarak ızgaraları birbirine yapıştırın . Dört durum için şemalar:2n-1-1 × 2n-1-1.L[0]P#

    L[0]==0  L[0]==1  L[0]==2  L[0]==3
       #...  ...#     ...#...  ...#...
    [P]#...  ...#[P]  ...#...  ...#...
       #...  ...#     ...#...  ...#...
    #######  #######  #######  #######
    ...#...  ...#...     #...  ...#   
    ...#...  ...#...  [P]#...  ...#[P]
    ...#...  ...#...     #...  ...#   
    

Misal

Girişi düşünün L = [2,0]. 1 × 1 ızgara ile başlıyoruz ve sağdan #geçiyoruz L. En sağdaki eleman 0, bu yüzden 1 × 1 ızgarasının dört kopyasını alıyoruz ., ilkini değiştiriyoruz #ve bunları karmalarla yapıştırıyoruz. Bu 3 × 3 ızgarayla sonuçlanır

##.
###
.#.

Bir sonraki öğe 2, bu yüzden 3 × 3 ızgarasının dört kopyasını alıyoruz .ve üçüncü olanı yukarıdaki ızgarayla değiştiriyoruz. Dört ızgara

...  ...  ##.  ...
...  ...  ###  ...
...  ...  .#.  ...

ve bunları #7 × 7 ızgarasında s sonuçlarıyla yapıştırmak

...#...
...#...
...#...
#######
##.#...
####...
.#.#...

Bu bizim nihai çıktımız.

Giriş

LGirişiniz endekslerin bir listesidir 0, 1, 2, 3. Bir tamsayı listesi veya bir rakam dizisi olarak alabilirsiniz. Boş olabileceğini ve kopyalar içerebileceğini unutmayın. Uzunluğu Len fazla 5'tir.

Çıktı

Çıktınız, F(L)yeni satırla sınırlandırılmış bir dize olarak kalıptır .

Kurallar ve puanlama

Tam bir program veya işlev yazabilirsiniz. en düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test senaryoları

[]
#

[0]
##.
###
.#.

[3]
.#.
###
.##

[2,0]
...#...
...#...
...#...
#######
##.#...
####...
.#.#...

[1,1]
...#.##
...####
...#.#.
#######
...#...
...#...
...#...

[1,2,0]
.......#...#...
.......#...#...
.......#...#...
.......########
.......###.#...
.......#####...
.......#.#.#...
###############
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......

[3,3,1]
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
###############
.......#...#...
.......#...#...
.......#...#...
.......########
.......#...#.##
.......#...####
.......#...#.#.

[0,1,2,3]
.......#...#...#...............
.......#...#...#...............
.......#...#...#...............
.......#########...............
.......#.#.#...#...............
.......#####...#...............
.......#.###...#...............
################...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
###############################
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............

[0,0,1,2,3]
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#########...............#...............................
.......#.#.#...#...............#...............................
.......#####...#...............#...............................
.......#.###...#...............#...............................
################...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
################################...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
###############################################################
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................

Örneğinizde, neden 1x1 ızgarayla başlıyorsunuz #? L !=[]bu örnekte, 1 veya daha fazla öğeye sahip olduğundan. Bu F (L) olduğu anlamına mı geliyor hep bir #ilk başta?
R. Kap

2
@ R.Kap Tamam, örnek çok net değil. Tanım özyinelemeli, bu nedenle L = [2,0], kafayı doğrayın ve desene bakın F([0]), sonra kafasını doğrayın ve 1x1 ızgarası olan [0]desene bakın . Ardından , 3x3 kalıbını oluşturmak için üzerindeki kesilmiş indeksi ve 7x7 kalıbını oluşturmak için bu kesilmiş indeksi kullanın . Sorunuzu cevaplamak için: evet, her zaman 1x1 ızgarasıyla başlarsınız, çünkü bu yinelemenin temel örneğidir. F([])#02
Zgarb

Yanıtlar:


6

CJam, 59 47 43 41 40 bayt

1 bayt tasarruf için Sp3000'e teşekkürler.

Sal~W%{_Bff|a4*I@t2/{zSf*z}:F%F}fI3ff+N*

Burada test edin.

açıklama

Biraz eskimiş. Daha sonra düzeltir.

4D listelerinin tüm boyut yeniden sıralamaları beni baş döndürüyor ...

Bu kod, yinelemeli tanımı yerine örnek bölümündeki yinelemeli algoritmayı kullanarak özellikleri tam anlamıyla uygular. Önemli bir golf hilesi, #hesaplama sırasında boşluklar kullanmam ve yalnızca #sonunda değiştirmektir. kodu tek bir yerde ve birkaç Syerine '#veya yerine kullanmama izin veriyor "#".

Sa       e# Push [" "], i.e. a 1x1 grid containing only a space as the
         e# initial fractal.
l~       e# Read and evaluate input.
W%       e# Reverse the list.
{        e# For each list element, assigning the element to variable I...
  _      e#   Duplicate the grid.
  Eff|   e#   Map (OR 14) over each character in the grid, turning spaces into
         e#   periods and leaving periods unchanged.
  a4*    e#   Create an array with four copies of this cleared grid.
  I@t    e#   Replace the Ith element in this list with the previous grid.
  2/     e#   Split this array into a 2x2 grid of subgrids...
         e#   Now it's getting a bit weird... we've got 4 dimensions now, which are:
         e#    - Rows of the 2x2 meta-grid.
         e#    - Cells in each row of the 2x2 meta-grid (i.e. subgrids).
         e#    - Rows of each subgrid.
         e#    - Characters in each row of each subgrid.
  :z     e#   Transpose each outer row, i.e. swap dimensions 2 and 3.
         e#   We've now got in each row of the meta-grid, a list of pairs of
         e#   corresponding rows of the subgrids.
  Sff*   e#   Join those pairs of rows with a single space each. We're now down
         e#   to three dimensions:
         e#    - Rows of the 2x2 meta-grid.
         e#    - Rows of each 1x2 block of the meta-grid.
         e#    - Characters in each row of those blocks.
  :z     e#   Transpose the blocks, i.e. turn the 1x2 blocks into a list of
         e#   columns of their characters.
  z      e#   Transpose the outer grid, i.e. turn it into a list of pairs of
         e#   corresponding columns in the two 1x2 blocks.
  Sf*    e#   Join each pair of columns with a single space. We've now got the
         e#   new grid we're looking for, but it's a list of columns, i.e. transposed.
  z      e#   Fix that by transposing the entire grid once more.
}I
N*       e# Join the rows of the grid with linefeeds.
S'#er    e# Replace all spaces with #.

3

MATL , 42 41 bayt

'.#'4:He!XIiP"Iq@=wX*1X@WZ(l5MY(]3Lt3$)Q)

Çevrimiçi deneyin!

açıklama

Bu , her bir yinelemedeki diziyi genişletmek için bir Kronecker ürünü kullanarak yinelemeli olarak çalışır . Dizi ile inşa edilmiştir 0ve 1yerine .ve #ve sonunda onlar uygun karakterlerle değiştirilir.

Giriş boyutu kadar çok yineleme olacaktır. Giriş sağdan sola işlenir. Yineleme endeksi başlar 1.

Sınamadaki örneği kullanarak, girdi ile [2,0], dizi şu şekilde başlatılır:

1 2
3 4

Bu , bir satır ve bir sütun tarafından genişletilen ilk 1( #) öğesine karşılık gelir; Bu sütunlardaki değerlerin üzerine yazılmayacakları için önemli değildir; eşit derecede olabilirler:

1 1
1 1

Her bir yinelemede, mevcut dizi, 1girişin geçerli girişi 0ve diğer girişlerde belirtilen konumda bulunan 2 × 2 sıfır bir dizi ile Kronecker çarpımı ile çarpılır . Yineleme i = 1'deki örnekte, en sağdaki giriş girişi olduğundan 0, sıfır-bir dizi

1 0
0 0

ve bu iki dizinin Kronecker ürünü

 1 1 0 0
 1 1 0 0
 0 0 0 0
 0 0 0 0

Ardından, dizine sahip satır ve sütun 2^ibunlarla doldurulur:

 1 1 0 0
 1 1 1 1
 0 1 0 0
 0 1 0 0

İlk üç satır ve sütun, ilk yinelemenin sonucunu oluşturur. Daha önce olduğu gibi, diziyi bir sonraki yinelemede genişletmek için yararlı olan fazladan bir satır ve sütun vardır.

Yineleme i = 2'de, geçerli giriş değeri 2yukarıdaki diziyi içerdiğinden Kronecker ile çarpılır

0 0
1 0

hangi verir

 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 1 1 0 0 0 0 0 0
 1 1 1 1 0 0 0 0
 0 1 0 0 0 0 0 0
 0 1 0 0 0 0 0 0

2^iSatır ve sütunu doldurma

 0 0 0 1 0 0 0 0
 0 0 0 1 0 0 0 0
 0 0 0 1 0 0 0 0
 1 1 1 1 1 1 1 1
 1 1 0 1 0 0 0 0
 1 1 1 1 0 0 0 0
 0 1 0 1 0 0 0 0
 0 1 0 1 0 0 0 0

Bu son yineleme olduğundan, fazla satır ve sütun kaldırılır:

 0 0 0 1 0 0 0
 0 0 0 1 0 0 0
 0 0 0 1 0 0 0
 1 1 1 1 1 1 1
 1 1 0 1 0 0 0
 1 1 1 1 0 0 0
 0 1 0 1 0 0 0

ve sonuç yerine getirmek için karakter ikamesi yapılır:

...#...
...#...
...#...
#######
##.#...
####...
.#.#...

Kodun ayrıntılı açıklaması aşağıdaki gibidir:

'.#'      % Push this string. Will be indexed into
4:He!     % Push 2×2 array [1 2; 3 4]
XI        % Copy it into clipboard I
iP        % Input array and reverse it
"         % For each entry of the reversed input
  I       %   Push [1 2; 3 4] from clipboard I
  q       %   Subtract 1 to yield [0 1; 2 3]
  @=      %   Compare with current entry of the input. Gives 2×2 array
          %   with an entry equal to `1` and the rest `0`
  wX*     %   Swap. Kronecker product
  1       %   Push 1
  X@      %   Push iteration index, i
  W       %   Compute 2^i
  Z(      %   Write 1 into column 2^i
  l       %   Push 1
  5M      %   Push 2^i again
  Y(      %   Write 1 into row 2^i
]         % End for each
3Lt       % Push [1, -1j] (corresponding to index 1:end-1) twice
3$)       % Apply index. Removes last row and column
Q         % Add 1. Gives an array of values 1 and 2
)         % Index into initial string

2

Haskell, 123 122 bayt

unlines.foldr(#)["#"]
n#p=zipWith(++)(r++h:t)$('#':)<$>u++h:s where b='.'<$p<$p;h='#'<$p;(r:s:t:u:_)=drop n$cycle[p,b,b,b]

Kullanım örneği:

*Main> putStr $ (unlines.foldr(#)["#"]) [2,3,1]
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
###############
...#...#.......
...#...#.......
...#...#.......
########.......
...#.###.......
...#####.......
...#.#.#.......

Nasıl çalışır:

                ["#"]      -- starting with "#" 
        foldr(#)           -- fold the function # from the right into the input
unlines                    -- and join the result with newlines

n#p=                       -- helper function #
                           -- n: next index, p: fractal so far
    zipWith(++)            -- join the left and right part elementwise
       (r++h:t)            -- left part
       ('#':) <$> u++h:s   -- right part (prepend '#' to each line for vertical
                           -- separator

                           -- helper
b='.'<$p<$p                -- b is a blank square of the same size as p
h='#'<$p                   -- h is a line of '#' of the same length as p
(r:s:t:u:_)=               -- drop the first n elements of the infinite
    drop n$cycle[p,b,b,b]  --   list [p,b,b,b,p,b,b,b,p,b,b,b,...] and
                           --   assign the next 4 element to r,s,t,u.
                           --   As r,s,t,u are always inserted at the
                           --   same position in the fractal, we get the
                           --   variants by assigning different values.

1

JavaScript (ES6), 171 152 bayt

([d,...a],h=`#`,r=`replace`)=>d<4?(s=f(a)[r](/.+/g,s=>(t=s[r](/./g,`.`),d&1?t+h+s:s+h+t)),t=s[r](/.+/g,w=t+h+t),w=`
${w[r](/./g,h)}
`,d&2?t+w+s:s+w+t):h

Özyinelemeli çağrının sonucunu alır, ardından her satırı kendi kendine artı bir artı artı aynı uzunlukta bir dizi dize, gerekirse ters sırada değiştirir, ardından bu kısmi sonuç, satırsonu ve merkezi sütun dışında bir nokta dizisi oluşturur Ayrıca, çevreleyen yeni satırlara sahip bir karma dizesi ve ardından bu üç dizeyi uygun sırayla birleştirir.


1

Yakut, 143134 bayt

Anonim bir işlev.

İlk satırın yeniden düzenlenmesi ile kaydedilen 1 bayt. Z'nin bir formülden bir tabloya artırılma şekli değiştirilerek kaydedilen 6 bayt Değişkenleri ortadan kaldırarak 2 bayt kurtardı w.

->a{r=-1+u=2<<a.size
s=(?.*r+$/)*r
a<<0
z=r*u/2-1
a.each{|i|r/=2
(-r..r).each{|j|s[z+j]=s[z+j*u]=?#}
z+=-r/2*[u+1,u-1,1-u,-u-1][i]}
s}

Test programında yönlendirilmemiş

f=->a{
  r=w=(u=2<<a.size)-1        #w=length of line excluding newline, u=length of line including newline.
  s=(?.*w+$/)*w              #initialize string s with w rows of w dots terminated by newlines.
  z=w*u/2-1                  #z is the centre of the fractal
  a<<0                       #add a dummy value to the end of a
  a.each{|i|                 #for each element in a
    r/=2                     #r is the radius of the current iteration: ....15,7,3,1
    (-r..r).each{|j|         #for j=-r to r
      s[z+j]=s[z+j*u]=?#     #overwrite . with #, forming horizontal and vertical lines
    }
    z+=-r/2*(u+1)+           #move z to centre of upper left quarter (where it should be if i=0)
      i%2*(q=r+1)+           #move across if i=1,3
      i/2%2*q*u              #and down if i=2,3  
  }
s}                           #return string

puts $/,f[[]]

puts $/,f[[0]]

puts $/,f[[3]]

puts $/,f[[2,0]]

puts $/,f[[1,1]]

puts $/,f[[1,2,0]]

puts $/,f[[3,3,1]]

puts $/,f[[0,1,2,3]]

puts $/,f[[0,0,1,2,3]]

0

Yakut, 150 bayt

Anonim işlev. Dizeler listesi, her satırda bir dize oluşturmak için özyinelemeli bir çağrı kullanır, ardından sonunda bir araya gelir.

->i{f=->l{s=2**l.size-1;g=[[?.*s]*s]*4;m=->x,y{x.zip(y).map{|a,b|a+?#+b}}
s<1?[?#]:(g[l.shift]=f[l];m[*g[0,2]]+[?#*(2*s+1)]+m[*g[2,2]])}
f[i].join"
"}

0

Python 3.5, 1151 bayt:

Pek bir kod golf, ama oh iyi. Zaman içinde daha fazla budama yapmaya çalışacağım.

def x(s):
 y=[''];l=['#'];k=[' ']
 for z in s[::-1]:y.append(z)
 y=y[::-1]
 for h in range(len(y)):
  if y[-1]!='':u=(int(y.pop())&3)
  else:u=y.pop()
  if len(l)<2:k.append(u);p=((2**(len(k)-1))-1);l.append((('.'*p+'#'+'.'*p+'\n')*p)+'#'*((p*2)+1)+'\n'+(('.'*p+'#'+'.'*p+'\n')*p))
  else:
   if len(l)>2:del l[0]
   p=((2**(len(k)-1))-1);a=[[_+i for i in range(p)]for _ in range(len(l[1]))if _%((p*2)+2)==0 and _!=(((p*2)+2)*(p))];b=[[_+i for i in range(p)]for _ in range(len(l[1]))if _%(int(((p*2)+2)/2))==0 and _!=(int(((p*2)+2)/2)*((p)*2))and _ not in[g for i in a for g in i]];W=[g for i in a[:len(a)-(int(len(a)/2)):1]for g in i];B=[g for i in b[:len(b)-(int(len(b)/2)):1]for g in i];C=[g for i in a[len(a)-(int(len(a)/2)):len(a):1]for g in i];T=[g for i in b[len(b)-(int(len(b)/2)):len(b):1]for g in i];f=list(l[1])
   for i in list(''.join(l[0].split())):
    if u==0:f[W[0]]=i;del W[0]
    elif u==1:f[B[0]]=i;del B[0]
    elif u==2:f[C[0]]=i;del C[0]
    elif u==3:f[T[0]]=i;del T[0]
   del l[0];k.append(u);p=((2**(len(k)-1))-1);l.append(''.join(f));l.append((('.'*p+'#'+'.'*p+'\n')*p)+'#'*((p*2)+1)+'\n'+(('.'*p+'#'+'.'*p+'\n')*p))
 print(l[-2])

Oldukça naif bir yol şu anda mükemmel bir şekilde çalışıyor ve, gördüğünüz gibi kullanır, her şeye rağmen, bunu ancak bunlarla hiçbir dış modüller / kütüphaneler. Ayrıca, üzerinde alabilir şekilde sağlanan listede en fazla 5 öğe sherhangi doğruluğu (olduğundan, donanım Yönetebil) kaybetmeden. Tüm gereksinimleri karşılar ve sahip olduğum şeyden daha mutlu olamazdım. :)

Ayrıca artık aralıktaki 0=>3herhangi bir sayıyı değerlerden herhangi biri olarak kabul etmekle kalmaz, aynı zamanda &bitwise operatörü sayesinde herhangi bir sayı , süre de kabul edebilir ! Burada onlar hakkında daha fazla bilgi edinebilirsiniz . Şimdi, örneğin, [4,4,1,2,3]giriş listesi olarak ise aynı şekilde [0,0,1,2,3].

Not: Girdi gerekir liste olarak sağlanacak

Açıklanamayan:

def x(s):
 # Create 3 lists:
 # `y` is for the values of `s` (the list provided) and an empty element for the 
 # first pattern
 # `l` is reserved for the pattersn created through each item in list `y`
 # `k` is created for the value of `p` which is the main value through which the 
 # pattern is created.
 y=[''];l=['#'];k=[' ']
 # Reverse s, and then add each element from `s` to `y` 
 # (in addition to the empty element) 
 for z in s[::-1]:
     y.append(z)
 # `y` should now equal the list created, but reversed
 # If not reversed, then, if, for instance, the input is `0,1,2` and list `y` 
 # therefore contains `'',2,1,0`, the empty element will be called at the end, 
 # which is NOT what we want.
 y=y[::-1]
 # The main loop; will be iterated through the length of `y` number of times
 for h in range(len(y)):
  # Here is where each element from the end of `y` is recieved as `u` for 
  # use in the pattern in each iteration.
  # As you can also see, a bitwise operator (`&`) is used here so that 
  # ALL numbers can be accepted. Not just those in the range `0-4`.     
  # However, that will happen only if the value of y[-1] (the last elment in y) is 
  # NOT ''.
  if y[-1]!='':
      u=(int(y.pop())&3)
  else:
      u=y.pop()
  # If the length of list `l` is less than 2 
  # (which means it only contains `#`), then do the following:
  if len(l)<2:
      # Append `u` to `k`
      k.append(u)
      # Use the length of `k` as `n` in the operation `(2^(n-1)-1)` to get the 
      # length of the dot filled part of the new pattern.
      p=((2**(len(k)-1))-1)
      # Add that pattern to the list (currently empty, 
      # i.e. containing no other pattern in any other quadrant)
      l.append((('.'*p+'#'+'.'*p+'\n')*p)+'#'*((p*2)+1)+'\n'+(('.'*p+'#'+'.'*p+'\n')*p))
  # Now, if the length of l is >=2, do the following:
  else:
   # If the length of l is >2, then delete the first element in list `l` 
   # (this will happen only once, when the `#` is still the first element)
   if len(l)>2:
       del l[0]
   # Again, use the length of `k` as `n` in the operation `(2^(n-1)-1)`
   # to get the length of the dot filled part of the pattern.
   p=((2**(len(k)-1))-1)
   # Create a list with all the index values of all the dot elements on the left hand 
   # side of the grid l[-1], and the index value + i where i is every integer in 
   # the range `0-p` (this way, it will create lists within a list, each 
   # which contain `p` number of integers, which are all indexes of all the dots on 
   # the very left side of the grid) 
   a=[[_+i for i in range(p)]for _ in range(len(l[1]))if _%((p
      *2)+2)==0 and _!=(((p*2)+2)*(p))]
   # Create another list with all the index values of the dots using the same 
   # strategy as above, but this time, those in the right half of the grid. 
   b=[[_+i for i in range(p)]for _ in range(len(l[1]))if _%(int(((p*2)+2)/2))==0 
      and _!=(int(((p*2)+2)/2)*((p)*2))and _ not in[g for i in a for g in i]]
   # Create 4 lists, each containing index values specific to each of the 
   # 4 quadrants of the grid.
   # W is the list, based on A, containing all the indexes for the 1st quadrant of 
   # the grid in l[-1] containing dots (index 0 in the grid)
   W=[g for i in a[:len(a)-(int(len(a)/2)):1]for g in i]
   # B is the list, this time based on b, containing all indexes for the 2nd 
   # dot-filled quadrant of the grid l[-1] (index 1 in the grid)
   B=[g for i in b[:len(b)-(int(len(b)/2)):1]for g in i]
   # C is the list, also, like W, based on a, containg all the index values for 
   # the 3rd dot-filled quadrant of the grid in l[-1] (index 2 in the grid)
   C=[g for i in a[len(a)-(int(len(a)/2)):len(a):1]for g in i]
   # T is the final list, which, also like B, is based on b, and contains all the 
   # index values for the final (4th) dot-filled quadrant of the grid in l[-1] 
   T=[g for i in b[len(b)-(int(len(b)/2)):len(b):1]for g in i];f=list(l[1])
   # Finally, in this `for` loop, utilize all the above lists to create the new 
   # pattern, using the last two elements in list `l`, where each character of grid 
   # l[-2] (the second to last element) is added to the correct index of grid l[-1] 
   # based on the value of `u`
   for i in list(''.join(l[0].split())):
    if u==0:
        f[W[0]]=i
        del W[0]
    elif u==1:
        f[B[0]]=i
        del B[0]
    elif u==2:
        f[C[0]]=i
        del C[0]
    elif u==3:
        f[T[0]]=i
        del T[0]
   # Delete the very first element of `l`, as it is now not needed anymore
   del l[0]
   # Append `u` to list`k` at the end of the loop this time
   k.append(u)
   # Update the value of `p` with the new value of length(k)
   p=((2**(len(k)-1))-1)
   # Append the new patter created from the for-loop above to list `l`
   l.append(''.join(f))
   # Append a new, empty pattern to list `l` for use in the next iteration
   l.append((('.'*p+'#'+'.'*p+'\n')*p)+'#'*((p*2)+1)+'\n'+(('.'*p+'#'+'.'*p+'\n')*p))
 # When the above main loop is all finished, print out the second-to-last elment in 
 # list `l` as the very last element is the new, empty grid created just in case 
 # there is another iteration
 print(l[-2])

Daha geniş ve çok daha görsel olarak çekici açıklama:

Daha geniş ve daha görsel olarak çekici bir açıklama için, giriş kodunun bulunduğu yukarıdaki koddaki "ana" - döngüden ikinci kez geçmeyi düşünün [0,2]. Bu durumda, "ana" listedeki öğeler lşöyle olur:

.#.
###
##.

ve

...#...
...#...
...#...
#######
...#...
...#...
...#...

ve liste yyalnızca içerirdi 0. Python'un ızgaranın son elemanını endeksleme yolundan yararlanarak, ızgaranın l[-1]en sol elemanlarını şöyle etiketleyebiliriz :

 0 ...#...\n 7        
 8 ...#...\n 15
16 ...#...\n 23
   #######\n <- Ignore this as it is nothing but `#`s and a new line
32 ...#...\n 39
40 ...#...\n 47
48 ...#...\n 55

Hangi modeli görüyorsun? Izgaranın en solundaki her indeks 8'in katlarıdır ve denklemi kullanarak 2^(n-1)-1ızgaradaki noktaların her bir parçasının ((2^(n-1)-1)*2)+2uzunluğunu verdiğinden, ızgaranın üst kenarının uzunluğunu bir bütün olarak bulmak için yapabiliriz (+2 orta dahil #S ve \nsonunda). Biz diyoruz ki denklemi kullanabilirsiniz ibiz arayacak her tamsayı, bir listesini oluşturarak ve listeye ekleyerek her büyüklükteki bir ızgara sol tarafında her elemanın indeksi değerlerini bulmak için _aralığında, 0=>length of grid l[-1], öyle ki, bu öğe birden fazla iVE ayrıca _eşit OLMAYAN şekilde i*(2^(n-1)-1), böylece#s üst yarıyı alt yarısından ayırır. Ama TÜM nokta elemanlarını soldan istiyoruz, sadece sol taraftaki elemanları değil. Buna bir düzeltme var ve bu listeye i+hher aralıkta 0=>2^(n-1)bir değer 0=>length of grid l[-1]eklendiğinde h'nin aralıktaki her tam sayı olduğu bir listeye eklemek olacaktır , böylece her seferinde noktaya bir çeyrek daire uzunluğu kadar listeye eklenen çok sayıda değer. Ve bu liste a.

Ama şimdi, sağ yarısındaki noktalara ne dersiniz? Dizin oluşturmaya farklı bir şekilde bakalım:

   0 ...# 4  ...\n 7        
   8 ...# 12 ...\n 15
  16 ...# 20 ...\n 23
     #######\n <- Ignore this as it is nothing but `#`s and a new line
  32 ...# 36 ...\n 39
  40 ...# 44 ...\n 47
  48 ...# 52 ...\n 55

          ^
          | 

          These are the values we are looking at now

Gördüğünüz gibi, şimdi ortadaki değerler ihtiyacımız olan değerlerdir, çünkü bunlar ızgaranın sağ tarafındaki noktaların her bir bölümünün dizininin başlangıcıdır . Şimdi, buradaki desen nedir? Eğer yeterince açık değilse, şimdi orta değerlerin katları i/2! Bu bilgi ile, şimdi başka bir liste oluşturabilir, b, hangi katları i/2aralığından eklenir 0=>length of grid l[-1]tekrar arayacak bu aralık, her tamsayı öyle ki _, değil için eşit (i/2)*(p*2)çizgisini dışlamak için #üst ayıran s ve alt yarılar, VE gerçekten _, 8,16,32, vb. listedeb. Ve şimdi, yine, sadece bu belirli indeksleri istemiyoruz. Izgaranın sağ tarafında TÜM nokta karakterleri istiyoruz. Listede yaptığımız gibi a, burada da aralıktaki her tamsayının nerede olduğu liste blistelerine ekleyebiliriz ._+hh0=>2^(n-1)

Şimdi, hem listelerimiz var ave bpaketlenmiş ve gitmeye hazırız. Bunları şimdi nasıl bir araya getiririz? Listeleri budur W, T, G, ve Ciçeri. Bunlar ızgarada noktaların her özel kadranda için endeksler tutacaktır l[-1]. Örneğin W, listeyi ızgaranın 1. çeyreğine (dizin 0) eşit tüm dizinler için liste olarak ayıralım. Bu listede, listeden ilk 2^(n-1)listeleri ekleriz a, çünkü liste akılavuzun sol yarısındaki noktalar için tüm dizinleri içermekte ve sonra bunları Wşimdi (2^(n-1))*(2^(n-1))öğeler içerecek şekilde bölmektedir. Aynı şeyi liste için de yaparız T, ancak Tlisteden öğeler içerecek farkla b, çünküTçeyrek daire 2'ye (indeks 1) ayrılmıştır. Liste Glistesi ile aynı olacağını Wlisteden elementlerin kalanını içerecektir hariç ave liste Clistesi ile aynı Tşimdi listeden elemanları kalanını içeren hariç b. Ve bu kadar! Şimdi , ızgarada nokta içeren her çeyrek daire için dizin değerlerine sahibiz , bunların tümü her bir çeyreğe karşılık gelen dört listeye ayrılmıştır. Şimdi bu 4 listeyi (W, T, G, C), programa, ızgaradaki hangi karakterlerin , listenin ilk öğesi olan l[-1]ızgaradaki her karakterle değiştirmesi gerektiğini söylemek için kullanabiliriz . Değer burada olduğundan, ilk çeyrekte (dizin 0) tüm noktaları ızgara kullanma listesiyle değiştirirl[0]l0l[0]W.

Bu nedenle, nihayetinde aşağıdakiler var:

.#.#...
####...
##.#...
#######
...#...
...#...
...#...

Whew! Uzun süreç, değil mi? Ancak, mükemmel çalışıyor ve yine daha mutlu olamazdım. :)

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.