Sabit bir tuğla duvar inşa edin


39

Bir tuğla duvar, sıralar halinde istiflenmiş yatay olarak birer birer tuğladan yapılmış bir dikdörtgendir. İşte sağda gösterilen tuğla ölçülerine sahip, 4 ve eni 8 olan bir duvar.

[______][______]    4 4
[__][____][__][]    2 3 2 1
[][______][____]    1 4 3
[____][______][]    3 4 1

Bu duvar sabit değildir, çünkü tuğlalar arasında iki dikey çatlak bulunan, tuğlaları çevreleyen tuğlalarda parenslerle gösterilen bir hata vardır .

[______][______]    
[__][____)(__][]
[][______)(____]
[____][______][]

Fakat sağdaki 1 numara tuğlaları çevreleyen çatlaklar bir hata oluşturmaz, çünkü bunlar bir sıra ile ayrılır.

Belirtilen boyutlarda tuğlalardan yapılmış sabit bir duvar bulan ve görüntüleyen kodu yazın. En az bayt kazanır.

Giriş

Boş olmayan bir tuğla ebat listesi (pozitif sayılar) ve en az 2 olan bir yükseklik. Alternatif olarak, her boyutta bir tuğla sayisi alabilirsiniz.

Çıktı

Verilen tüm tuğlaları kullanan, istenen yükseklikte sabit bir dikdörtgen duvar resmi. Yazdır veya yeni satırlı bir dize olarak döndür.

N boyutunda bir tuğlayı 2n karakter, alt çizgi ise parantez ile çizin.

1: []
2: [__]
3: [____]
4: [______]
...

Girişin en az bir çözüme sahip olması garanti edilir. Birden fazla varsa, hala sadece bir duvar çizmelisin.

Zaman kısıtlaması yoktur; istediğiniz kadar kaba kuvvet kullanın. Algoritmanız teoride her büyüklükteki girdiler üzerinde çalışmalıdır.

Test durumları:

Birden fazla çözüm var, bu nedenle çıktılarınız farklı olabilir.

>> [1, 1, 2, 2], 2
[][__]
[__][]

>> [1, 1, 1, 2, 2, 2, 2, 3], 2
[__][____][__]
[][__][][__][]

>> [1, 1, 2, 2, 3, 3, 3, 3], 3
[][__][____]
[__][____][]
[____][____]

>> [1, 2, 3, 4, 5, 6, 7, 8, 9], 5
[][______________]
[__][____________]
[________________]
[____][__________]
[______][________]

>> [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]

n> 1 karakter yerine 2n genişliğinde tuğla yapmaya neden karar verdin?
Sparr

2
@Sparr 1'e 2 karakter blokları kabaca kare görünür. Zorunlu olmaya çalıştım n>1ve test durumlarını nasıl kısıtladığını beğenmedim. Ayrıca, görünüşe göre emsal var .
xnor

N> 1 ile 2n demek istemiyorum. N> 1 ile n demek.
Sparr

Yanıtlar:


20

Perl, 166 170 194

Larry Wall tarafından oluşturulan bir dil için mükemmel bir görev.

#!perl -pa
$_=(1x($x=2/($y=pop@F)*map{1..$_}@F)."
")x$y;sub
f{my$l=$_;$-|=!@_;for$=(@_){$Z=__
x~-$=;$f=0;s/(11){$=}/[$Z]/&!/\]..{$x}\[/s&&f(grep$=ne$_||$f++,@_);$-or$_=$l}}f@F

Kaba kuvvet, ancak test durumlarda oldukça hızlı (<1s). Kullanımı:

$ perl ~/wall.pl <<<"1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 5"
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]

Beni test et .


9
Ha, acaba Larry Wall hiç insanların böyle bir dil kullanacaklarını düşündü mü ... :)
crazyhatfish

12

CJam, 94 92 82 bayt

Bu 92 byte versiyonudur. 82 bayt sürümü takip ediyor.

l~1$,:L,:)m*{1bL=},\e!\m*{~W<{/(\e_}%}%{::+)-!},{{_,,\f<1fb}%2ew{:&,(},!}={{(2*'_*'[\']}/N}/

Bu, tuğlaları mümkün olan her şekilde ayırır ve sadece geçerli olanı alır. Şimdilik oldukça kaba kuvvet, ancak son test senaryosunu makinemdeki Java Tercümanında yaklaşık 10 saniye içinde çalıştırıyor .

Açıklama :

Kod 5 bölüme ayrılmıştır:

1) Bir dizi uzunluk verilmişse L, hepsini nasıl bölümlere ayırabiliriz H.

l~1$,:L,:)m*{1bL=},
l~                     e# Read the input as string and evaluate it.
  `$,:L                e# Copy the array and take its length. Store that in L
       ,:)             e# Get an array of 1 to L
          m*           e# Cartesian power of array 1 to L of size H (height of wall)
            {1bL=},    e# Take only those parts whose sum is L

Bundan sonra, giriş dizimizi H tuğla katmanlarına ayırmanın olası tüm yollarını bulduk.

2) Girdi dizisinin tüm izinlerini alın ve ardından tüm izinler için tüm bölümleri alın

\e!\m*{~W<{/(\e_}%}%
\e!                    e# Put the input array on top of stack and get all its permutations
   \m*                 e# Put the all possible partition array on top and to cartesian
                       e# product of the two permutations. At this point, every
                       e# permutation of the input array is linked up with every
                       e# permutation of splitting L sized array into H parts
      {           }%   e# Run each permutation pair through this
       ~W<             e# Unwrap and remove the last part from the partition permutation
          {     }%     e# For each part of parts permutation array
           /           e# Split the input array permutation into size of that part
            (\         e# Take out the first part and put the rest of the parts on top
              e_       e# Flatten the rest of the parts so that in next loop, they can be
                       e# split into next part length

Bundan sonra, giriş tuğlalarının tüm mizanpajlarını bir Hkatman tuğla duvarına yerleştirdik.

3) Yalnızca tuğla uzunlukları aynı olan düzenleri filtreleyin

{::+)-!},
{      },              e# Filter all brick layouts on this condition
 ::+                   e# Add up brick sizes in each layer
    )-!                e# This checks if the array contains all same lengths.

Bu filtrenin bitiminden sonra kalan tüm düzenler mükemmel dikdörtgenler olur.

4) Stabilite kriterlerine uyan ilk tuğla düzenini alın

{{_,,\f<1fb}%2ew{:&,(},!}=
{                       }=   e# Choose the first array element that leaves truthy on stack
 {         }%                e# For each brick layer
  _,,                        e# Create an array of 0 to layer length - 1
     \f<                     e# Get all sublists starting at 0 and ending at 0
                             e# through length - 1
        1fb                  e# Get sum of each sub list. This gives us the cumulative
                             e# length of each brick crack except for the last one
           2ew               e# Pair up crack lengths for every adjacent layer
              {    },        e# Filter layer pairs
               :&            e# See if any cumulative crack length is same in any two
                             e# adjacent layers. This means that the layout is unstable
                 ,(          e# make sure that length of union'd crack lengths is greater
                             e# than 1. 1 because 0 will always be there.
                     !       e# If any layer is filtered through this filter,
                             e# it means that the layer is unstable. Thus negation

Bu adımdan sonra, düzeni basmamız yeterlidir

5) Düzeni yazdır

{{(2*'_*'[\']}/N}/
{               }/           e# For each brick layer
 {           }/              e# For each brick
  (2*'_*                     e# Get the (brick size - 1) * 2 underscores
        '[\']                e# Surround with []
               N             e# Newline after each layer

Burada çevrimiçi deneyin


82 bayt

l~:H;{e_mrH({H-X$,+(mr)/(\e_}%_::+)-X${_,,\f<1fb}%2ew{:&,(},+,}g{{(2*'_*'[\']}/N}/

Bu neredeyse 92 baytlık versiyona benziyor, ancak rastgele bir dokunuş var. 92 bayt sürümünün açıklamasını okuduysanız, 82 bayt sürümünde, bölüm 3, 4 ve 5 tamamen aynıdır, ancak bölüm 1 ve 2'deki tüm permütasyonları yinelemek yerine, bu sürüm rastgele olarak yalnızca bir tanesini oluşturur. Her seferinde permütasyon, bölüm 3 ve 4'ü kullanarak test eder ve bölüm 3 ve 4'ün testleri başarısız olursa süreci yeniden başlatır.

Bu, ilk 3 test durumu için sonuçları çok hızlı yazdırır. Height = 5 test durumu henüz bilgisayarımda bir çıktı vermiyor.

Farkın açıklaması

l~:H;{e_mrH({H-X$,+(mr)/(\e_}%_::+)-X${_,,\f<1fb}%2ew{:&,(},+,}g
l~:H;                           e# Eval the input and store the height in H
     {   ...   }g               e# A do-while loop to iterate until a solution is found
      e_mr                      e# Flatten the array and shuffle it.
          H({               }%  e# This is the random partition generation loop
                                e# Run the loop height - 1 times to get height parts
             H-X$,+(            e# While generating a random size of this partition, we
                                e# have to make sure that the remaining parts get at least
                                e# 1 brick. Thus, this calculation
                    mr)         e# Get a random size. Make sure its at least 1
                       /(\e_    e# Similar to 92's part 2. Split, pop, swap and flatten

_::+)-                          e# 92's part 3. Copy and see if all elements are same
      X${_,,\f<1fb}%2ew{:&,(},  e# 92's part 4. Copy and see if layers are stable
+,                              e# Both part 3 and 4 return empty array if
                                e# the layout is desirable. join the two arrays and
                                e# take length. If length is 0, stop the do-while

Bu sürüm için fikir randomra tarafından verildi (Get it?)

Bunu çevrimiçi olarak deneyin


9

Python 2,680 670 660 bayt

Neden bu kadar uzun "golf" oynamakta ısrar ediyorum bilmiyorum ... ama neyse, işte gidiyorsun.

M,L,R,N=map,len,range,None
exec"J=@:M(''.join,x);B=@:'['+'_'*2*~-x+']';K=@:M(B,x);W=@:J(M(K,x));C=@:set(M(sum,[x[:i]for i in R(L(x))]))-{0};T=@,w:w[x:]+w[:x]\ndef F(i):f=filter(@:i[x-1]&i[x],R(1,L(i)));return f and f[0]".replace('@','lambda x')
def P(e,x,i,w,h):
 for j in[-~_%h for _ in R(i-1,h+i-2)]:
    for s in R(w):
     if not e&C(T(s,x[j])):return j,s
 return N,N
def b(l,h):
 w,d=[[]for _ in R(h)],2*sum(l)/h
 for _ in l[::-1]:q=M(L,W(w));w[[q.index(i)for i in sorted(q)if i+L(B(_))<=d][-1]]+=_,
 g=M(C,w);i=F(g)
 while i:
    e=g[i-1];j,s=P(e,w,i,d,h)
    if j!=N:w[j]=T(s,w[j]);w[i],w[j]=w[j],w[i];g=M(C,w);i=F(g)
    else:b(T(-1,l),h);return
 print'\n'.join(W(w))

Bu, çıktının sıralı artan düzende olmasını gerektirir ve üzerinden çağrılır b(brick_sizes, height).

Test durumları:

>>> tests = [([1, 1, 2, 2], 2),([1, 1, 1, 2, 2, 2, 2, 3], 2), ([1, 1, 2, 2, 3, 3, 3, 3], 3), ([1, 2, 3, 4, 5, 6, 7, 8, 9], 5), ([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5)]
>>> for t in tests:
...     b(*t); print
... 
[__][]
[][__]

[____][__][__]
[][][__][__][]

[____][____]
[__][__][][]
[____][____]

[________________]
[______________][]
[____________][__]
[__________][____]
[________][______]

[__][__][]
[][__][__]
[__][__][]
[][__][__]
[__][__][]

Bu şekilde çalışır:

  1. Tuğlaları (en uzun> en kısa) katmanlara atayın, bir sonrakine geçmeden önce her bir katmanı doldurmaya çalışın.
  2. Bitişik katmanlar ne zaman kararsızsa, işe yarayan bir şey bulana kadar katmanları değiştirmeyi ve tuğlaları değiştirmeyi deneyin.
  3. Hiçbir şey işe yaramazsa, en uzun tuğlayı ebatlar listesinin önüne getirin ve tekrarlayın.

1
Muhtemelen continuesonuna kadar düşebilirsin . Ayrıca return(N,N)parantez gerekmez.
PurkkaKoodari

İyi görüşme - continuedaha önceki bir sürümden kalma bir emanetti.
sirpercival

1
Çalıştırmak mümkün değil, içeride bir yabancı parantez var Wve Tekstra bir argüman geçiyor.
crazyhatfish

ağrıyor, teşekkür ederim! sabit.
sirpercival

5

Haskell, 262 bayt

import Data.List
c=concat
n=init.scanl1(+)
1%l=[[[l]]]
n%l=[map(h:)(c$(n-1)%t)|(h,t)<-map(`splitAt`l)[1..length l]]
v[x]=1<2
v(x:y:z)=sum x==sum y&&n x==n x\\n y&&v(y:z)
l#n=unlines$map(>>=(\b->'[':replicate(2*b-2)'_'++"]"))$head$filter v$c.(n%)=<<permutations l

Örnek kullanım:

*Main> putStr $  [1, 2, 3, 4, 5, 6, 7, 8, 9] # 5
[______][________]
[__________][____]
[____________][__]
[][______________]
[________________]

*Main> putStr $ [1, 1, 2, 2, 3, 3, 3, 3] # 3
[____][____]
[__][__][][]
[____][____]

Nasıl çalışır: ana işlevi #bir listesini alır l(tuğla listesi) ve bir sayı h(yükseklik) ve tüm permütasyon böler liçine holası tüm pozisyonlarda sublists (fonksiyonuyla %, örneğin 2%[1,2,3,4]-> [ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ]). İki ardışık öğenin aynı toplamda (yani tuğlalarda aynı uzunlukta) olduğu ve alt toplamların listelerinde ortak öğelerin olmadığı (yani çatlakların hizalanmadığı, işlev görmediği) olanları tutar v. Bir dizi tuğlaya uyan ve bir tuğla dizisi yapan ilk listeye katılın.


4

Python 2, 528 , 417 , 393 , 381

Çok uzun, bruteforce çözümü. İşe yarıyor ama bununla ilgili, evren son test durumunun sonucunu almadan önce son bulabilir.

exec u"from itertools import*;m=map;g=@w,n:([[w]],[[w[:i]]+s#i?range(1,len(w))#s?g(w[i:],n-1)])[n>1];r=@x:set(m(sum,[x[:i]#i?range(1,len(x))]));f=@w:1-all(m(@(x,y):not x&y,zip(m(r,w[:-1]),m(r,w[1:]))));a=@s,h:['\\n'.join([''.join(['[%s]'%(' '*(s-1)*2)#s?r])#r?o])#p?permutations(s)#o?g(p,h)if len(set([sum(r)#r?o]))<2 and~-f(o)][0]".translate({64:u"lambda ",35:u" for ",63:u" in "})

a ana işlevidir:

>> a([1, 1, 2, 2], 2)
'[][  ]\n[  ][]'

İçe aktarma işlemini değiştirerek ve çağrıdan from itertools import*kaldırarak 4 bayt kaydedebilirsiniz . Ayrıca, sondaki s, 13 byte'ı kurtarmak için ... olarak değiştirilebilir . itertools.permutationsifif all(x==w[0] for x in w)and~-f(o):return
PurkkaKoodari

Ayrıca, fher zaman ilk tekrarlamaya geri dönmüyor mu? Bu garip görünüyor. Bir böcek ya da büyük bir golf fırsatı.
PurkkaKoodari

Bir operatörü çevreleyen bir fiyat teklifi / parantez / dirsek öncesi veya sonrasında çıkarılabilecek bir ton dışı alanınız var. Ayrıca t=0iki kez de atadınız r(); Bu işlevi map(sum,[x[:i] for i in range(len(x))])tek bir astar olarak yapabilirsiniz (isterseniz lamdaja uygun). İsdisjoint ve set'leri kullanmak f()önemli ölçüde azaltacaktır ( f()şu anda bir hata bulup bulmadığı sadece bir testten sonra da geri döner). Şahsen ya da onun f()gibi bir şeyi yeniden yazardım return not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:])))).
sirpercival

@ Pietu1998 Ah evet, bir boşluk özledim. Tavsiyeler için teşekkürler, bu şeyleri görebilmenize şaşırdım.
crazyhatfish

çok kötü gülmek "evrenin sonucu almadan önce son bulabileceği" türdeki kodlardan nefret ediyorum ama bu en kısa baytlar için başka ne yapmalı xD
Abr001am

3

JavaScript (ES6) 222 232 265 279 319

Hala golf oynamak için. Bu, tüm çözümleri bulur, en son çıkanı üretir ve oldukça hızlıdır.

Test etmek için Firefox'ta pasajı çalıştırın

f=(n,h,b=[],s=0)=>
  (R=(z,l,p,k,t)=>
    z?b.map((v,a)=>
      v&&k.indexOf(v=t+a)<0&v<=s&&(
        --b[a],h=l+`[${'__'.repeat(a-1)}]`,
        v-s?R(z,h,[...p,v],k,v):R(z-1,h+'\n',[],p,0),
        ++b[a]
      ))
    :n=l
  )(h,'',[],[],0,n.map(n=>(b[n]=-~b[n],s+=n)),s/=h)&&n

// Test suite


out=x=>OUT.innerHTML=OUT.innerHTML+x+'\n'

;[ 
 [[1, 1, 2, 2], 2], [[1, 1, 1, 2, 2, 2, 2, 3], 2], [[1, 1, 2, 2, 3, 3, 3, 3], 3]
,[[1, 2, 3, 4, 5, 6, 7, 8, 9], 5], [[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5]]
.forEach(([a,b])=>out(a+' '+b+'\n'+f(a,b)))
<pre id=OUT></pre>

Ungolfed ve açıkladı

function f(n, h) {
  var b=[], s=0, result // in golfed version will re-use n for result variable
  n.forEach(function (n) {
    b[n] = -~b[n] // group equal input numbers in buckets
    s+=n          // calc sum of input numbers
  });
  // example of buckets: input 1,1,4,1,5,4 -> b[1]=3,b[4]=2,b[5]=1
  s /= h // total sum / height => sum expected for each brick layer

  // recursive scan function 
  function R(z, // layer count, from h downto 1
             l, // output so far
             p, // current layer partial sums array, mark intervals between bricks
             k, // prev layer parial sums, checked to avoid faulds
             t  // current partial sum 
             ) 
  {
    if (z > 0) 
    { // still building
      b.forEach( function (v,a) { // a:number from input list, v: repeat count 
        var w, m   // locals (in golfed version, reuse other variables avoid defining locals)
        w = t + a; // increased running total for current layer
        if (v != 0  // repeat count still > 0 
           && k.indexOf(w) < 0 // running total not found on list in prev layer (no fault)
           && w <= s) // current layer length not exceeded
        {
           --b[a]; // decrease repeat count, number used one more time
           m = l+"["+ '__'.repeat(a-1) + "]"; // new output with a brick added
           // l is not changed, it will be used again in this loop
           if (w == s) 
           {   // layer complete, go to next (if any)
               // recurse, new layer, add newline to output, p goes in k, and t start at 0 again
               R(z-1, m+'\n', [], p, 0); 
           }
           else
           {   // layer still to complete
               // recurse, same layer, m goes in l, add current sum to array p
               R(z, m, [...p,w], k, w);
           }
           ++b[a]; // restore value of repeat count for current loop
        }
      })
    }   
    else
    { // z == 0, all layers Ok, solution found, save in result and go on to next
      result = l;
    }
  }

  R(h,'',[],[],0);
  return result; // this is the last solution found
}

2

Python 2, ızgara yöntemi (290 karakter)

x,h=input()
from itertools import *
w = sum(x)*2/h
for p in permutations(x):
 bricks = ''.join('[' + '_'*(2*n-2) + ']' for n in p)
 cols = map(''.join,zip(*zip(*[iter(bricks)]*w)))
 if all(c=='[' for c in cols[0]) and all(c==']' for c in cols[-1]) and not any(']]' in col or '[[' in col for col in cols[1:-1]):
  print('\n'.join(map(''.join,zip(*cols))))
  print()

Buradaki yöntem, ızgarayı transpoze etmek ve sütunlarda bir [[veya ]]herhangi bir yeri aramaktır. Ayrıca, duvarın sol ve sağ tarafındaki tüm tuğlaların aynı hizada olduğunu test edersiniz: Buradaki sevimli şey bir ipin tüm unsurlarının aynı olduğunu test etmektir:'[[[[[['.strip('[')==''


Yukarıdaki mini versiyon:

x,h=input()
from itertools import*
w=sum(x)*2/h
z=zip
j=''.join
for p in permutations(x):
 C=map(j,z(*z(*[iter(j('['+'_'*(2*n-2)+']'for n in p))]*w)))
 if C[0].strip('[')==''and C[-1].strip(']')==''and not any(']]'in c or '[['in c for c in C[1:-1]):
  print('\n'.join(map(j,z(*C))))
  break

Bu muhtemelen bir matris manipülasyon dilinde daha kolay yapılabilir.

... veya "uçtaki hizalama blokları" koşulunu "çatlak yok" koşuluyla birleştirmemizi sağlayan regex'leri kötüye kullanma:

Duvarın genişliğinin w = 6 olduğunu söyleyin. "[..... [" ve ​​"] .....]" alt dizgilerinin yerleri tam olarak {0, w-1, w, 2w-1,2w, 3w-1 kümesi olmalıdır. ..}. Bu noktalarda olmamak, tuğlanın 'linewrap' anlamına geldiği anlamına gelir:

       v
[][__][_
___][__]
       ^

Bu noktalarda bulunmamak, duvarda sabit olmayan bir 'çatlak' olduğu anlamına gelir:

     vv
[][__][]
[    ][]
     ^^

Bu nedenle, soru setlerinin düzenli ifade eşleşmesinin indeksleri olduğu denklem seti problemini azaltırız.

# assume input is x and height is h

from itertools import *
import re
w=sum(x)*2/h

STACKED_BRACKET_RE = r'(?=\[.{%i}\[|\].{%i}\])'%(w-1,w-1)  # ]....] or [....[
STRING_CHUNK_RE = '.{%i}'%w  # chunk a string with a regex!
bracketGoal = set().union(*[(x*w,x*w+w-1) for x in range(h-1)])  # expected match locations

for p in permutations(x):
 string = ''.join('['+'_'*(2*n-2)+']'for n in p)
 bracketPositions = {m.start() for m in re.finditer(STACKED_BRACKET_RE,string)}
 print(string, bracketPositions, bracketGoal, STACKED_BRACKET_RE) #debug
 if bracketPositions==bracketGoal:
  break

print('\n'.join(re.findall(STRING_CHUNK_RE,string)))

Python, regexp yöntemi (304 karakter):

from itertools import*
import re
x,h=input()
w=sum(x)*2/h
for p in permutations(x):
 s=''.join('['+'_'*(2*n-2)+']'for n in p)
 if {m.start()for m in re.finditer(r'(?=\[.{%i}\[|\].{%i}\])'%(w-1,w-1),s)}==set().union(*[(x*w,x*w+w-1) for x in range(h-1)]):
  break

print('\n'.join(re.findall('.{%i}'%w,s)))

Hataları kontrol etmek için doğrudan duvar resmi ile çalışmak ilginç bir fikir. Gibi girişi almak için bir satıra ihtiyacınız var x,h=input().
xnor

0

Matlab (359)

function p(V),L=perms(V);x=sum(V);D=find(rem(x./(1:x),1)==0);for z= 2:numel(D-1)for y=1:numel(L),x=L(y,:);i=D(z);b=x;l=numel(x);for j=1:l,for k=j-1:-1:2,m=sum(x(1:k));if mod(m,i),if mod(m,i)<mod(sum(x(1:k-1)),i)||sum(x(1:j))-m==i,b=0;,end,end,end,end,if b,for j=1:l,fprintf('[%.*s]%c',(b(j)-2)+b(j),ones(9)*'_',(mod(sum(x(1:j)),i)<1)*10);end,return,end;end,end

Giriş

bir tamsayı vektörü, örnek: p ([1 1 2 2 3])

Çıktı

duvar örneğinin şeması:

[____]

[__][]

[][__]
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.