ASCII bağlı altıgenler


21

genel bakış

Bir dizi altıgenler göz önüne alındığında, bunları 50 x 50 ASCII sanat görüntüsünün sınırları içinde bağlı bir şekle getirin. Seçtiğiniz şekil, bağlı olduğu sürece - golf oynamaya en uygun olanı bulursanız - keyfi olabilir. Bir altıgenden daha büyük olmaları koşuluyla delikleri olabilir (aksi takdirde altıgenlerin sayısı belirsiz olacaktır).


düzen

Tüm altıgenler aşağıdaki biçimde olmalıdır (yalnızca bu boyut ve yönlendirme geçerlidir):

 __
/  \
\__/    Note there are 2 underscores per horizontal edge.

İki altıgen, bir kenarı paylaşırlarsa doğrudan bağlanır :

 __               __
/  \__           /  \
\__/  \          \__/
   \__/    or    /  \
                 \__/

İki altıgen, yalnızca bir tepe noktasını paylaşıyorsa bağlı değildir:

 __  __
/  \/  \
\__/\__/

Yarım kenarın paylaşılması da bağlı olarak sayılmaz:

 __
/  \
\__/
 /  \
 \__/

Altıgenler koleksiyonu olduğu bağlı sadece kullanan başka herhangi bir altıgen bir yol vardır eğer doğrudan bağlıdır altıgenler.

delikler

Bağlı altıgenler koleksiyonundaki altıgen boyutlu bir delik, altıgen olarak sayılır, böylece herhangi bir ASCII sanat eserinin açık bir altıgen sayısı vardır.

Bu mu değil ileriye dönük delik tek altıgen olduğundan bir delik olarak saymak:

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      7 hexagons (not 6 with a hole)

Bu , tek bir altıgene karşılık gelmediği için bir delik olarak sayılır:

    __
 __/  \__
/  \__/  \__
\__/  \__/  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/      8 hexagons with a hole

Giriş ve çıkış

Giriş

1 ile 255 arasında bir tam sayı.

Çıktı

Yukarıda açıklandığı gibi bağlı altıgenlerin giriş sayısını temsil eden bir ASCII art dizesi.

  • Satır sayısı (satır satırından ayrılan alt satırlar) en fazla 50, ayrıca isteğe bağlı bir satır sonundan daha uzun.
  • Satırların aynı uzunlukta olması gerekmez, ancak her birinin uzunluğu en fazla 50 olmalıdır.
  • Toplam satır sayısı 50'yi aşmadığı sürece, sıfır uzunluklu satırlar bağlı şeklin üstünde veya altında bulunabilir.
  • Toplam satır sayısı 50'yi geçmediği sürece, yalnızca boşluk satırları bağlı şeklin üstünde veya altında bulunabilir.
  • Satır uzunlukları 50'yi aşmadığı sürece şeklin solunda boşluklar görünebilir (şeklin sola hizalanması gerekmez).
  • Satır uzunlukları 50'yi aşmadığı sürece şeklin sağında boşluklar görünebilir.
  • Bağlı şeklin bir parçasını oluşturmayan tüm karakterler boşluk veya yeni satır olmalıdır.

Çıktı doğru olduğu takdirde, bir çalışmadan diğerine tutarlı olmak gerekli değildir.

Örnekler

Giriş: 6

Geçerli Çıkışlar:

 __    __    __
/  \__/  \__/  \__
\__/  \__/  \__/  \
   \__/  \__/  \__/

 __    __
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/

          __
 __      /  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/
      /  \
      \__/

Geçersiz Çıktılar:

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      Invalid for 6 as the centre hole counts as a 7th hexagon.

 __    __    __      __
/  \__/  \__/  \    /  \
\__/  \__/  \__/    \__/
   \__/  \__/                Invalid as the 6 hexagons are not connected.

 __    __    __  __
/  \__/  \__/  \/  \
\__/  \__/  \__/\__/
   \__/  \__/           Invalid as vertex touching does not count as connected.

 __    __       __
/  \__/  \     /  \
\__/  \__/     \__/
/  \__/  \
\__/  \__/
   \__/       Invalid as the 6 connected hexagons are not the only visible characters.

Kazanan

Bayt cinsinden en kısa geçerli cevap kazanır.


Liderler Sıralaması

( Martin büyük şerit snippet'ini kullanarak )


Herkesin ilk örnek çıktı modelini kullanmasından korkuyorum, çünkü muhtemelen en kolayı bu.
Fatalize

1
@Fatalize benim örnekleri sadece bir girdi için çalışır 6. 255Yatay altıgenler sırasının girişi için 50 ila 50 ASCII sanatına uymayacaktır.
trichoplax

50 karakter sınırına her ulaştığınızda yine de geri dönüp aşağıdaki satırları doldurabilirsiniz
Fatalize

1
@Fatalize Zorluk, koddaki bayt sayısını en aza indirmektir. Kalıpların basit olup olmadığını umursamıyorum, insanların neyi denediğini ve farklı dillere neyin uyduğunu görmek ilginç olacak.
trichoplax

@Fatalize: Kısa olup olmayacağını bilmiyorum, ancak daha "ilginç" bir cevap, altıgenleri yerleştirebileceğini ve böylece daha ilginç bir çıktı alabileceğini görmek için gerçek bir arama yapabilir.
Alex Van Liew

Yanıtlar:


13

CJam, 64 57 55 bayt

" __
/  \
\__/"N/{_SS/\+_47>S3*f{\+}_2>\@?}q~(*]:..e>N*

Burada test edin.

Bu sütun bazında aşağıdaki deseni oluşturur :

 __    __    __    __    __    __
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/

açıklama

Bu, Dennis'in birkaç ucundan.e> bir ASCII sanat çıktısı oluşturmak için kullanan mükemmel ucuna dayanmaktadır . Dediği gibi, .e>eleman olarak en fazla iki diziyi (veya dizeyi) alır ve boşluklar en düşük karakter koduna sahip olduğundan, bunu bir dize ızgarasına diğer karakterleri dayatmak için kullanabiliriz. Ayrıca, iki dizi aynı uzunluğa sahip değilse, daha uzun dizinin harici elemanları değişmeden kopyalanır. Bu, farklı desenlerin aynı boyutta olması gerekmediği anlamına gelir. Bunu iki boyutlu dizilere uygulamak için (son satırları sonuna kadar eklemek istemediğimiz için), .e>satırlara çift olarak uygulanır ..e>.

Kodun temel fikri N, doğru konuma taşınan tek bir altıgenin kopyalarını oluşturmaktır . Boş çizgileri önleyerek altıgeni dikey, boşlukları ekleyerek yatay olarak "hareket ettiriyoruz". İşimiz bittiğinde, tüm kopyaları güzel kullanarak :..e>(muhtemelen bir CJam programında kullandığım en uzun operatör) birlikte katlarız.

İşte kod:

" __
/  \
\__/"N/    e# Get a 2D character grid of the hexagon.
{          e# Read input N, repeat this block N-1 times.
  _        e#   Make a copy, so we leave the last hexagon on the stack.
  SS/\+    e#   Prepend two empty lines.
  _47>     e#   Make a copy and discard the first 47 lines.
  S3*f{\+} e#   Prepend 3 spaces to each line. This copy has been moved back to
           e#   the top and one column to the right.
  _2>      e#   Make a copy and discard another two lines.
  \@?      e#   If any lines were left after that, pick the copy in the next column,
           e#   otherwise, stay in the same column.
}q~(*      
]:..e>     e# Wrap all the hexagons in an array and fold them into a single grid.
N*         e# Join them with newline characters.

Dostum, bu golf dillerinden birini gerçekten öğrenmeliyim.
Alex Van Liew

@AlexVanLiew Yapmalısınız! :) Ancak, kod golf kazanma şansınızı arttırdığı için değil, CJam programlamak için eğlenceli olan güzel bir dil olduğundan ve yukarıdaki çözümün (ki oldukça zarif olduğunu düşünüyorum) başka bir dil bilmiyorum. mantıklı olurdu. ;)
Martin Ender

Muhtemelen Pyth veya her ikisini de öğrenirdim; ikisi de hemen hemen aynı şey mi, yoksa diğerlerinden daha mı iyi?
Alex Van Liew

@AlexVanLiew Çok fazla Pyth bilmiyorum, ama aynı şeyden çok uzak olduklarını biliyorum. CJam, yığın tabanlı bir dildir, ancak Pyth Python için bir kısayol olarak ortaya çıkmıştır (ancak şimdi kendi yerleşik setine sahiptir). Golf söz konusu olduğunda Pyth biraz üst ele sahip olabilir , ama kişisel olarak farklı bir paradigmada programlamayı gerçekten çok seviyorum, bu yüzden CJam'a bağlı kalacağım.
Martin Ender

Aha, anladım. Python'u çok iyi tanıyorum, bu yüzden Pyth öğrenmek istiyorum, ama zaman alırsam CJam'i de deneyeceğim!
Alex Van Liew

7

Python 2, 219207 karakter

b=bytearray(' ');h=['__ ','/  \\','\\__/'];k=range;x=input();g=[b*50for _ in k(50)]
for i in k(x):
 c=i*3%48+1;r=(i*3+1)/48*2+i%2
 for m in k(i>15,3):n=m==0;g[r+m][c+n:c+4-n]=h[m]
print"\n".join(map(str,g))

Stdin üzerine girdi alır.

Hemen hemen 50x50 boşluk ızgara oluşturur ve uygun yerlerde altıgenler çizer. 16. altıgen sonra ilk satırı gerekmez hkullanmak için (a 2B dizi olarak altıgen) i>15yerine 1 0, en aralığı başlatmak için c=i*3%48+1;r=(i*3+1)/48*2+i%2hesaplar ve c olumn ve r, ı başlatmak için gereken akım. nbir boole'dir ancak sınırları düzeltmek için bir tamsayı olarak kullanılır (çünkü h[0]üzerine yazmayı önlemek için yalnızca 3 karakterdir).

Bu durumdan oldukça memnunum, ilk sürümden bu yana yaklaşık 50 bayt tıraş ettim, özellikle a[x:y]=bsözdizimini hatırladığımda .

Çıktı (n = 30):

  __    __    __    __    __    __    __    __
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/  \__/
(plus 44 lines of spaces each 50 wide)

Boşluk arka hatları izin beri oluşturulmasını değiştirildi gsadece 50 oluşturmak için bytearrayyerine s 3+(x>1)+x/16*212 bayt kapalı tam gerekli satır sayısı, traş olan.


6

Swift 2.0, 601 591 bayt

import Cocoa
var a=Int(Process.arguments[1])!,b="/  \\__".join([String](count:9,repeatedValue:""))+"/",c="\\__/  ".join([String](count:9,repeatedValue:""))+"\\",d=c.startIndex,e=c.endIndex,j=[c.stringByReplacingOccurencesOfString("\\",withString:" ").stringByReplacingOccurencesOfString("/",withString:" ").substringToIndex(advance(d,3*a,e)),b.substringToIndex(advance(d,3*a+a%2,advance(e,-1)))]
while a>0{j+=[c.substringToIndex(advance(d,3*a+1,e)),b.substringToIndex(advance(d,3*a+(a+1)%2,e)]
a<=16 ?j+=[" "+j.removeLast().substringFromIndex(advance(d,1))]:()
a-=16}
for l in j{print(l)}

Koşmak: swift hexagons.swift 21

Çıktı:

 __    __    __    __    __    __    __    __    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/
   \__/  \__/  

Swift substringToIndexve stringByReplacingOccurencesOfStringçok fazla karakter al ...


Swift'i hiç bilmiyorum, ancak daha az kodla tekrarlayan dizeyi oluşturmak için bir yol yok mu?
Reto Koradi

Bir dize tekrarlamak için bildiğim tek yolu stringByPaddingToLength, ancak bu durumda tam dize yazmaktan 11 karakter daha uzun olurdu.
David Skrundz

6
Apple'ın aşırı ayrıntılı dize birleştirmesini gerçekten sevdiğini görüyorum. stringByAppendingStringObjective-C kadar kötü değil ama yine de ...
Fatalize

Kod golf dışında bu bir yöntem aramayı çok daha kolay hale getirir gibi olsa gerçekten güzel.
JustSid

4

C, 238 bayt

#define h(A) c[m+A/4][n+A%4]
i,m,n;
f(a)
{
    char c[50][51];
    for(i=0;i<50;i++)for(m=0;m<51;m++)c[i][m]=m-50?32:0;
    for(;a;)
        m=a/12*2,n=a%12*3,a--%2?m=a/12*2+1,n=a%12*3+3:0,
        h(1)=h(2)=h(9)=h(10)=95,h(4)=h(11)=47,h(7)=h(8)=92;
    for(;i;)puts(c-i--+50);
}

Karakter sayımı için yalnızca gerekli boşluklar ve yeni satırlar dikkate alınır.

Basitçe bir karakter matrisi oluşturur, bunları ters sırayla doldurur ve ardından her şeyi yazdırır.


2

JavaScript (ES6), 265 bayt

A=Array;f='forEach';U=x=1;y=0;a=A.from(A(51),_=>A.from(A(51),_=>' '));d=h=>(` __
/  \\
\\__/`.split`
`[f]((l,i)=>[...l][f]((c,j)=>{if('_/\\'.indexOf(a[x+i][y+j])<0)a[x+i][y+j]=c})),(x+=U*-2+1),(U=!U),(C-y<=3?((U=x+=2),y=0):y+=3),--h?d(h):a.map(d=>d.join``).join`
`)

Altıgenleri üst üste, soldan sağa, bir petek gibi - bir satırın sonuna ulaşana kadar yukarı ve aşağı doğru döşer.

Açıklamasız (firefox'ta çalışır):

'use strict';
const CAP = 51;
var a = Array.from(Array(51), () => Array.from(Array(51),() => ' '))

function draw (hexagons, x, y, a, up) {
  // x, y (row, col) represents the current position of the cursor
  /*
  
    Here's a map of the first three iterations:
    
            01234567
     0        __
     1     __/  \__
     2    /  \__/  \
     3    \__/  \__/

    For the first 17 iterations, the cursor will be at:
    
      # | x | y
      ----------
      1 | 1 | 0
      2 | 0 | 3
      3 | 1 | 6
      4 | 0 | 9
      5 | 1 | 12
      6 | 0 | 15
      7 | 1 | 18
      8 | 0 | 21
      9 | 1 | 24
     10 | 0 | 27
     11 | 1 | 30
     12 | 0 | 33
     13 | 1 | 36
     14 | 0 | 39
     15 | 1 | 42
     16 | 0 | 45
     17 | 3 | 0      <- moves back to the first row

  */
` __
/  \\
\\__/`
  // split the hexagon into three lines
  .split('\n').forEach((line, index) => {
    // and for each line
    ;[...line].forEach((char, j) => {
      // if the cursor position (x, y) translated
      // by (index, j) is not already part of a hexagon
      // then replace it with the current (index, j) piece
      // of the hexagon
      /*
         0123
       0  __
       1 /  \
       2 \__/
       
      */
      if ('_/\\'.indexOf(a[x + index][y + j]) < 0)
        a[x + index][y + j] = char
    })
  })
  
  // `up` represents the next hexagon
  // if true, the next hexagon will be drawn attached to
  // the top right edge of the current hexagon
  if (up) {
    x -= 1
  // otherwise, it'll be drawn attached to the bottom right edge
  } else {
    x += 1
  }

  // move three columns to the right
  y += 3
  // change directions
  up = !up

  // if within the right boundary of the 51x51 matrix,
  // move back to the left edge and down 2 rows
  // and draw the next hexagon as an `up` hexagon
  if (51 - y <= 3) {
    y = 0
    x += 2
    up = true
  }

  // if hexagons > 0, then recurse and draw the next hexagon
  // otherwise, return the array (join the columns in each row, then join each row
  // by a new line)
  return --hexagons ?
    draw(hexagons, x, y, a, up)
    : a.map(d => d.join('')).join('\n')
}

var n = parseInt(prompt('Number to draw:'))
var r = draw(n, 1, 0, a, true)
document.write('<pre>' + r.replace(/\n/g, '<br>') + '</pre>')


2

Yakut, 120

->n{a=(1..50).map{' '*50}
n.times{|i|x=i%16*3
3.times{|j|a[47-i/16*2-x/3+j][x..x+3]=[' __ ','/  \\','\__/'][j]}}
puts a}

50 boşluktan oluşan 50 dizeden oluşan bir dizi oluşturur, ardından altıgenleri eklemek için 3 satırda 4 karakter kullanır:

" __ "
"/  \"
"\__/"

İlk satır boşluk içerdiğinden, bir altıgen çizildikten sonra altına başka bir tane çizemeyiz, çünkü boşluklar önceki altıgenlerin üzerine yazacaktır.

Bu nedenle altıgenler, aşağıdan yukarıya doğru 16x16 eşkenar dörtgen (bozuk dikdörtgen) şeklinde ve soldan sağa doğru eğik olarak eklenir.

Daha " __ "sonra dizenin üzerine ek yazılacak\ ve /gerekli .

Test programında yönlendirilmemiş

g=->n{
  a=(1..50).map{' '*50}              #make an array of 50 strings of 50 spaces
  n.times{|i|                        #loop through all hexagons
    x=i%16*3                         #x coordinate of top left corner of hexagon, 16 per row
    3.times{|j|                      #loop through 3 lines to print hexagon.
      a[47-i/16*2-x/3+j][x..x+3]=    #47-i/16*2 : start at the bottom and work up. each row is 2 lines high and contains 16 hexagons. x/3 : slant upwards as the row moves right. 
       [' __ ','/  \\','\__/'][j]    #These are the symbols for each of the 3 lines required for a hexagon. [x..x+3] defines which characters have to be replaced in each string.
    }      
  }
  puts a                             #print to stdout
}

N=gets.to_i
g.call(N) 

Tipik çıktı (n = 250)

Toplam 50 yapmak için burada üstte birkaç satır daha boşluk olmalı, ancak Stackexchange'i bunları içerecek şekilde biçimlendirmenin bir yolu olup olmadığını bilmiyorum.

                                              __  
                                           __/  \ 
                                        __/  \__/ 
                                     __/  \__/  \ 
                            __    __/  \__/  \__/ 
                         __/  \__/  \__/  \__/  \ 
                      __/  \__/  \__/  \__/  \__/ 
                   __/  \__/  \__/  \__/  \__/  \ 
                __/  \__/  \__/  \__/  \__/  \__/ 
             __/  \__/  \__/  \__/  \__/  \__/  \ 
          __/  \__/  \__/  \__/  \__/  \__/  \__/ 
       __/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
    __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
 __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/       
\__/  \__/  \__/  \__/  \__/  \__/  \__/          
/  \__/  \__/  \__/  \__/  \__/  \__/             
\__/  \__/  \__/  \__/  \__/  \__/                
/  \__/  \__/  \__/  \__/  \__/                   
\__/  \__/  \__/  \__/  \__/                      
/  \__/  \__/  \__/  \__/                         
\__/  \__/  \__/  \__/                            
/  \__/  \__/  \__/                               
\__/  \__/  \__/                                  
/  \__/  \__/                                     
\__/  \__/                                        
/  \__/                                           
\__/                                              
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.