Avustralya'ya kaz - antipotlar


24

Arka fon

Sayısız kuşak çocuğu, doğrudan aşağıya bir delik kazarlarsa nereye gideceklerini merak etti. Bunun şaşırtıcı bir şekilde oldukça tehlikeli olacağı ortaya çıktı , ama yine de ...

Antipotlar, Dünya yüzeyinde doğrudan birbirine zıt noktalardır. Bu, iki nokta arasında bir çizgi çizildiğinde, Dünya'nın merkezinden geçeceği anlamına gelir.

Meydan okuma

Bir nokta verilen, antipodunu bulan bir program veya fonksiyon yazın.

Bu mücadelede, noktalar boylam enlem sistemi ve dereceleri, yay dakikaları ve yay saniyeleri kullanılarak temsil edilir. Antipodu bulmak için, her bir koordinatın yönünü değiştirin ( N <-> Sve W <-> E) ve boylam koordinatını 180derecelerden çıkarın .

Örnek:
Puan al N 50 26 23 W 4 18 29. Vermek için yol tarifini değiştir S 50 26 23 E 4 18 29. Antipod koordinatlarını olduğu gibi bırakarak, koordinatın 180 0 0vereceği boylamı çıkarın .175 41 31S 50 26 23 E 175 41 31

kurallar

Giriş

Her bir koordinatın bir yön, bir derece derece, bir kaç dakika dakika ve bir kaç saniye saniye içerdiği herhangi bir makul formatta bir enlem-boylam kümesi koordine edilir.

Çıktı

Antipodun enlem-boylam koordinatları, her bir koordinatın bir yön, bir derece derece, bir kaç dakikalık dakika ve bir kaç ark saniye içerdiği herhangi bir makul formatta .

Koordinatın her bir bölümünün açıkça ayırt edilebileceği anlamına gelmesi makul olur.

gözlük

  • Enlem ordinatı için yönüdür Nya da S, ve boylam ordinat olmasıdır için Wveya E.
  • Tüm koordinat değerleri tam sayılardır. Derecesi değeri arasında olacaktır 0ve 90enlem için arasında ve 0ve 180boylam. Her iki koordinat için ark dakika ve ark ikinci değerler 0ve arasında olacaktır 59.
  • Bir koordinat için tüm değerler ise 0, her iki yön de kabul edilebilir.
  • Herhangi bir değeri sıfırlamaya gerek yoktur.
  • Hiçbir enlem koordinatının 90derecelerden daha büyük olması ve hiçbir enlem koordinatının 180derecelerden daha büyük olması gerekmez .
  • Standart boşluklar uygulanır.

Test durumları

N 50 26 23 W 4 18 29 -> S 50 26 23 E 175 41 31

S 43 9 9 E 0 0 5     -> N 43 9 9 W 179 59 55

N 0 0 0 E 0 0 0      -> S/N 0 0 0 W/E 180 0 0 (either direction fine in each case)

S 1 2 3 W 4 5 6      -> N 1 2 3 E 175 54 54

S 9 21 43 W 150 7 59 -> N 9 21 43 E 29 52 1

S 27 40 2 W 23 0 0   -> N 27 40 2 E 157 0 0

N 0 58 37 W 37 0 0   -> S 0 58 37 E 143 0 0

Kullanışlı bağlantılar

Bu , yani bayt cinsinden en kısa cevap kazanır!


Bu makul bir format mı? Dört giriş: 3 sayı dizisi, char, üç sayı dizisi; newlines ile ayrılmış
Luis Mendo

@LuisMendo Sizi yanlış anlamadığım sürece, sadece üç girdiyi görebiliyorum; Sanırım ekstra bir karakter istersiniz? Bunun makul bir format olduğunu söyleyebilirim. Makul olarak, esasen koordinatın her bir bölümünün açıkça ayırt edilebildiği anlamına gelir.
TheBikingViking

Evet, ilk karakteri unuttum. Teşekkürler!
Luis Mendo

3
"Oldukça tehlikeli"? Dostum, asıl tehlike buraya geldiğinde olur .
Andrew Grimm

1
@busukxuan Daha erken yanıt veremediğim için özür dileriz. Ben Spec gerektirdiğinden Bu her iki biçimin, makul olmadığını söyleyebilirim N, S, E, veya W, bir yönü olarak gereksiz ederken 0hangi değerin olarak tanıtır belirsizlik ordinat hangi bileşenini temsil eder.
TheBikingViking,

Yanıtlar:


1

05AB1E, 37 34 bayt

`60©3L<Rm*O3°648*s-®‰`s®‰s‚˜)'€Ã‡

Açıklaması

`                                      # split input to 4 lines with longitude on top
 60©3L<Rm*O                            # convert longitude to seconds
            3°648*                     # longitude 180 0 0 in seconds
                  s-                   # subtract our longitude from this
                    ®‰`                # get seconds part
                       s®‰             # get minute and degrees part
                          s‚˜)         # join to list
                              '€Ã‡    # translate directions

Çevrimiçi deneyin

Düzenleme: Adnan sayesinde 3 bayt kaydedildi .


Sen sıkıştırabilir "NEWS"için ‘€Ã‘hatta '€Ãküçük izin vermesi gerekir.
Adnan

@Adnan: Güzel! Dize zaten çok küçük olduğu için sıkıştırmayı düşünmedim.
Emigna

6

JavaScript (ES6), 88 bayt

(a,b,c,d,e,f,g,h)=>[a<'S'?'S':'N',b,c,d,e<'W'?'W':'E',!(g|h)+179-f,g|h&&!h+59-g,h&&60-h]

8 parametre alır ve sonuç olarak bir dizi döndürür. Beklediğini abiri olmak Nya Sve benzer ebiri olmayı Wya E. Hesaplamalar:

  • fGerekirse gveya hsıfır ise 179'dan çıkarılması gerekir, ancak ikisi de sıfırsa gve 180 (eğer hborçlanma olmadığından) 180 olur , böylece 179'a !(g|h)eklenir.
  • gihtiyaçlarını her ikisi de eğer sıfır olması gve hsıfır, bu şekilde olan g|h&&, aksi takdirde eğer 59 çıkarılması gerekmektedir hise sıfır olmayan ancak 60 hbu durumda, (bir ariyet çünkü) sıfırdır !h59 ilave edilir.
  • h Zaten sıfır olsaydı sıfır olması gerekir, aksi halde 60'tan çıkarılır.

Buna bakmanın diğer bir yolu, ikili olarak çıkarma işleminin 1'lerin tamamlayıcısı ve ek 1'in eklenmesiyle elde edildiğinin farkına varmaktır. Bu soruna çevrilir 179-f, alır 59-gve 59-h1 59-h+ 1 ekleriz 60-h, ancak bu 60 ise, , yani hbaşlangıçta sıfır olsaydı istenen sonuç sıfırdır. 59-gBir taşıma hvarsa, yani hbaşlangıçta sıfırsa 1 ekleriz . Yine her ikisi de eğer bu sefer olur ki, bir taşıma için izin vermek zorunda gve hsıfır vardır ve biz 1 eklenir 179-fbu durumda.


6

MATL , 51 bayt

'NS'tPXEii'WE'tPXE648e3i60:qXJZA-JYAtn3-?2:&)wJZAwh

Giriş formatı:

'N'
[50 26 23]
'W'
[4 18 29]

Çıkış biçimi:

S
50 26 23
E
175  41  31

Çevrimiçi deneyin!

açıklama

'NS'tPXE     % Take input (string) implicitly. Exchange 'N' and 'S'
i            % Take input (array)
i'WE'tPXE    % Take input (string). Exchange 'W' and 'E'
648e3        % Push 648000
i            % Take input (array)
60:qXJ       % Push [0 1 ... 59]. Copy into clipboard J
ZA           % Convert second input array from base 60 to decimal
-            % Subtract
JYA          % Convert to base 60
tn3-?        % If length exceeds 3
  2:&)       %   Split into first two elements and then the rest
  w          %   Swap
  JZA        %   Convert from base 60 to decimal
  wh         %   Swap, concatenate

Geçen hattına ikinci günü açıklama bir yazım hatası var: bnase.
TheBikingViking,

1
@TheBikingViking Teşekkürler! Düzeltildi
Luis Mendo,

4

Raket, 199 bayt

(λ(l)(cons(cons(if(eq?(caar l)'n)'s'n)(cdar l))(cons(if(eq?(cadr l)'e)'w'e)(list (- 180(+(caddr l)(sgn(foldl + 0(cdddr l)))))(modulo(- 60(+(fourth l)(sgn(fifth l))))60)(modulo(- 60(fifth l))60)))))

Bu çok uzun. Muhtemelen daha da kısaltmak için yapabileceğim bazı şeyler var, ama titremeler tamamen bitti.

Bir Alır consikisinin çiftini lists: enlem için bir ve boylam biri. Her listenin ilk öğesi olarak yönü (küçük harfli Raket simgesi olarak) vardır ve ardından dereceleri, yay dakikalarını ve yay saniyelerini takip eder. Aynı formatta çıkışlar

Raket bu iki listeyi bir başka liste ile ilk elemanı olarak tek bir liste olarak yorumlayacaktır. Bu gayet iyi, çünkü enlem ve boylamlara bir çiftte iki listelermiş gibi erişebiliyorsunuz.

Kullanımı:

>    (
     (λ(l)(cons(cons(if(eq?(caar l)'n)'s'n)(cdar l))(cons(if(eq?(cadr l)'e)'w'e)(list (- 180(+(caddr l)(sgn(foldl + 0(cdddr l)))))(modulo(- 60(+(fourth l)(sgn(fifth l))))60)(modulo(- 60(fifth l))60)))))
     (cons (list 's 43 9 9) (list 'e 0 0 5)))
'((n 43 9 9) w 179 59 55)

Gelecekteki kodla '((n 43 9 9) (w 179 59 55))iki liste halinde yorumlanabilir.


4

Pyth, 41 45 43 35 bayt

K60-"NS"ww-"EW"wA.D-*3^K3iEKK+.DGKH

Dereceleri ve dakikaları saniyelere çevirmek için base-60 dönüşümü kullanır.

G / Ç formatı:

N
[1,2,3]
E
[4,5,6]

Her satır girdiğinizde bir satır yazdırır, böylece iyi görünümlü bir formata sahip olmak için, CLI'yi kullanabilir ve girişi yönlendirebilir ya da çevrimiçi Pyth uygulamasını kullanabilirsiniz .

Sözde kodda:

K60                                              K = 60
   -"NS"w                                        "NS".remove(input())
         w                                       print(input())
          -"EW"w                                 "EW".remove(input())
                A.D                              G,H = divmod(
                   -*3^K3                          3*K**3 -
                         iEK                         baseToDec(input(),K)),
                            K                      K)
                             +.DGKH              divmod(G,K)+H

@LuisMendo sizinkilerle aynı, ancak virgülle ayrılmış listeler ve teklif yok
busukxuan

4

Python 2, 140 122 bayt

Güncellenmiş:

def f(c):x=([180,0,0],[179,59,60])[1<sum(c[6:8])];print['NS'['N'in c]]+c[1:4]+['EW'['E'in c]]+map(lambda x,y:x-y,x,c[5:8])

Bu biraz farklı bir yaklaşım kullanır: dakika ve saniye bazında değerleri boylamdan çıkarmak için ayarlama. 0 dak ve saniye varsa, 180 dereceden çıkarır ve> 0 dak ve sn ise, sırasıyla d, m, s'den 179, 59 ve 60 çıkarır.

Orijinal:

def f(c):v=divmod;m,s=v((180-(c[5]+c[6]/60.+c[7]/3600.))*3600,60);d,m=v(m,60);print['NS'['N'in c]]+c[1:4]+['EW'['E'in c]]+map(round,[d,m,s])

Bir liste olarak girdi alır: f(['N', 0, 0, 0, 'E', 0, 0, 0])boylamı ondalık dereceye dönüştürür, 180'den çıkarır, ardından derecelere, dakikalara, saniyelere geri dönüştürür ve işlemdeki yönleri çevirerek listeyi yeniden oluşturur.

Un-golfed:

def f(c):
    minutes,seconds=divmod((180-(c[5]+c[6]/60.+c[7]/3600.))*3600,60)
    degrees,minutes=divmod(minutes,60)
    print ['NS'['N'in c]]+c[1:4]+['EW'['E'in c]]+map(round,[degrees,minutes,seconds])

Dene


3

JavaScript, 138 137 129 124 112 110

@ Neil'in kodundan ilham alan 2 byte geliştirme

f=a=>a.map((v,i,a)=>i%4?i>6?v&&60-v:i>5?(59-v+!a[7])%60:i>4?179-v+!(a[7]|a[6]):v:'NEWS'[3-'NEWS'.indexOf(v)]);
  • input = output = 2x içeren dizi (1 büyük harf char ve 3 int)
  • Firefox'ta test edildi

ungolfed

f=a=>a.map((v,i,a)=>
i%4?
    i>6?v&&60-v              // 7: invert seconds - old: (60-v)%60
    :i>5?(59-v+!a[7])%60     // 6: invert minutes, increase if seconds are 0
    :i>4?179-v+!(a[7]|a[6])  // 5: invert degrees, increase if seconds and minutes are 0
    :v                       // 1,2,3: unchanged
:'NEWS'[3-'NEWS'.indexOf(v)] // 0,4: swap directions
);

testler

<table id=out border=1><tr><th>in</th><th>out<th>expected</th><th>ok?</th></tr></table>
<script>
addR=(r,s)=>{var d=document.createElement('td');d.appendChild(document.createTextNode(s));r.appendChild(d)}
test=(x,e,f)=>{var y,r=document.createElement('tr');addR(r,x);addR(r,y=('function'==typeof f)?f(x):f);addR(r,e);addR(r,e.toString()==y.toString()?'Y':'N');document.getElementById('out').appendChild(r)}

samples=[
'N',50,26,23,'W',4,18,29,   'S',50,26,23,'E',175,41,31,
'S',43,9,9,'E',0,0,5,       'N',43,9,9,'W',179,59,55,
'N',0,0,0,'E',0,0,0,        'S',0,0,0,'W',180,0,0,
'S',1,2,3,'W',4,5,6,        'N',1,2,3,'E',175,54,54,
'S',9,21,43,'W',150,7,59,   'N',9,21,43,'E',29,52,1,
'S',27,40,2,'W',23,0,0,     'N',27,40,2,'E',157,0,0,
'N',0,58,37,'W',37,0,0,     'S',0,58,37,'E',143,0,0,
];
while (samples.length)
{
    x=samples.splice(0,8);
    e=samples.splice(0,8);
    test(x,e,h);
    test(e,x,h);
}
</script>

ah @ Sadece Neil'in aynı fikri olduğunu gördüm, fakat bazı daha kısa parametreler
Titus

2

Python 3, 131 130 bayt

def f(w,x,y,z):S=60;d=divmod;a,b,c=y;l,m=d(648e3-c-S*b-S*S*a,S);return w,"N" if x=="S" else "S",d(l,S)+(m,),"E" if z=="W" else "W"

Biçimler: açılar formun tupeleri (deg,min,sec), yönler formun şeklindedir N. Her biri yönünü takip eden 2 açılı bir dörtlü çıktılar.

Ungolfed versiyonu:

def f(latitude,NS,longitude,EW):
    degree,minute,second=longitude
    minute,second=divmod(648000-second-60*minute-60*60*degree,60)
    return latitude, "N" if NS=="S" else "S", divmod(minute,60)+(second,), "E" if EW=="W" else "W"

1
Sen yaparak 120 bayt bu hakkı elde edebilirsiniz def f(w,x,y,z):S=60;d=divmod;a,b,c=y;l,m=d(648e3-c-S*b-S*S*a,S);return w,["S","N"][x=="S"],d(l,S)+(m,),["W","E"][z=="W"]gerçeğini kullanarak bu işleri Trueve Falseolarak yorumlanabilir 1ve 0ve dolayısıyla a if b else ceşdeğerdir [c, a][b]. Bir yandan, orijinal kodunuzun bir yazım hatası olduğunu düşünüyorum; gerektiğini x=="W"olmak z=="W"?
TheBikingViking

2

C #, 310 269 ​​bayt

float[]t(string[]a,int n)=>a.Skip(n).Take(3).Select(float.Parse).ToArray();string A(string i){var s=i.Split(' ');var w=t(s,5);float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;return(s[0][0]>82?"N":"S")+$" {string.Join(" ",t(s,1))} {(s[4][0]<70?'W':'E')} {a} {b} "+b%1*60;}

Giriş bir dizedir. NetFiddle'da deneyebilirsiniz .

kod

float[]t(string[]a,int n)=>a.Skip(n).Take(3).Select(float.Parse).ToArray();
string A(string i) {
    var s=i.Split(' ');var w=t(s,5);float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;
    return (s[0][0]>82?"N":"S")
        +$" {string.Join(" ",t(s,1))} {(s[4][0]<70?'W':'E')} {a} {b} "+b%1*60;
}

Ben yapmazsanız stringgirdi ama olarak char, float[], char, float[], ben yapabilirsiniz:

C #, 167 166 165 163 152 148 147 139 bayt

(s,n,e,w)=>{float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;return(s>82?"N":"S")+$" {string.Join(" ",n)} {(e<70?'W':'E')} {a} {b} "+b%1*60;};

kod

(s,n,e,w) => {
    float a=180-(w[0]+w[1]/60+w[2]/3600),b=a%1*60;
    return(s>82?"N":"S")+$" {string.Join(" ",n)} {(e<70?'W':'E')} {a} {b} "+b%1*60;
};

Ayrıca 164 karakter ve 166 bayta taşımak için bunu kaldırabilir 3600ve kullanabilirim . Kullanmalı mıyım?


C #, 150 bayt

(s,n,m,p,e,w,x,y)=>{var t=new TimeSpan(180,0,0)-new TimeSpan(w,x,y);return(s>82?"N":"S")+$" {n} {m} {p} {(e<70?'W':'E')} {t.TotalHours} {t:%m\\ s}";};

kod

(s,n,m,p,e,w,x,y) => {
    var z=new TimeSpan(180,0,0)-new TimeSpan(w,x,y);
     return(s>82?"N":"S")+$" {n} {m} {p} {(e<70?'W':'E')} {z.TotalHours} {z:%m\\ s}";
};

Daha fazla .NET yolu! Tüm mantığı .NET'e devrediyorumstruct TimeSpan ve ben ab mantığı biçimlendirme dize kullanırlar. Girdi olduğunu char, int, int, int, char, int, int, int. Bunu bazı fikirler vermek için paylaşıyorum. Belki birileri benden daha iyi bir şekilde gelişir.


Bu maalesef ayrıntılı.
Steven H.

@Fawful Farklı argümanlarla başka bir sürüm yayınlarım. Daha az ayrıntılı değil mi? Hala kurtulamıyorum string.Join()...
aloisdg diyor Reinstate Monica

Bunun C # 6.0 olduğunu unutmayın
Yytsi

@TuukkaX C # en son sürüm olduğundan, bunu belirtmedim. C # 7 özelliği gibi bazı un serbest bırakma özelliğini kullanırsam olur.
aloisdg diyor Reinstate Monica

1
Eh, ben yok bakın bir returnsenin testini kullanarak ... kendim eklemek zorunda, a('N', new float[] { 50, 26, 23 }, 'W', new float[] { 4, 18, 29 })ben olsun S 50 26 23 E 175.6919 41.51642 30.98511bunun bir geçiş dikkate alacağını? -
birgün ne zaman

0

Java, 199 177 veya 151 veya 134 Bayt

Sonuç basan 177 Bayt çözüm

void t(int...a){int i=648000-(a[5]*3600+a[6]*60+a[7]);System.out.println(a[0]=='N'?"S":"N"+" "+a[1]+" "+a[2]+" "+a[3]+" "+(a[4]=='E'?"W":"E")+" "+i/3600+" "+i/60%60+" "+i%60);}

Dizi olarak sonucu döndüren 151 Baytlık çözüm

Object[]y(int...a){int i=648000-(a[5]*3600+a[6]*60+a[7]);return new Object[]{a[0]=='N'?"S":"N",a[1],a[2],a[3],a[4]=='E'?"W":"E",i/3600,i/60%60,i%60};}

Lambda notasyonu kullanıyorsak 134 bayt

a->{int i=648000-a[5]*3600-a[6]*60-a[7];return new Object[]{a[0]=='N'?"S":"N",a[1],a[2],a[3],a[4]=='E'?"W":"E",i/3600,i/60%60,i%60};}

0

C, 188

main(int c,char**v){int n=*v[1]==78?83:78,e=*v[5]==69?87:69,b=648000-(atoi(v[6])*3600+atoi(v[7])*60+atoi(v[8]));printf("%c %s %s %s %c %d %d %d\n",n,v[2],v[3],v[4],e,b/3600,b/60%60,b%60);}

8 program argümanı gerektirir, aksi halde başarısız olur. Gibi argümanları iletin N 50 26 23 W 4 18 29. Sinyal lambaları N, S, E, W, harfi büyük olmalıdır.


0

PostGIS, 123 bayt

İşe Yönelik Araç, kısmen SQL kelimesinden ve kısmen geometriye ve geriye dönüşe ihtiyaç duymasından dolayı hayal kırıklığı yaratıyor:

CREATE FUNCTION f(p geography)
RETURNS geography
AS 'SELECT ST_Affine(p::geometry,1,0,0,-1,180,0)::geography' LANGUAGE sql;

Öte yandan, bu tek işlev, noktaları, puan koleksiyonlarını veya daha karmaşık şekilleri (örneğin Avustralya ve Yeni Zelanda kıyılarının tamamı gibi) dönüştürecektir.


0

PHP, 148 bayt

JavaScript cevabımla aynı yaklaşım , orada bir arıza ara

  • +16 fonksiyon ek yükü
  • $İşaretler için +17
  • Parantez için +12 (farklı operatör önceliği)
  • + 4, foreachçünkü PHP’lerin array_mapbüyük bir ek yükü var
  • (60-$v)%60Çünkü +1 $v&&60-$vPHP'de boolean atarlar
  • -8 Orijinal üzerinde çalışarak
  • -4 kullanarak chr, ordve yön değişiminde bazı aritmetikler kullanarak

function f(&$a){foreach($a as$i=>$v)$a[$i]=$i%4?($i>6?(60-$v)%60:($i>5?(59-$v+!$a[7])%60:($i>4?179-$v+!($a[7]|$a[6]):$v))):chr(($i?156:161)-ord($v));}
  • fonksiyon orijinal üzerinde çalışır
  • format: 2x dizisi (1 büyük harf karakter, 3 int)

testler

function out($a){if(!is_array($a))return$a;$r=[];foreach($a as$v)$r[]=out($v);return'['.join(',',$r).']';}
function cmp($a,$b){if(is_numeric($a)&&is_numeric($b))return 1e-2<abs($a-$b);if(is_array($a)&&is_array($b)&&count($a)==count($b)){foreach($a as $v){$w = array_shift($b);if(cmp($v,$w))return true;}return false;}return strcmp($a,$b);}
$samples=[
N,50,26,23,W,4,18,29,   S,50,26,23,E,175,41,31,
S,43,9,9,E,0,0,5,       N,43,9,9,W,179,59,55,
N,0,0,0,E,0,0,0,        S,0,0,0,W,180,0,0,
S,1,2,3,W,4,5,6,        N,1,2,3,E,175,54,54,
S,9,21,43,W,150,7,59,   N,9,21,43,E,29,52,1,
S,27,40,2,W,23,0,0,     N,27,40,2,E,157,0,0,
N,0,58,37,W,37,0,0,     S,0,58,37,E,143,0,0,
];
while ($samples)
{
    $xx=$x=array_splice($samples,0,8);
    $ee=$e=array_splice($samples,0,8);
    func($x); test($xx,$ee,$x);
    func($e); test($ee,$xx,$e);
}

terkedilmiş fikirler

  • taşıma bayrakları ile döngü yaklaşımı yok: +5
  • taşıma bayrakları ile geriye doğru döngü: +7
  • Bunu PHP <5.4 için bir programa dönüştürebilirdim, ama boşver: -3

0

Befunge, 122 114 111 Bayt (110 karakter)

~"N"-v
 v"N"_"S"
v>,&.&.&.~"W"-
_"E"v"W"
+:v >,&"´"\-&"Z"*&
v\_\.00..@.-\"<".-1\ <
>1-.:"Z"/"<"\-\"Z"%:#^_\..@

Giriş formatı:

N 50 26 23W 4 18 29

Boylam yönüne dikkat edin ve ark saniye toplanmalıdır

Kodu burada test edebilirsiniz

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.