32 bit mimaride olası tüm sayıları içeren bir dosya verilir. Bu dosyada 4 numara eksik. 4 eksik numarayı bulun


22

Bu, birkaç kez rastladığım bir röportaj sorusu ve dört sayı eksik olduğu için nasıl çözüleceği konusunda emin değilim. Bir ya da iki sayının eksik olduğunu bulmak için kullanılan algoritmalara aşinayım, ancak ikisini de dördüne genelleştirmenin bir yolunu görmüyorum.


Yanıtlar:


19

Bir röportaj ya da gerçek bir iş için olsun, ilk önceliğiniz sizin için anlamlı bir çalışma çözümü olmalıdır . Yani genellikle size basit olduğunu düşünebilirsiniz ilk çözüm sunmak ve kolay için gerektiği anlamına gelir sen açıklamak.

Benim için bu sayıları sıralamak ve boşlukları taramak demektir . Ancak, iş sistemleri ve web uygulamaları üzerinde çalışıyorum. Bitlerle oynamıyorum ve ekibimin yapmasını istemiyorum!

Düşük seviyeli, metale yakın bir iş için röportaj yapıyorsanız, "sıralama" muhtemelen boş yıldızlarla karşılanacaktır. Bitler ve benzeri konular hakkında rahat düşünmenizi istiyorlar. İlk cevabınız "Ah, bir Bitmap kullanırım" olmalı. (Veya bit dizisi veya bit kümesi.)

Ve sonra, her iki şekilde de - "yanlış" bir çözüm sunsanız bile, görüşmeci (veya patronu!) Buna basarsa , yöneticinin özel ilgi alanına odaklanan bazı iyileştirmeler veya alternatifler önerebilirsiniz.

  • Ciddi sınırlı RAM? 512 MB'den az mı?
    Diskte yerine sıralayın. Sıralanmış blokları optimize etmek ve / veya tamponlamak için çoğunlukla rastgele miktarda RAM kullanabilirsiniz.
  • Sınırlı zaman?
    Bu RAM'i kullanın! Sıralama zaten O(n*log(n)). (Veya bir tamsayı-kova sıralama için O (n)!)
  • İdame?
    Sıralamadan daha kolay ne olabilir ki ?!
  • Bit bayraklarını / alanlarını bilmez mi? ( BitSet/ BitMap/ BitArray)
    Tamam ... devam et ve BitArray"bulunan numaraları" işaretlemek için a kullanın. Ve sonra 0's için tara .
  • Tahmin edilebilir "gerçek zamanlı" karmaşıklık?
    Bitmap çözümünü kullanın. Dosya üzerinde tek bir geçiş veBitArray/BitSet(0'leribulmak için)üzerinden başka bir geçiş. BuO(n)sanırım!

Ya da her neyse.

Gerçekte sahip olduğunuz endişeleri giderin. Sadece sorunu önce çöz, gerekirse saf çözümler kullan. Henüz var olmayan endişeleri gidermek için herkesin zamanını boşa harcamayın.


Diskte bir yana, saf bir yaklaşımla 4 milyar rakamı sıralamanın fizibilitesinden pek emin değilim. Yine de hiç denemedim.
Eiko

1
@Eiko Şey ... ve yine, asıl nokta şu ki ... işleri fazla karmaşıklaştırmayın. İlk adım, sorunu çözmek, saf olsa bile çözmeyi düşündüğünüz herhangi bir şekilde çözmektir. İşletmenizin bir çözüme ihtiyacı olduğunda "doğru" bir çözüme sahip olduğunuzdan emin olmak için zamanınızı harcıyorsanız, gelecekteki işvereninizin yaşadığı sıkıntı düzeyini bile vurgulayamıyorum . İkisini birden yapabileceğini kanıtla! Sorunları hızlı bir şekilde çözebileceğinizi kanıtlayın ve ardından yeniden düzenlemeye ve / veya gerektiğinde optimize etmeye değecek olası sorunları tanımlayın .
svidgen

1
@Ewan "Çünkü röportajda soruyu gündeme getirdin", "Her yöneticinin aradığı belirli bir cevabı var" ile aynı değil. ... Sorunu çözme ve yakalanmadığınız problemleri çözme yetisi göstermediğiniz sürece, size asla veremediğim sorunları çözme konusunda kesinlikle bana hangi çözümü verdiğiniz umrumda olmaz!
svidgen

1
Sen noktayı kaçırıyorsun. Bu soru ve varyasyonları programlama bulmacaları ve röportaj soruları kitaplarında ortaya çıkmaktadır. Soruyu soran kişi tarafından yapılmamıştır. 32bit'lerin sayıları veya sıralamaları takip ederek yapmayı imkansız hale getirmesi gerekiyordu. Sadece bilgisayarları yazıldığından beri daha hızlı / büyümüş.
Ewan

1
@Ewan: Hala sorunun örneğinin OP'ler ile aynı sınırlara sahip olduğunu varsayıyorsunuz. OP, algoritmasının 32 bit bir makinede çalışması gerektiğini söylemedi, hatta bir bilgisayarda çalışması gerektiğini bile söylemedi, kavramsal bir algoritma uygun olabilirdi. Ayrıca, "mümkün olan tüm sayılar" ın ne anlama geldiğini de belirtmiyor, çünkü 8-bit mikrodenetleyicilerde bile isteğe bağlı bir tamsayı matematiği mümkün. Mutlak ifadeler verdiğiniz varsayımlar oldukça fazla.
whatsisname,

19

Bir dosya olduğundan, birden fazla geçiş yapmanıza izin verildiğini varsayıyorum. İlk önce 256 sayaçtan oluşan bir dizi oluşturun, dosya üzerinde yineleyin ve her sayı için, sayının ilk baytı olarak endekslenen sayacı artırın. İşiniz bittiğinde, sayaçların çoğu 2 ^ 24 olmalıdır, ancak 1'den 4'e kadar sayaç daha düşük değerlere sahip olmalıdır. Bu endekslerin her biri, eksik sayılardan birinin ilk baytını temsil eder (4'ten küçükse bunun nedeni birden fazla eksik sayının aynı ilk baytı paylaşmasıdır).

Bu endekslerin her biri için başka bir 256 sayaç dizisi oluşturun ve dosya üzerinde ikinci bir geçiş yapın. Bu kez, ilk bayt öncekilerden biriyse, ikinci baytı esas alarak dizisindeki sayacı arttırın. İşiniz bittiğinde, 2 ^ 16'dan daha düşük olan sayaçlara tekrar bakın; her biri ilk baytıyla eşleşen eksik numaraların ikinci baytına sahip olacaksınız.

Üçüncü bayt için tekrar yapın (her geçişte en fazla 4 farklı bayt izleyebilse bile, her geçişte en fazla 4 diziye ihtiyacınız olduğuna dikkat edin) ve dördüncü bayt için tüm eksik sayıları buldunuz.

Zaman karmaşıklığı - O(n * log n)
Uzay karmaşıklığı - sabit !

Düzenle:

Aslında, n=2^32parametre olarak düşündüm , ancak eksik sayıların k=4sayısı da bir parametredir. k<<nBunu varsayalım uzay karmaşıklığı demektir O(k).

Güncelleştirme:

Sadece eğlence için (ve şu anda Rust'i öğrenmeye çalıştığım için) Rust'ta uyguladım: https://gist.github.com/idanarye/90a925ebb2ea57de18f03f570f70ea1f . Metinsel bir temsile sahip olmayı seçtim, çünkü biri ondan biri ~ 2 ^ 32 sayı ile çalışacak ...


Tüm numaraları bellekte tutmak (çoklu geçişler için) 4 bayt * 2 ^ 32 bellek gerektirir; Bu yüzden daha fazla olasılıkla tüm G / Ç'leri dört kez yaparsınız. Ancak kullanılan diğer bellek son derece küçük, orada çok büyük bir iş.
user949300,

1
@ user949300 Bu çözümün her şeyi tek seferde belleğe yüklemek yerine dosyayı parça parça okuduğunu farz ediyorum
Richard Tingle

"sayaçların çoğu 2 ^ 24 olmalıdır, ancak 1'den 4'e kadar sayaç daha düşük değerlere sahip olmalıdır" - yanlış: 0 olabilir, tüm eksik değerler birinci baytı paylaşır (ayrıca ikinci ve üçüncü mümkündür). Sonraki: İkinci geçişte kaç tane dizi oluşturuyorsunuz? 256, 1-4 kere 256, 256 kere 256? Ve sonra üçüncü ve dördüncü geçişte?
Bernhard Hiller

3
@BernhardHiller Dosya, 32 bitlik alanda tüm olası sayıları içerir, 4 farklı sayı için tasarruf sağlar. Dolayısıyla, ilk baytların tümü gerçekleşecek, sadece 1 ila 4 tanesi daha az isabet alacaktır.
Lasse V. Karlsen

@ LasseV.Karlsen teşekkürler, şimdi algoritmayı anlıyorum.
Bernhard Hiller

6

Bu Java olsaydı, bir BitSet kullanabilirsiniz. İkisi, çünkü 32 bitlik sayıyı tam olarak tutamıyorlar. İskelet kodu, belki de arabası:

BitSet bitsetForPositives = new Bitset(2^31);  // obviously not 2^31 but you get the idea
BitSet bitsetForNegatives = new Bitset(2^31);

for (int value: valuesTheyPassInSomehow) {
  if ((value & 0x80000000) == 0)
     bitsetForPositives.set(value );
  else
     bitsetForNegatives.set(value & ~0x80000000);
}

Sonra BitSet.nextClearBit()kimin eksik olduğunu bulmak için kullanın .

Not çok sonra eklendi:

Bu algoritma ile zaman alan parçayı paralel olarak çalıştırmak oldukça kolaydır . Orijinal dosyanın kabaca dört eşit parçaya bölündüğünü söyleyin. 4 çift BitSet tahsis edin (2GB, hala yönetilebilir).

  1. Paralel olarak dört iş parçacığı var, her biri bir dosyayı kendi çift BitSet'te işler.
  2. Tamamlandığında, tek bir iş parçacığına veya Bitsets'e (önemsiz zaman) geri dönün, daha sonra nextClearBit'i dört kez arayın (ayrıca oldukça önemsiz zaman).

G / Ç’nin hala hız sınırlayıcı adım olmasını beklerdim, ancak sihirli bir şekilde tüm sayılar bellekte olsaydı, işleri gerçekten hızlandırabilirdiniz.


3
@Idan Ayre. Bu çözüm çok az kod gerektirir, bu nedenle kodlama hatalarını azaltır Güzelim bu zaman O (n). Çok büyük bir dosyadan birden çok geçiş kabul etmez / gerektirmez, bu nedenle birden çok geçiş gerektiren bir algoritmadan daha az yer kullanır. Lütfen "Ah canım" derken ne demek istediğini açıkla.
user949300

2
Integer.MIN_VALUEDoğru işlemez . Bunu düzeltmek için olumsuzlamak yerine işaret biti maskeleyebilirsiniz.
CodesInChaos 17:16

1
Bu saf yaklaşım, 32 bitlik bir sistemde bile mütevazı miktarda RAM olan bitler için 2 ^ 32 bit = 4 Gib = 512 MiB'ye ihtiyaç duyar.
CodesInChaos 17:16

Tercih edilen dilde bit bitleri yoksa, bunları bir bayt dizisi kullanarak öykünmek. Örneğin C #:bool GetBit(byte[] byteArray, uint index) { var byteIndex = index >> 3; var bitInByte = index & 7; return (byteArray[byteIndex] >> bitInByte) & 1 != 0; }
CodesInChaos 17:16

1
@JoulinRouge (ve JacquesB) Öyleyse, bunun zaman içinde doğrusal olduğuna, mütevazı (1/2 Gig) RAM kullandığına ve yalnızca bir G / Ç geçişi gerçekleştirdiğine katılıyoruz. Benim için çalışıyor.
user949300,

5

Bu soru, bir bit dizisi kullanılarak çözülebilir (doğru / yanlış). Bu, belirli bir sayının bulunup bulunmadığını tutmak için dizinin dizinini kullanan tüm sayıların cevaplarını tutmak için en etkili yapı olmalıdır.

C #

var bArray = new BitArray(Int32.MaxValue);

//Assume the file has 1 number per line
using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
            var n = int32.Parse(s);
            bArray[n] = true;
        }
}

Sonra sadece diziyi yineleyin ve hala sahte olan değerler için bunlar dosyada yok.

Dosyayı daha küçük parçalara bölebilirsiniz ancak Windows 7 (64 bit) çalıştıran 16.0 GB dizüstü bilgisayarımda tam bir int32 max boyutunda dizi (2147483647) tahsis edebildim.

64 bit çalıştırmıyor olsam bile daha küçük bit dizileri ayırabilirim. Dosyayı, her biri [0-64000] [64001-128000], vb. Sayıları olan, mevcut çevresel kaynaklar için uygun olan daha küçük bir dosya kümesi oluşturarak önceden işlerdim. Büyük dosyayı gözden geçirin ve her sayıyı ilgili set dosyasına yazın. Sonra her küçük dosyayı işleyin. Ön işleme adımı nedeniyle biraz daha uzun sürebilir, ancak sınırlı kaynaklar olsaydı bu durum kaynak sınırlamalarını giderirdi.


Bu, negatif sayıları idare ediyor gibi görünmüyor. (Ya da eğer girdi ise en yüksek bitli işaretsiz girişler.) Bit setinin belleği çoğu 32 bit sistemde bile problem olmamalıdır.
user949300, 17:16

@ user949300 - Doğru. Dizi yanlış değerlerle başlatıldığında büyük bir bellek tüketimi fark etmedim. Biri negatif sayılar için ikincil bir BitArray'e ihtiyaç duyacaktır. Belki bArrayNegative = new BitArrary (Int32.MaxValue). Sayı okunduğunda, pozitif veya negatif olarak kontrol edilebilir ve ardından uygun Bit Dizisine konulabilir. Yorumlarınız için teşekkürler.
Jon Raynor

2

Bu bir röportaj sorusu olduğu için, görüşmeciye kısıtlamalar hakkında biraz anlayış gösterdiğini gösteririm. Öyleyse, "tüm olası sayılar" ne anlama geliyor? Herkesin tahmin ettiği gibi gerçekten 0 ... 2 <(32-1) mı? Genel 32 bit mimariler, 32 bit sayılardan daha fazlasıyla çalışabilir. Belli ki sadece bir temsil meselesi.

32 bitlik bir sistemde mi çözülmeli, yoksa bu sayılar üzerindeki kısıtlamanın bir parçası mı? Örneğin, tipik bir 32 bit sistem dosyayı bir seferde RAM'e yükleyemez. Ayrıca 32 bitlik bir sistemin genellikle dosya boyutu sınırlaması nedeniyle tüm sayıları içeren bir dosyaya sahip olamayacağından da bahsedeceğim. Eh, bazı akıllı kodlama olmadıkça, "Bu dört hariç tüm sayılar" gibi, bu durumda sorun önemsizce çözüldü.

Ancak, soruyu gerçekten "Bir kaç tanesi hariç tüm sayıları 0 ... 2 ^ (32-1) verilen bir dosya verilsin" olarak, bana bir tane eksik olanı ver "olarak anlamak istiyorsanız (ve bu büyük bir şey !), O zaman Bunu çözmek için birçok yol var.

Önemsiz ancak uygulanabilir olmayanlar: Her olası sayı için, dosyayı tarayın ve içeride olup olmadığına bakın.

512 MB RAM ve dosyadan tek geçişle: dosyadan okunan her sayıyı (= bu dizinde bit ayarlayın) işaretleyin ve ardından RAM'i bir kez geçirin ve eksikleri görün.


1
Bazı iyi sorular, ancak 32 bitlik sistemin ints, float veya huzziwigs'i temsil edip etmediğini, yine de 32 bitte yalnızca 2 ^ 32 değeri temsil edebilir. Eğer soru "oh evet, 128 bit ultra uzunluğa izin veriyoruz" ise, o zaman 32 bit mimari "kısıtlama" sorusu kasten yanıltıcıdır. Yine de, görüşmeci ile görüşmek için harika bir soru, çünkü birçok özellik yanıltıcı veya kötü yazılmış. Gerçek çözümün benimki gibi bir BitSet.
user949300,

@ user949300 Evet - ve görüşmecinin ne aradığını bilmek mümkün değil. En son kiraladıkları kişi "düşünmeden önce kesmek istifleyen" bir adamsa, cevabınız, "mimarlık hakkında kesinlikle hiçbir fikri yoktur" veya "optimizasyon oyununu oynamak" adamından farklı olmalıdır. :) Daha önce büyük bitlerle (Java'da olmasa da) çalıştım, bu yüzden doğal olarak aklıma geldiler. Gerekirse daha düşük bellek için de kullanılabilir (kovalama). Bit setleri ayrıca yukarıdaki sıralamalardaki "sıralama problemini" 512 MB RAM ile lineer zamanda çözmektedir.
Eiko

0

Bir röportajda hatırlaması kolay ve anlaşılması kolay olan bir yaklaşım, N bitindeki tüm sayılara bakarsanız, her bitin bu değerlerin tam yarısına ayarlanacağı ve diğer yarıda ayarlanmadığı gerçeğini kullanmak olacaktır. .

Dosyadaki tüm değerlerin üzerinde yinelenir ve sonunda değerlerin 32 sayısını tutarsanız, tam olarak (2 ^ 32/2) veya bu değerden biraz daha düşük olan 32 değerle sonuçlanırsınız. Maksimum (2 ^ 32/2) ve toplam arasındaki fark, eksik değerlerin her bir pozisyonunda ayarlanan toplam bit sayısını verir.

Bunu elde ettikten sonra, toplamları verebilecek olası 4 değer kümesini belirleyebilirsiniz. Bundan sonra, bu kombinasyonların bir parçası olan değerleri kontrol ederek tekrar dosyadaki değerleri gözden geçirebilirsiniz. Bir tane bulduğunuzda, bu değeri içeren kombinasyonlar olasılık olarak elimine edilir. Tek bir olası kombinasyonunuz kaldığında, cevap vermeniz gerekir.

Örneğin, bir uç ucu kullanarak, aşağıdaki değerlere sahipsiniz:

1010
0110
1111
0111
1101
1001
0100
0101
0001
1011
1100
1110

Her pozisyonda ayarlanan toplam bit:

7867

Bunları 8'den (4 ^ 2/2) çıkarmak:

1021

Bu, aşağıdaki olası 4 değer kümelerinin olduğu anlamına gelir:

1000
0000
0011
0010

1010
0001
0010
0000

(Herhangi birini özlediysem, beni affet, sadece görerek yapıyorum)

Ve sonra tekrar orijinal sayılara baktığımızda, ilk setin cevap olduğu anlamına gelen 1010'u hemen bulduk.


ama bir tane değil 4 tane sayı
bulmalısın

@freedev Haklısın. İşte öyle. Dört sayı kümesi, dört sayıdır ... kümedeki.
JimmyJames,

İlginç, ama sen parlıyorsun determine all the possible sets of 4 values that could give those totals. Bunun cevabınızdan eksik olan çözümün önemli bir parçası olduğunu düşünüyorum. Ayrıca zaman ve mekan karmaşıklığını da etkileyebilir.
Allon Guralnek 21:16

@AllonGuralnek Haklısın. Bu konuda çalışmak için biraz zaman harcadım ve en kötü durumda kaç tane 4 sayı kümesinin aynı sayıya ekleneceğini büyük ölçüde küçümsedim. Bence bu kurtarılabilir bir fikir ama burada ortaya koyduğumdan biraz daha karmaşık. Daha sonra detaylarla güncelleneceğim. Geribildirimi takdir ediyorum.
JimmyJames,

0

Dosyanın sayıları artırarak sıralandığını varsayarak:

Gerçekten (2³²-4) sayıları içerdiğinden emin olun.
Şimdi eğer dosya tamamlandıysa (veya 4 eksik sayı son 4 sayıysa), N konumundaki dosyadaki herhangi bir kelimeyi okumak N ile eşleşen değeri döndürür.

Beklenmeyen ilk X1 sayısını bulmak için [0..2³²-4-1) konumlarında bir ikilik araması kullanın.
İlk eksik sayı bulunduğunda, ikinci eksik olanı bulmak için tekrar [X1 .. (2³²-4-1)] konumlarında tekrar bir diktotomi araması yapın, X2: Bu kez, N konumunda bir sözcük okurken, N-1 eşleşme değerini döndürmelidir. başka eksik numara yoksa (bir eksik numaradan geçtiğinizden beri).
Kalan iki sayı için de aynı şekilde tekrarlayın. Üçüncü yinelemede, N konumundaki kelimeyi okumak N-2'yi ve dördüncüde N-3'ü geri döndürmelidir.

Uyarı: Bunu test etmedim. Ama çalışması gerektiğini düşünüyorum. :)

Şimdi gerçek hayatta diğer cevaplara katılıyorum: ilk sorular çevre ile ilgili olacaktır. RAM boşuna mı sahibiz (ne kadar), doğrudan erişimli bir depolama cihazındaki dosya mı, bu tek seferlik bir işlem mi (optimizasyon gerekli değil) veya kritik bir tane mi (her döngü sayısı), harici sıralama düzenimiz var mı? , vb.
Sonra bağlam için kabul edilebilir bir uzlaşma bulmak. Bu en azından bir algoritma aramadan önce problemi analiz etmeye başladığınızı gösterir.


-2

Tüm standart sorularda olduğu gibi, çözüm görüşmeden önce onları google'a çıkarmaktır.

Bu soru ve çeşitlemelerde, XORing'in tüm sayıları içeren çok kesin bir 'doğru' cevabı vardır. Veritabanlarındaki indeksleri anladığınızı göstermesi gerekiyor. Yani 'herhangi biri için sıfır puan işe yarayabilir, ancak gazetede yazdıklarını değil' cevabını verir.

Artı tarafta, bu soruların sonlu bir seti var, birkaç saatlik revizyon sizi bir dahi gibi gösterecek. Sadece kafanda çalışıyormuş gibi yapmayı unutma.

Düzenle. Öyle görünüyor ki 4 için XOR'dan farklı bir yaklaşım var

http://books.google.com/books?id=415loiMd_c0C&lpg=PP1&dq=muthukrishnan%20data%20stream%20algorithms&hl=el&pg=PA1#v=onepage&q=muthukrishnan%20data%20stream%20algorithms&f=false

Düzenle. Downvoters: Bu OP'de belirtilen problemin çözümü için yayımlanmış bir ders kitabı O (n) çözümüdür.


1
Özellikle, bu bağlantılı kitap tamamen akış işlemeyle ilgilidir. Özellikle, kısıtlamalar dahilinde akış işleme. Bu kesinlikle dedi olur aksi oldukça önemsiz olduğundan bu, OP gördü sorunun kökeni olduğuna inanıyoruz. Daha da önemlisi, soruyu gerçekten cevaplamadın. Bunu "orijinal" veya "amaçlanan" soru olarak ikna edici bir şekilde konumlandırabilir ve çözümü açıklayabilirseniz benden + 1'ünüz olur ... ama bu olduğu gibi bir şeyi cevaplamaz.
svidgen

1
Bu cevap (bir röportajda) sadece kitabı okuduğunuzu gösterir. Becerileriniz veya düşünce süreçleriniz hakkında hiçbir şey yok. Ve bir röportajdan önce nasıl " tüm standart soruları google" yaparsınız ? Kaçırdığım "röportajda sorulan tüm soruların" sonlu bir listesi var mı?
user949300,

1
@ewan, aynı zamanda iyi bir aday tutmanın zorluğunun da altını çizer! Eğer "iyi" olanlar röportaj sorularına iyi hazırlanırlarsa ... İş sorunlarımı çözebilecek birini işe almak zorlaşır mı?
svidgen

1
@ewan net olmak gerekirse, ben dalga geçiyordu benim yanlış noktalama. ... Her halükarda, aklımda, günümde standart soruları ve buna benzer cevapları bile görmezden geldiğim için bile çok sayıda iş teklifi aldım. Ve şimdi, bir işe alma yöneticisi olarak size söz verebilirim, okunan cevaplar istemiyorum ... Gerçi bazı yöneticilerin farklı ihtiyaçları olacağını anladım.
svidgen

1
Ayrıca bir şey daha açıklamak gerekir @Ewan benim tonu almamış olsaydı, amaçlandığı gibi: Sen gerektiğini için yanıtınızı revize aslında assert olduğunu ancak bağlantılı kitapta olduğu problem "amaçlanan soruya." Ve sonra soruyu cevapla ! ... şüphesiz ki + 1'ime ve daha birçoklarına sahip olacak ve OP'nin bu konuda yardım etmesinin memnuniyetini sağlayacaksınız.
svidgen
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.