X dizesi, Y dizesinin bir alt dizisi midir?


23

Dizeleri X ve Y göz önüne alındığında, X olup olmadığını belirlemek altdizi boş dize her dize bir alt diziyle olarak kabul edilir Y'nin. (Örneğin, ''ve 'anna'bunların ekleridir 'banana'.)

Giriş

  • X, büyük olasılıkla boş, büyük / küçük harfe duyarlı bir alfasayısal dize
  • Y, büyük olasılıkla boş, büyük / küçük harfe duyarlı bir alfasayısal dize

Çıktı

  • Doğru veya Yanlış (veya eşdeğeri), X'in Y'nin bir alt simgesi olup olmadığını gösteren doğru bir şekilde

G / Ç örnekleri

X      Y        output

''     'z00'    True
'z00'  'z00'    True 
'z00'  '00z0'   False
'aa'   'anna'   True
'anna' 'banana' True
'Anna' 'banana' False

Kriterler

  • En kısa program, kaynak kodun bayt sayısına göre belirlendiğinde kazanır.

Örnek programlar


1
Neden 'anna' 'banana' nın altını oluşturuyor?
12'de

4
@kaoD - annaBir olan altdizi (ama değil bir alt dize) ait banana. X dizesi, Y'nin sıfır veya daha fazla Y öğesinin silinmesiyle Y'den elde edilebiliyorsa, Y dizesinin bir alt dizisidir; örneğin, silme bve ikinci adan bananaverir anna.
res

2
Bunun her scripting dilinde tek bir çözümü var, regex sunan, hem görmek daha önemsiz hem de daha fazla golf oynamak imkansız.
Joey

Yanıtlar:


18

Perl 5 , 17 bayt (+1?), Tam program

s//.*/g;$_=<>=~$_

Çevrimiçi deneyin!

pBayrakla perl tercümanına olduğu gibi çağır perl -pe 's//.*/g;$_=<>=~$_'. Başına bu zorluk başlangıçta gönderilmiş kurulan puanlama kuralları , bu bayrak bir ekstra bayt mal olur. Daha yeni kurallar uyarınca , AFAICT, ücretsiz olabilir.

Her iki durumda da, giriş dizeleri, stdin'deki ayrı yeni satır sonlandırmalı satırlarda sağlanmalıdır. Çıktı (stdout'a) 1, ilk girdi dizesi, ikincisinin alt dizesiyse veya değilse, hiçbir şey olmaz.

O Not hem girdi hatları sonunda bir yeni satır olması gerekir, ya da program düzgün çalışmaz. Alternatif olarak, lperl'nin yeni satırları çıkarması için komut satırı bayrağını çağırmaya ekleyebilirsiniz ; geçerli puanlama kurallarına bağlı olarak, bu bir ekstra bayta mal olabilir veya olmayabilir. Bu bayrağın kullanılmasının da çıktıya yeni bir satır ekleyeceğini unutmayın.

Orijinal versiyon (snippet, 18 bayt / karakter)

$x=~s//.*/g,$y=~$x

Girdi değişkenlerde verilir $xve $ysonuç ifadenin değeridir (skaler bağlamda). Not $xişleminde modifiye edilir. (Evet, kullanmak $_yerine $xdört karakter kurtarmama izin vereceğimi biliyorum , ancak bunu benim için biraz fazla sevimsiz bir snippet'te yapmak.)

O nasıl çalışır?

İlk bölüm, $x=~s//.*/gdizeyi .*her karakterin arasına ekler $x. İkinci kısım, bir regexp gibi $y=~$xdavranır $xve $yona karşı eşleşir . Perl regexps'de, .*sıfır veya daha fazla rasgele karakter ile eşleşirken, tüm alfanümerik karakterler uygun bir şekilde kendilerini eşleştirir.


Dışarı (yeni?) Fikir birliğine göre, başvurular snippet değil program veya işlev olmalıdır. Gönderiminiz yeterli değilse, düzenlemeyi düşünün.
user202729 26.0818

@ user202729: Bu zorluk bu fikir birliğinden çok daha eski, bu nedenle geriye dönük olarak uygulanacağı varsayılmadığı sürece, bu konudaki cevapların büyük olasılıkla "büyükbaba" olması gerektiği belirtildi. komut satırı anahtarlarını nasıl saydığınıza bağlı olarak bir bayt / karakter daha kısa bile olabilir (bayt tabanlı sayım işleminin AFAIK'ten daha yeni olduğunu unutmayın).
Ilmari Karonen

9

Yakut, 32 karakter

s=->x,y{y=~/#{[*x.chars]*".*"}/}

Bu çözelti, döner nilise xbir alt sekans değildir yve başka türlü bir sayı (yani kırmızı eşdeğer falseve true). Örnekler:

p s['','z00']        # => 0   (i.e. true)
p s['z00','z00']     # => 0   (i.e. true)
p s['z00','00z0']    # => nil (i.e. false)
p s['anna','banana'] # => 1   (i.e. true)
p s['Anna','banana'] # => nil (i.e. false)

1
temelde aynı şeyi yaptım, ama çok benzer, bu yüzden göndermeyeceğim. Sizi y=~/#{[*x.chars]*".*"}/(23 karakter) bırakacak olan lambdayı bırakmanın kabul edilebilir olduğunu düşünüyorum . şerefe!
Patrick Oscity

1
veya hatta y=~/#{x.split("")*".*"}/(21 karakter) :)
Patrick Oscity

@padde Bölünmüş olan aslında 24 karakterdir.
Howard

1
üzgünüm, sanırım yanlışlıkla y=~irb ile uğraşırken süre kapalı bıraktım ...
Patrick Oscity

Benim sürümüm 2 karakter daha kısa.
Hauleth,

7

Haskell, 51 37

h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y

Önemli gelişme için Hammar'a teşekkürler. Bu şimdi bir ekleme işlevidir, ancak olmamasının bir nedeni yok gibi görünüyor.

gösteri:

GHCi> :{
GHCi| zipWith (%) [""   , "z00", "z00" , "anna"  , "Anna"]
GHCi|             ["z00", "z00", "00z0", "banana", "banana"]
GHCi| :}
[True,True,False,True,False]

Boş liste diğer listeden daha küçük olduğundan, temel durumları basitleştirebilirsiniz s x y=x<=y. Ayrıca, bir operatör yaparak ve @bunun yerine bir -pattern kullanarak birkaç tane daha tasarruf edebilirsiniz (f:l). Bu, 37 karaktere h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
indirger

6

Python (48 karakter)

import re;s=lambda x,y:re.search('.*'.join(x),y)

Howard'ın Ruby cevabı ile aynı yaklaşım. Python'un regex paketini ve "ayrıntılı" içeriğini alma ihtiyacı konusunda çok kötü lambda. :-)


1
Katılıyorum, lambda ayrıntılı.
CalculatorFeline

4

Python, 59 karakter

def s(x,y):
 for c in y:
  if x:x=x[c==x[0]:]
 return x==""

Cevabımın Python'da daha iyi ifade edilebileceğini düşündüm.

Düzenleme: res önerileri eklendi.


Şüphesiz verilen x="a"ve y="ab"ile döngü çıkıp y=="b"geri dönecekti false?
Peter Taylor,

Ben karışık getirdiğiniz gönderildiği andan testlerde olarak örnekler yayınlandığı zamanı Evet @PeterTaylor fark ettim xve yyukarı. Benim fonksiyonlarımda ybir alt dizisi olması gerekiyor x. Sanırım karışıklığı önlemek için onları değiştiririm.
Gareth,

Sen 59 karakter için bu hakkı elde edebilirsiniz: def s(x,y): for c in y: if x:x=x[c==x[0]:] return x=="". Bir yorumda düzgün görüntülenmiyor, ancak ne demek istediğimi anlayabildiğinizi düşünüyorum. (Ayrıca, girinti düzeyini artırmak için bir boşluk daha eklenir.)
res

@res Teşekkürler, Python muhtemelen söyleyeceğiniz kadar kullandığım bir dil değil. Güzel golf. (Codegolf kullanıcı notuna göre 63 karakter - yeni satırları sayıyor olmalı).
Gareth

1
X'e karşı korumak ''ve çeşitli karakterleri yazmak için genişleyen dilimlemeyi kullanabilirsinizx=x[c==x[0:1]:]
Nolen Royalty

4

GolfScript (22 karakter)

X[0]+Y{1$(@={\}*;}/0=!

Girdilerin önceden tanımlanmış iki değişken olarak alındığını Xve YGolfScript'te oldukça alışılmadık olmasına rağmen olduğunu varsayalım. Yığında 1doğru veya 0yanlış için bırakır .



4

Burlesque (6 karakter)

Burlesque'de 6 karakter: R@\/~[ (x ve y'nin yığında olduğunu varsayalım. Buraya bakın .)



3

PHP, 90 karakter

<?function s($x,$y){while($a<strlen($y))if($y[$a++]==$x[0])$x=substr($x,1);return $x=="";}

Bildirimi kaldırabilir ifve basitleştirebilirsiniz $x=substr($x,$y[$a++]==$x[0]): ideone.com/Ch9vK
mellamokb

Ayrıca burada özyineleme kullanarak 82 karakterden daha kısa bir çözüm var: ideone.com/IeBns
mellamokb

3

Scala 106:

def m(a:String,b:String):Boolean=(a.size==0)||((b.size!=0)&&((a(0)==b(0)&&m(a.tail,b.tail))||m(a,b.tail)))

3

CoffeeScript 112 100 95 89

Kod golf ilk denemem ... umarım ailemi utandırmam!

z=(x,y)->a=x.length;return 1if!a;b=y.indexOf x[0];return 0if!++b;z x[1..a],y[b..y.length]

Düzenleme : ortaya çıkıyor Coffeescript beyaz boşluk ile düşündüğümden daha bağışlayıcı.

Res ve Peter Taylor için biraz daha şık yapmak için bazı ipuçları için teşekkürler


Aşağıdaki gibi bir kaç daha fazla karakter (bu hak yorumunda göstermez, ama ne demek istediğimi görebilirsiniz düşünüyorum) elimine edilebilir: z=(x,y)-> a=x.length return 1if a==0 b=y.indexOf x[0] return 0if b<0 z x[1..a],y[b+1..y.length]. (Bazı tarayıcılarda, örneğin Chrome'da, sağ tıklatarak ve ardından Elemanı İncele) doğru şekilde görüntülenen yorum kodunu görebilirsiniz.)
res

a.lengthasla negatif olmayacak, böylece bir karakteri if a==0ile değiştirerek daha fazla tasarruf edebilirsiniz if a<1. CoffeeScript'in belirtme yönteminin nasıl çalıştığını bilmiyorum, ancak if0iki belirteç söz konusuysa , her iki koşulu da (yani if1>a) tersine çevirerek iki tasarruf daha kazanabilirsiniz .
Peter Taylor

Güzel nokta. if1>ageçerli değil, fakat if!akarakter daha kısa! Ben de dönüştürerek fazladan bir karakter tıraş anladı b+1için bde aynı yapım ve önceki satırda artan ifbir 0 / non-0 durumla karşı karşıya beri hile mümkün.
Johno

3

C #, 70 113 107 90 karakter

static bool S(string x,string y){return y.Any(c=>x==""||(x=x.Remove(0,c==x[0]?1:0))=="");}

6
Bu bir alt diziden ziyade bir alt dizgiyi aramıyor mu?
Gareth

evet yanlış okudum. Şimdi düzeltilmeli.
Mizer

1
Linq kadar eğlenceli, bunun yerine özyinelemeyi kullanarak% 10 tasarruf edebileceğinizi düşünüyorum.
Peter Taylor

İşte en iyi girişimim. Hala daha uzun. static bool S(string x,string y){if(x!=""&&y=="")return false;return x==""||S(y[0]==x[0]?x.Remove(0,1):x,y.Remove(0,1));}
Mizer

Özyinelemeli olanı azaltabilirsiniz x==""||y!=""&&S(...), ancak hala güncellenmiş Linq sürümünden daha uzun. Güzel kullanımı Any!
Peter Taylor

3

Mathematica 19 17 27

LongestCommonSequenceiki dizenin en uzun bitişik olmayan alt dizesini döndürür. ( LongestCommonSubsequenceEn uzun bitişik sırasını döndüren, karıştırılmaması gereken) .

Aşağıdaki, en uzun bitişik sıranın iki dizenin ilki olup olmadığını kontrol eder. (Yani daha kısa olan dize ve ardından daha büyük olan dize girmelisiniz)

LongestCommonSequence@##==#& 

Örnekler

LongestCommonSequence@## == # &["", "z00"]
LongestCommonSequence@## == # &["z00", "z00"]
LongestCommonSequence@## == # &["anna", "banana"]
LongestCommonSequence@## == # &["Anna", "banana"]

Doğru doğru yanlış

Kritik test üçüncü olanıdır, çünkü "anna" bitişik olmayan "muz" da bulunur.


3

Python 3.8 (yayın öncesi) , 42 bayt

lambda a,b:''in[a:=a[a[:1]==c:]for c in b]

Çevrimiçi deneyin!

Python 3.8 (yayın öncesi) , 48 bayt

lambda a,b,j=0:all((j:=1+b.find(c,j))for c in a)

Çevrimiçi deneyin!

Python 2,48 bayt

lambda a,b:re.search('.*'.join(a),b)>0
import re

Çevrimiçi deneyin!

Lynn'in bu cevabından kopyalandı . >0Sadece truthy / Falsey çıkış yolunda olup olmadığını göz ardı edilebilir.

Python 2,50 bayt

f=lambda a,b:b and f(a[a[:1]==b[0]:],b[1:])or''==a

Çevrimiçi deneyin!

Python 2,50 bayt

lambda a,b:reduce(lambda s,c:s[c==s[:1]:],b,a)==''

Çevrimiçi deneyin!


Deniz aygırı harika kullanımı.
Jonathan Allan,

2

C - 74 71 64

Bu, Peter Taylor'ın çözümünü geçmiyor, ama bence çok eğlenceli (artı, bu tam bir çalışma programı, sadece bir işlev değil)

main(int c,char**v){for(;*v[1]!=0;++v[1])v[2]+=*v[1]==*v[2];return*v[2];}

main(int c,char**v){for(;*v[1];++v[1])v[2]+=*v[1]==*v[2];return*v[2];}


main(c,v)char**v;{while(*v[1])v[2]+=*v[1]++==*v[2];return*v[2];}

Ve asılsız:

main(int argc, char** argv){
   char * input = argv[1];
   char * test  = argv[2];

   // advance through the input string. Each time the current input
   // character is equal to the current test character, increment
   // the position in the test string.

   for(; *input!='\0'; ++input) test += *input == *test;

   // return the character that we got to in the test string.
   // if it is '\0' then we got to the end of the test string which
   // means that it is a subsequence, and the 0 (EXIT_SUCCESS) value is returned
   // otherwise something non-zero is returned, indicating failure.
   return *test;
}

Test etmek için şöyle bir şey yapabilirsiniz:

./is_subsequence banana anna && echo "yes" || echo "nope"    
# yes
./is_subsequence banana foobar && echo "yes" || echo "nope"    
# nope

!=0bir durumda biraz ayrıntılı ... Program vs fonksiyonu sorunun açıkça belirtmesi gereken bir şey ve burada değil, bu yüzden cevaplar farklı seçenekler alır.
Peter Taylor

Kahretsin, bu !='\0'golf dışı kod yazmaktan kötü (iyi?) Bir alışkanlık, bu golfün son iki raunduna girmesine izin verdim, gelecekte daha dikkatli olmak zorunda kalacağım. Fonksiyonla ilgili olarak, evet, kesinlikle haklısınız.
Gordon Bailey

@ GordonBailey çarpmak için üzgünüm, ama daha kısa bir versiyonda birkaç değişiklik yaptım.
oldrinb

2

Python, 66 62 59 58 karakter

Eğlenceli bir çözüm, kesinlikle temiz bir problem.

def f(n,h,r=0):
 for c in h:r+=n[r:r+1]==c
 return r==len(n)

2

Ruby 32 30 28

f=->a,b{b.match a.tr'','.*'}

Bu , münasebetiyle veya başka şekilde ise MatchDataörneği döndürür.abnil

Sırası yerine alt dize bulan eski sürüm

Yakut 15

f=->a,b{!!b[a]}

Kullanarak String#[](str)döner bu yöntem strise strde bir alt selfve !!geri Booleandöndürülen değer boolean olarak etkili olabilir (ve olması gerekmez trueya da false) o zaman sadece 13 karakter olabilir:

f=->a,b{b[a]}

Bu dönecektir nileğer abir alt dize değildir b.


2
Güzel, ama soru bir alt dize yerine bir maaş soruyor.
Gareth

2

SWI-Prolog, SICStus

SICStus'un yerleşik yüklem alt listesi / 2'si , ilk listedeki tüm öğelerin ikinci listede de görünüp görünmediğini kontrol eder. Bu yüklem SWI-Prolog'da, sorgu tarafından yüklenebilen uyumluluk kitaplığı yoluyla da kullanılabilir [library(dialect/sicstus/lists)]..

Örnek çalışma:

25 ?- sublist("","z00").
true.

26 ?- sublist("z00","z00").
true .

27 ?- sublist("z00","00z0").
false.

28 ?- sublist("aa","anna").
true .

29 ?- sublist("anna","banana").
true .

30 ?- sublist("Anna","banana").
false.

Bayt sayısı teknik olarak 0 olabilir, çünkü burada yaptığımız tek şey, bir programı nasıl çalıştırdığımız ve ona girdi sağladığımız gibi sorgulamak.


2

PHP, 41 Bayt

doğru için 1, yanlış için hiçbir şey yazdırmaz

<?=!levenshtein($argv[1],$argv[2],0,1,1);

Yalnızca 1. kelimeden 2. kelimeye yapılan eklemeler yapılmışsa, gerçek durumlar için sayım sıfırdır.

levenshtein

Çevrimiçi deneyin!

PHP, 57 Bayt

doğru için 1, yanlış için 0 yazdırır

Regex oluşturur

<?=preg_match(_.chunk_split($argv[1],1,".*")._,$argv[2]);

Çevrimiçi deneyin!


1
-2 bayt: öncü .*gerekli değildir. -2 bayt: düğünle atama $argviçin $a. +24 bayt: array_map(preg_quote())özel karakterlere ihtiyaç duyar (ikinci preg_quoteparametreden kaçınmak için parantez olarak parantez kullanın .)
Titus

2
@Titus önde. Özel karakterler varsa, teklifte haklısın. Atamayı saydığın için teşekkür ederim. Daha önceki bir çözüme göre kopyalayıp yapıştırın ve düşünmeyin
Jörg Hülsermann 14:17

1
preg_matchSınırlayıcılar olduğu sürece boş bir regex'ten şikayetçi olmayacak. Sadece herşeyle eşleşecek. Fakat preg_quote +24: değil, sadece +22 bayttır array_map(preg_quote,str_split(...)).
Titus,

1
Fakat girdilerin alfanümerik olması garantidir :) Ama yine de liderliğe ihtiyacınız yok .*.
Titus,

2

Brachylog , 2 bayt

⊆ᵈ

Çevrimiçi deneyin!

Olduğu gibi bu cevap, bir girdi ve çıktı değişkenleri arasında bir ilişki beyan ve yüklem yerleşik değiştirir yerine girdi değişkeni birinci ve ikinci elemanları arasında aynı ilişkiyi beyan etmek bir meta-yüklem (ve Birleştir'me Çıktı değişkeni ikinci öğeyle birlikte ancak bu, burada önemi olmayan bir karar sorunudur. X⊆YX'in Y'nin bir alt simgesi olduğu iddiası, öyleyse öyledir [X,Y]⊆ᵈ.

Bu kestirim (elbette hangisi basarsa başarı veya başarısızlıktan çıktı true. veya false.bir program olarak çalıştırıldığı zaman ya ) iki dizenin bir listesi olarak girdi alır. Girdi biraz daha esnekse ...

Brachylog , 1 bayt

Çevrimiçi deneyin!

X dizesini giriş değişkeni olarak ve Y dizesini çıkış değişkeni olarak alır. Daha önce olduğu gibi başarı ya da başarısızlık yoluyla çıktılar. Tam bir program olarak çalıştırılırsa , giriş olarak X, ilk komut satırı argümanı olarak Y verilir.


1

CoffeeScript 73

Özyineleme yerine regex kullanarak, alternatif bir CoffeeScript cevabı:

z=(x,y)->a='.*';a+=c+'.*'for c in x;b=eval('/'+a+'/');(y.replace b,'')<y

Samanlık, iğneden yapılmış çok açgözlü bir regex ile eşleşirse, boş bir dize ile değiştirilecektir. Samanlık başladığından daha kısa ise, iğne bir sıraydı.

Her ikisi de boş dizeler olduğunda xve yher ikisi de yanlışsa döndürür . Boş bir dize kendisinin bir önceliği olup olmadığını bize söylemek için bir filozofa ihtiyacımız olduğunu düşünün!

(Benim haklı çıkarmak için yeterince farklı hissediyor çünkü önceki benim ayrı bir cevap olarak gönderildi).


1

PowerShell, 38

$args[1]-clike($args[0]-replace'','*')

Tabii ki, böyle herhangi bir regex veya desen eşleştirme tabanlı çözüm, daha uzun dizelerle ciddi performans sorunlarına sahiptir. Ancak kısalık ölçüt olduğundan ...


1

Y'nin tüm alt dizilerini üreten bir tür anti-çözüm:

Python 93

l=len(y)
print x in[''.join(c for i,c in zip(bin(n)[2:].rjust(l,'0'),y)if i=='1')for n in range(2**l)]

1

APL (31)

Dize kullanımı APL'de biraz eksik.

{(⊂'')∊N←⍵↓⍨¨1,⍨=/⊃¨⍵:~×⍴⊃N⋄∇N}

kullanımı:

      {(⊂ '') ←N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} 'anna' 'muz'
1
      {(⊂ '') ←N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} 'Anna' 'muz'
0
      {(⊂ '') ←N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} '' 'muz'
1

1

Python 132

Daniero's'a benzer. En kolay çözüm değil, ama denemek eğlenceliydi. Python'da yeniyim, bu yüzden biraz daha fazla şey bilseydim daha kısa tutabileceğime eminim.

def f(i):
    s=x;j=0
    while j<len(s):t=~i%2;s=[s[:j]+s[j+1:],s][t];j+=t;i>>=1
    return s==y
print True in map(f,range(1,2**len(x)))

1

Python - 72

def f(a,b):
 c=len(a)
 for i in b:a=a.replace(i,"",1)
 print len(a+b)==c

1

Python ( 75 52)

s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])

Basit özyinelemeli çözüm. İlk kez golf oynamanın sebebi, bu yarışmayı kesmekle ilgili herhangi bir ipucu çok takdir edilmek :)

Aşağıdakilerle test edilmiştir:

assert s('anna', 'banana') == True
assert s('oo0', 'oFopp0') == True
assert s 'this', 'this is a string') == True
assert s('that', 'this hat is large') == True
assert s('cba', 'abcdefg') == False

Bazı akıllı boolean hileler için @ lirtosiast için teşekkürler.


1
Bu 52 karaktere kadar alabilirsiniz:s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
lirtosiast

Teşekkürler, zekice,
booleanı

1

PHP, 75 65 64 bayt

for(;$p=@strpos(_.$argv[2],$c=$argv[1][$i++],$p+1););echo""==$c;

komut satırı argümanlarından girdi alır; 1false için true boş dize yazdırır . İle koş -r.

açıklama:

  • strposfalseİğne $csamanlıkta değilse $argv[2](konumdan sonra $p),
    döngünün kırılmasına neden olursa döndürür .
  • strposAyrıca falseboş bir iğne için döner , sonunda$argv[1] .
  • Eğer $argv[1]bir dizisi olan $argv[2], $cne zaman döngü kırılır boş olacaktır.
  • strpos ihtiyaçlar @Empty needleuyarıyı bastırmak .

+$pbunun yerine bunun $p+1altını
çizmeye

@ JörgHülsermann +1samanlık dizesinde ilerlemek için gereklidir; ve alt çizgi, $p=-1başlatmayı önler . Ama ... ben kaçınabilirim false!==.
Titus,

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.