Bir milyonun altındaki astarların listesi


56

Bu benim ilk kod golf sorumu ve bu konuda çok basit bir soru, bu yüzden herhangi bir topluluk kurallarını ihlal etmiş olsam, şimdiden özür dilerim.

Görev artan sırayla tüm asal sayıları bir milyondan daha az basmaktır. Çıktı formatı, çıktı satırı başına bir sayı olmalıdır.

Amaç, çoğu kod golf başvurusunda olduğu gibi, kod boyutunu en aza indirmektir. Çalışma zamanı için optimizasyon da bir bonus, ancak ikincil bir amaçtır.


12
Bu kesin bir kopya değil, fakat aslında sadece bir takım varolan soruların bir bileşeni olan ilkellik testidir (örneğin, codegolf.stackexchange.com/questions/113 , codegolf.stackexchange.com/questions/5087 , codegolf.stackexchange. com / sorular / 1977 ). Yeterince takip edilmeyen bir kılavuz (FWIW) (daha iyi bilen insanlar tarafından bile olsa) meta kumlama meta.codegolf.stackexchange.com/questions/423 adresinde bir soru olarak öneride bulunma eleştirisi ve nasıl olabileceğinin tartışılması için insanlar cevap vermeye başlamadan önce gelişme gösterdi.
Peter Taylor

Ah, evet, bu sorunun zaten asal sayı ile ilgili soruların bolluğuna çok benzemesi konusunda endişelendim.
Delan Azabani

2
@ GlennRanders-Pehrson Çünkü 10^6daha kısa;)
14:14

1
Birkaç yıl önce, C harfinde
Computronium

1
@ ɐɔıʇǝɥʇuʎs Nasıl yapılır 1e6:-D
Titus

Yanıtlar:


33

Mathematica , 17 24

Sadece karşılaştırma için:

Prime@Range@78498

Bir yorumda belirtildiği gibi, her satırda bir asal sayı sağlamadım; düzeltme:

Column@Prime@Range@78498

4
Prime~Array~78498ayrıca 17 :)
chyanog

Eğer serbest bırakılsaydı, mthmede dokuz byte olur.
Michael Stern,

Bu, çıktı satırı başına bir asal koşulu ihlal ediyor. 8 ek karakter pahasına, uzun bir listenin çıktısını önlemek için ile ön ek Print/@ve sonlandırma . ;Null
celtschk

@celtschk Bunu beş yıl önce kaçırdım mı yoksa yoksaydım mı bilmiyorum.
Sayın Sihirbaz,

1
Şey, kesinlikle beş yıl önce olduğunu özledim :-)
celtschk

27

Python 3, 46 bayt

k=P=1
while k<1e6:P%k and print(k);P*=k*k;k+=1

Döngü sınamaya ulaştığında k, kare-faktörü yinelemeli olarak hesaplamıştır P=(k-1)!^2. Eğer kasal, o zaman üründe görünmüyor 1 * 2 * ... * (k-1), bu yüzden bir faktör değil P. Ancak, eğer kompozit ise, tüm asal faktörleri üründe daha küçüktür. Kare alma sadece k=4sahte olarak asal olarak adlandırılmaması için gereklidir .

Daha da kuvvetli, Wilson'un Teoreminden sonra kasal olduğunda P%keşittir demektir 1. Burada sadece sıfır olmadığına rağmen, genel olarak asal P%kolup olmadığına dair bir gösterge değişkeni olması faydalıdır k.


23

C, 61 karakter

Neredeyse tam olarak bu aynı (soru da tamamen aynıdır).

n=2;main(m){n<1e6&&main(m<2?printf("%d\n",n),n:n%m?m-1:n++);}

Got SEG-FAULTbaskı sonrası881
manav mn

7
@Manav, belki de optimizasyon olmadan derlediniz. Özyinelemeyi kaldıracak iyi bir optimize ediciye dayanır.
ugoren

4
Evet sorunu çözmek -O3için ekleyerek gcc!!
manav mn

Bu yöntem delilik. Onu seviyorum.
Todd Lehman

2
Seni 57 bayta ulaştırabilirimn=2;main(m){n<1e6&&main(m<2?printf("%d\n",n),n:m-++n%m);}
Albert Renshaw

22

MATLAB (16) (12)

Ne yazık ki, bu tek bir satırda çıkıyor:

primes(1000000)

ama bu basit bir matris devrik tarafından çözülür:

primes(1000000)'

ve bazı karakterleri üstel gösterim kullanarak (yorumlarda önerildiği şekilde) kesebilirim:

primes(1e6)'

5
Burada da yardım etmek 1e6yerine kullanmak 1000000.
Orion

@orion Yani o 11 karakter yapacak
Axoren

Bu içermez @Axoren 'sonunda
Stan Strum

20

Bash (37 karakter)

seq 2 1e6|factor|sed 's/.*: //g;/ /d'

(60 karakter)

seq 2 1000000|factor|sed -e 's/[0-9]*: //g' -e '/^.* .*$/ d'

bilgisayarımda (2.0 GHz işlemci, 2 GB ram) 14 saniye sürüyor.


Bu geliştirilebilir:seq 2 1000000|factor|sed 's/[0-9]*: //g;/^.* .*$/ d'
Delan Azabani

Evet haklısın. Sed komutumu temiz yazdım, golf atmadım: P
saeedn

3
seq 1e6|factor|awk '$0=$2*!$3'biraz daha kısa.
Dennis,

1
seq, factor ve sed, harici programlardır, bu, c pc'nin kediyle bir bağlantı noktası olduğu ve p'nin, bir milyona kadar olan primerleri içeren bir metin dosyası olduğu durumlarda olabilir ... bunu kabuk yerleşikleriyle yapabilir misiniz?
technosaurus

7
@technosaurus seqve factoriçinde coreutils, bu yüzden meşru. sedaynı zamanda oldukça yaygındır. coreutilsbir yerleşik gibi tedavi edilebilir. Coreutils olmadan Bash, STL'siz C ++ gibidir.

16

J, 21 karakter

1[\p:i.(_1 p:1000000)

kısaltılabilir

1[\p:i.78498

1000000'ün altında kaç tane primer olduğunu biliyorsanız.


2
Enfile öğelerini kullanarak ,., 1 yerine [\\ karakter kaydetmek için. Gereksiz parantez çıkarın ve üstel biçimi kullanın: 1e6.
Omar,

,.i.&.(p:^:_1)1e6Bununla geldi: Daha kısa değil (@Omar'ın tavsiyelerini uyguladıktan sonra) ama ilginç olanı kullandım.
17'de

10

PowerShell, 47 44 bayt

Çok yavaş, ama bulabildiğim en kısa sürede.

$p=2..1e6;$p|?{$n=$_;!($p-lt$_|?{!($n%$_)})}

PowerShell, 123 bayt

Bu çok daha hızlı; optimal olmaktan uzak, ancak verimlilik ve kısalık arasında iyi bir uzlaşma.

 $p=2..1e6;$n=0
 while(1){$p=@($p[0..$n]|?{$_})+($p[($n+1)..($p.count-1)]|?{$_%$p[$n]});$n++;if($n-ge($p.count-1)){break}}
 $p


9

Bash, 30 bayt

Yana saeedn onun yaklaşımından daha kısa ve daha hızlı olduğunu - - benim öneri harekete geçmez Ben kendi yanıt sonrası düşündüm:

seq 1e6|factor|awk '$0=$2*!$3'

Nasıl çalışır

seq 1e6

1.000.000'a kadar tüm pozitif tamsayıları listeler.

factor

tek tek onları faktörler. İlk on için, çıktı aşağıdaki gibidir:

1:
2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5

En sonunda,

awk '$0=$2*!$3'

çizginin tamamını ( $0) ikinci alanın ürününe (ilk ana faktör) ve üçüncü alanın mantıksal olumsuzluğuna ( 1eğer bir ana faktör ya da daha azsa 0) değiştirir.

Bu, asal sayılara karşılık gelen satırları, sayının kendisiyle ve diğer tüm satırları sıfırlarla değiştirir. Awk yalnızca truthy değerleri yazdırdığından, yalnızca asal sayı yazdırılır.


4
awk '$0=$2*!$3'çok garip!
yeti

8

Ruby 50 41

require'mathn'
p (2..1e6).select &:prime?

2
Gerek yok .to_agibi Enumerable zaten içerir select. Daha fazla kısaltmak için #to_proc Sembolü kısayol gösterimini de kullanabilirsiniz : p (2..1e6).select &:prime?(1 asal değildir)
Ventero

@Ventero çok teşekkürler! # # __Proc sembolü hakkında hiçbir şey bilmiyordum. Ruby'nin sunduğu kısayollara daha fazla dikkat etmeliyim.
Cristian Lupascu

2
Daha kısa versiyonu require'prime';p Prime.take 78498.
Hauleth

@ AsukaszNiemier Harika! Bence çok farklı bir cevap olarak gönderebilirsin.
Cristian Lupascu

Bazı iyi ol 'country boy mathn' in iyi kullanımı
DoctorHeckle

8

Bash, 37

Daha çok golf oynayabilirsem ...

Bunun çoğu factorgarip çıktı biçimini ayrıştırmaya çalışıyor .

seq 1e6|factor|grep -oP "(?<=: )\d+$"

Makinemde tamamlanması 5.7 saniye sürüyor.

(Sadece bu oldu benim konu en birinci ... cevapların ikinci sayfasında gitmek, bu yüzden kimse bunu görecek)

Eski çözüm

Bu daha uzun ve daha yavaş (10 saniye sürer).

seq 1e6|factor|egrep ':.\S+$'|grep -oE '\S+$'

2
Vay - Ben daha factorönce hiç karşılaşmadım , ama işte tam orada coreutils!
Dijital Travma

1
Bir karakterle tıraş olun: seq 1e6|factor|grep -oP "(?<=: )\d+$"perl grep ile
Dijital Travma

@DigitalTrauma bu nasıl çalışır

1
-PPerl tarzı regex'ler sağlar. (?<=: )Bir olan pozitif olan ileriye dönük dizesi ":". Temel olarak bu, ":" ifadesinin eşleşmeden önce gelmesi gerektiğini \d+$, ancak aslında eşleşmenin bir parçası olmadığını, yani -oseçenek bize yalnızca iki noktadan sonra eşleşen bir sayı verir, yani yalnızca bir faktör, yani asal olan sayıları verir.
Dijital Travma

@DigitalTrauma eklendi

8

Python 3.x: 66 karakter

for k in range(2,10**6):
 if all(k%f for f in range(2,k)):print(k)

Daha verimli çözüm: 87 karakter

Eratostenlerin Eleklerine Göre.

p=[];z=range(2,10**6)
while z:f=z[0];p+=[f];z=[k for k in z if k%f]
for k in p:print(k)

1
İlki hatalı şekilde basıyor 0ve 1. Bunu kullanarak düzeltebilirsiniz range(2,10**6). Ayrıca, ififadenin dışarıdan ayrı bir satırda olması gerektiğini forya da bir hata yaptığınızı düşünüyorum.
xnor

@ xnor: Düzeltildi.
dan04 20

8

Haskell, 51

mapM print [n|n<-[2..10^6],all((>0).rem n)[2..n-1]]

Değişebilirsin mapM_için mapM, dönüş değeri yazdırılır olmayacak ve bu Kod Golf olduğunu. ;)
Dogbert

neden baskıdan sonra ve içinde (> 0) fazladan boşluk var?
Gurur haskeller

güzel yakalayış! teşekkürler
pt2121

999999'u 10 ^ 6 ile değiştirebilirsiniz. Ve lütfen bayt sayınızı güncelleyin - 63 muhtemelen doğru olamaz.
user2845840

@ user2845840 tamam, teşekkürler. İyi bir fikir!
pt2121,

8

APL, 15

p~,p∘.×p←1↓⍳1e6

Tercümanım hafıza problemleriyle karşılaştı, ama teoride çalışıyor.


Nasıl? Bir çekişme verebilir misin?
Rasmus Damgaard Nielsen

Bir ihtiyaç satır başına bir numara yapmak için önünde ve ihtiyacınız yok ,.
Adám

@RasmusDamgaardNielsen ilk tamsayılardır. 1↓ilkini düşürür. p←p atar. p∘.×pçarpım tablosu yapar. p~sağdaki her neyden p kaldırır. ( ,gerekli değildir, masayı bir listeye
sokar

8

Perl, 49 bayt

Düzenli ifade kung fu :)

for(1..1E6){(1x$_)=~/^(11+?)\1+$/ or print"$_\n"}

Ungolfed versiyonu:

for(1 .. 1_000_000) { 
    (1x$_) =~ /^(11+?)\1+$/ or print "$_\n";
}

Bu yazıyı yazarken bile% 10 ilerleme kaydetmedi!

Regex'in kaynağı: http://montreal.pm.org/tech/neil_kandalgaonkar.shtml


2
perl6 sürümü yazmak için bana ilham verdi. ayrıca, 1000000yazılabilir10**6
pabo

1
Ayrıca, 1000000 1E6
mafya

Cevabım güncellendi. Thanks @mob
Gowtham

Her zaman benim en sevdiğim regex'imdi, ancak daha yüksek rakamlara ulaştığınızda görkemli bir şekilde başarısız olduğunu hatırlamalısınız - çünkü çok büyük rakamları birliğe çeviriyor. Bu regex, yüzbinlerce ve daha sonra, dilin yapılandırmasına bağlı olarak (ve makinenizin)
ilkeleri bulmak için çalışmayabilir

7

Julia, 11

primes(10^6)

Görünüşe göre yerleşik ins upvotes, artı daha uzun cevaplar için daha fazla kelime gerekiyordu.


7

J (15 veya 9)

Bu Mathematica'yı yendiğine inanamıyorum ( 2 karakterlik bir single olsa bile )

a#~1 p:a=:i.1e6

Veya:

p:i.78498

1
... The output format should be one number per line of output.Bu yüzden cevabım başlıyor 1[\ .
Gareth

6

gs2, 5 bayt

CP437'de kodlanmış:

∟)◄lT

1C 29bir milyonu zorlar 11 6C, asalları aşağıdadır, 54şov çizgileridir.


5

GolfScript, 22/20 (20/19) bayt

n(6?,:|2>{(.p|%-.}do:n

Hız pahasına, kod iki bayt daha kısa yapılabilir:

n(6?,:|2>.{|%2>-}/n*

Düzenlenen soruda belirtilen çıktı formatı göz ardı edilirse (mevcut cevapların çoğu budur), hızlı sürümde iki bayt kaydedilebilir ve yavaş olana bir tanesi kaydedilebilir:

n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`

Bu, hızlı sürüm için hazırlayıcılardan sonra ek bir LF yazdıracak ve hazırlıkları yavaş olan için bir dizi olarak yazacaktır.

Nasıl çalışır

Her iki versiyon da , Eratosthenes elek uygulamalarıdır .

Hızlı versiyon aşağıdakileri yapar:

  1. Set A = [ 2 3 4 … 999,999 ]ve | = [ 0 1 2 … 999,999 ].

  2. Ayarla N = A[0]ve yazdır N.

  3. Her n'ninci elemanı toplamak |içinde C. Bunlar katları N.

  4. Set A = A - C.

  5. ABoş değilse , 2'ye geri dönün.

n(6?   # Push "\n".pop() ** 6 = 1,000,000.
,:|    # Push | = [ 0 1 2 … 999,999 ].
,2>    # Push A = [ 2 3 4 … 999,999 ].
{      #
  (    # Unshift the first element (“N”) of “A”.
  .p   # Print “N”.
  |%   # Collect every N-th element from “A” into a new array, starting with the first.
  -    # Take the set difference of “A” and the array from above.
  .    # Duplicate the set difference.
}do    # If the set difference is non-empty, repeat.
:n     # Store the empty string in “n”, so no final LF will get printed.

Yavaş versiyon benzer şekilde çalışır, ancak “A” minimum katlarını (her zaman asal olan) art arda kaldırmak yerine, 1.000.000'in altındaki tüm pozitif tamsayıların katlarını kaldırır.

Rekabet

İlkelliği çarpanlara ayırmak ya da kontrol etmek için herhangi bir yerleşik matematiksel işlev yoksa, tüm GolfScript çözümleri ya çok büyük ya da çok verimsiz olacaktır.

Hala verimli olmaktan uzak olsa da, iyi bir hız / boyut oranına ulaştığımı düşünüyorum. Sunulduğu tarihte, bu yaklaşım, yukarıda belirtilen yerleşiklerin hiçbirini kullanmayanların en kısa olduğu görülmektedir. Diyorum görünüyor ben bazı yanıtlar nasıl çalıştığını hiçbir fikrim yok çünkü ...

Gönderilen dört GolfScript çözümünün hepsini kıyaslamıştım: w0lf's (deneme bölümü), diğer cevabım (Wilson teoremi) ve bu cevabın ikisi. Sonuçlar bunlardı:

Bound     | Trial division     | Sieve (slow)       | Wilson's theorem | Sieve (fast)
----------+--------------------+--------------------+------------------+----------------
1,000     | 2.47 s             | 0.06 s             | 0.03 s           | 0.03 s
10,000    | 246.06 s (4.1 m)   | 1.49 s             | 0.38 s           | 0.14 s
20,000    | 1006.83 s (16.8 m) | 5.22 s             | 1.41 s           | 0.38 s
100,000   | ~ 7 h (estimated)  | 104.65 (1.7 m)     | 35.20 s          | 5.82 s
1,000,000 | ~ 29 d (estimated) | 111136.97s (3.1 h) | 3695.92 s (1 h)  | 418.24 s (7 m)

"Yavaş" elek sadece bir Eratosthenes Elek midir?
dorukayhan

İkiside. Yavaş sürüm sadece korkunç bir uygulamadır.
Dennis,

5

NARS2000 APL, 7 karakter

⍸0π⍳1e6

3
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz!
Dennis,

4

Golf Betiği 26 25 24

Düzenleme (Peter Taylor sayesinde bir karakter daha kaydetti):

10 6?,{:x,{)x\%!},,2=},`

Eski kod:

10 6?,{.,{)\.@%!},,2=*},`

Bu kod, inanılmaz derecede yavaş ve verimsiz olduğu için yalnızca teorik değere sahiptir. Çalıştırmanın saatler alabileceğini düşünüyorum.

Test etmek istiyorsanız, örneğin sadece 100'e kadar olan astarları deneyin:

10 2?,{:x,{)x\%!},,2=},`

Sen değiştirerek bir karakter kaydedebilirsiniz \;ile *. (Geçerli karakter sayısı için hepsinden ziyade ilk böleni bularak daha da hızlı olabilirsiniz:10 6?,2>{.),2>{1$\%!}?=},`
Peter Taylor

@PeterTaylor Teşekkürler, çarpma kullanarak çok temiz bir hile var.
Cristian Lupascu

Bir değişkenle birlikte bir tane daha char char tasarrufu var: .,ile :x,ve \.@ile değiştirin x\ (boşluklar yorumlarda MD ile ilgili sorunların çıkması nedeniyle) ve kaldırın *.
Peter Taylor

@ PeterTaylor iyi bir, teşekkürler! Kodumu değiştirdim.
Cristian Lupascu

4

CJam - 11

1e6,{mp},N*

1e6,- 0 ... 999999 dizisi
{mp},- asal sayıları seç
N*- yeni satırlara katıl


1
CJam bu sorudan daha yeni değil mi?
Peter Taylor

@PeterTaylor oh, evet öyle
aditsu

4

GolfScript, 25 (24) bayt

!10 6?,2>{.(@*.)@%!},n*\;

Düzenlenen soruda belirtilen çıktı formatı göz ardı edilirse, bir bayt kaydedilebilir:

!10 6?,2>{.(@*.)@%!},`\;

Bu, astarları, her satırda bir diziden ziyade bir dizi olarak (diğer birçok çözümde olduğu gibi) basacaktır.

Nasıl çalışır

Genel düşünce kullanmaktır Wilson'un teoremini belirtiyor, n > 1 asal ve ancak eğer

                                                      (n - 1)!  = -1 (mod n)

!     # Push the logical NOT of the empty string (1). This is an accumulator.
10 6? # Push 10**6 = 1,000,000.
,2>   # Push [ 2 3 4 … 999,999 ].
{     # For each “N” in this array:
  .(  # Push “N - 1”.
  @   # Rotate the accumulator on top of the stack.
  *   # Multiply it with “N - 1”. The accumulator now hold “(N - 1)!”.
  .)  # Push “(N - 1)! + 1”
  @   # Rotate “N” on top of the stack.
  %!  # Push the logical NOT of “((N - 1)! + 1) % N”.
},    # Collect all “N” for which “((N - 1)! + 1) % N == 0” in an array.
n*    # Join that array by LF.
\;    # Discard the accumulator.

Deneyler

Deneme bölümünden daha hızlı, ancak Eratosthenes'in eleklerinden daha yavaş. Diğer cevabımı gör .



3

C, 91 88 85 82 81 80 76 72 karakter

main(i,j,b){for(;i++<1e6;b++&&printf("%d\n",i))for(j=2;j<i;)b=i%j++&&b;}

Algoritma son derece verimsiz, ancak önemli olmaması gereken kod-golf yaptığımızdan.


1
kolayca kısaltabilirsiniz: main(i,j,b){for(;i++<1e6;b++&&printf("%d\n",i))for(j=2;j<i;)b=i%j++&&b;}ya da böyle bir fikir (aslında onu derlemediğim için)
Ali1S232

i0 olacağından nasıl emin olabilirsiniz? Herhangi bir argüman sağlarsanız , başarısız olacağını düşünüyorum. Ayrıca, bir jtür hata olacağına inanıyorum . bYine de emin değilim .
Outgolfer Erik,

3

Mathematica 25

Asıl sayıyı 10 ^ 6'dan az bilmediğinizi varsayarsak:

Prime@Range@PrimePi[10^6]

3

J, 16 karakter

1]\(#~1&p:)i.1e6

Çıkış formatı gereksinimi olmadan, bu 13 karaktere düşürülebilir :

(#~1&p:)i.1e6

1]\ sadece bir priming dizisi rütbesini alır, onu bir rütbe 2 dizisine çevirir ve her bir üssü kendi satırına koyar - ve böylece tercümanın varsayılan çıktı biçimi, bir satır listesini her satır için bir üsse dönüştürür.

(#~ f) ytemelde filter, fiçindeki her öğe için bir boole döndürür y. i.1e6tamsayıların aralığıdır (0,1000000) ve primerler 1&p:için 1 döndüren bir boolean işlevdir.


3

R, 45 43 karakter

for(i in 2:1e6)if(sum(!i%%2:i)<2)cat(i," ")

2'den 1e6'ya kadar olan her x sayısı için, yalnızca x'e eşit olan x mod 2 - x sayısı 2'den küçükse, çıktı verin.


Bu kod tarafından üretilen ilk sayı 1'dir, ancak 1 asal değildir.
Sven Hohenstein

@SvenHohenstein Teşekkürler, düzeltildi.
plannapus

3

Bash (433643)

Benim (o kadar akıllıca olmayan) denemem, ürünü etkilemek için faktör kullanmaktı.

factor ${PRODUCT}

Ne yazık ki, büyük sayılarla ürün elbette çok büyük. Ayrıca çalıştırmak için 12 saatten fazla sürdü. Yine de göndermeye karar verdim çünkü eşsiz olduğunu düşündüm.

İşte tam kod.

Altı yaşın altındaki asal sayılırsa makul olur.

  factor 30

Oh, denedim.


+1 Bu cevap gerçekten şeytani. Oldukça önceden hesaplanmamış bir sonuç (oldukça fazla karakter tasarrufu sağlar) ve hesaplanması çok daha korkunç :) Muhtemelen, optimizasyonun factortemel deneme bölme algoritmasından çok daha kötü performans göstermesine neden olan bir örnek .
orion

3

C #, 70

Enumerable.Range(1,1e6).Where(n=>Enumerable.Range(2,n).All(x=>x%n!=0))

Uzun süredir burada çok fazla görmeyeceksin ...


Bunun yanlış olmasının birkaç nedeni var. (1) örtük bir gelen dönüştüremezsiniz double 1e6bir etmek int, ancak intgereklidir Range. (2) İç Rangeen çok n-2terim almalıdır , aksi halde n % nhangisinin net olduğunu test edeceksiniz 0. (3) İstediğin x%nzaman yazıyorsun n%x. Bu sorunları çözmek, bunun gibi bir şey işe yarayacaktır: Enumerable.Range(2,999999).Where(n=>Enumerable.Range(2,n-2).All(x=>n%x!=0))Ancak, bu yine de sayıları vermez; gereksinim satır başına birdi.
Jeppe Stig Nielsen
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.