Urutkan nama band


22

Deskripsi tantangan

Anda memiliki perpustakaan musik dengan banyak lagu yang direkam oleh banyak band-band, yang masing-masing memiliki nama, seperti Queen, Aerosmith, Sunny Day Real Estate, The Strokes. Ketika pemutar audio menampilkan pustaka menurut abjad menurut nama band, biasanya lompatan Thebagian itu, karena banyak nama band mulai dengan The, sehingga lebih mudah untuk menavigasi melalui koleksi media Anda. Dalam tantangan ini, diberi daftar (array) string, Anda perlu mengurutkannya seperti itu (yaitu, menghilangkan Thekata di awal nama). Anda dapat menulis metode atau program kerja penuh.

Input / output sampel

[Queen, Aerosmith, Sunny Day Real Estate, The Strokes] -> [Aerosmith, Queen, The Strokes, Sunny Day Real Estate]
[The Ramones, The Cure, The Pixies, The Roots, The Animals, Enrique Iglesias] -> [The Animals, The Cure, Enrique Iglesias, The Pixies, The Ramones, The Roots]
[The The, The They, Thermodynamics] -> [The The, Thermodynamics, The They]

Catatan / Tepi kasus

  • Mengurutkan secara leksikografis tidak peka huruf besar-kecil, jadi The Police, The policedan the policesemuanya setara,

  • Algoritme Anda hanya menghilangkan thekata pertama , sehingga band diberi nama The Theatau The The Banddiurutkan secara normal dengan kata kedua the,

  • Band bernama The(kata tiga huruf) diurutkan secara normal (tanpa melewatkan),

  • Urutan dua band dengan nama yang sama, yang salah satunya dimulai dengan the(seperti The Policedan Police) tidak ditentukan,

  • Anda dapat mengasumsikan bahwa jika nama band terdiri dari lebih dari satu kata, mereka dipisahkan oleh karakter spasi tunggal. Anda tidak perlu menangani spasi putih depan atau belakang,

  • Semua string input cocok [A-Za-z0-9 ]*, yaitu mereka hanya terdiri dari huruf kecil dan besar alfabet Inggris, digit dan karakter spasi,

  • Ingat bahwa ini adalah tantangan , jadi buat kode Anda sesingkat mungkin!


Apakah hanya nama angka yang muncul sebelum atau sesudah abjad?
AdmBorkBork


1
Seperti apa urutan Thedan The The? (Sebagian besar jawaban mungkin perlu diubah jika itu sesuatu selain yang tidak terdefinisi)
Brad Gilbert b2gills

bagaimana dengan Los Lobos?
njzk2

3
The The adalah band yang sebenarnya. (bersama dengan Who, The What, The Where, The When, The Why, dan The How)
DanTheMan

Jawaban:


7

Python, 56 62 64 byte

lambda b:sorted(b,key=lambda x:(x,x[4:])[x.lower()[:4]=='the '])

Cobalah

Terima kasih kepada @Chris H untuk menunjukkan bahwa lstrip()tidak menangani The Thedengan benar, karena strip ini meledakkan semua karakter yang cocok dan mengurutkannya sebagai string kosong, dan @manatwork untuk menemukan kesalahan dalam menggunakan replace(). Versi baru akan berfungsi.

Versi lama:

lambda b:sorted(b,key=lambda x:x.lower().lstrip('the '))

1
Saya tidak yakin. Menambahkan "Hewan-hewan" ke daftar terakhir memberi ['The The', 'The', 'The Animals', 'Thermodynamics', 'The They']. Kasing tepi ke-2 menyarankan duduk harus ['The Animals', 'The The', 'The', 'Thermodynamics', 'The They'] (atau menukar item ke-2 dan ke-3). Sedikit mengutak-atik menyarankan ruang di dalam strip('the ')diabaikan - cobafor x in ['The The', 'The They', 'Thermodynamics', 'The', 'The Animals']: print (x.lower().strip('the '))
Chris H

Itu replace()tidak jauh lebih baik: 'what the snake'.replace('the ','',1)hasil 'what snake'.
manatwork

5

V , 32 28 byte

ç^The /dwA_
:sort
ç_/$xIThe 

Cobalah online!

Catatan untuk diri sendiri: Buat singkatan untuk :sortjadi saya tidak perlu 6 byte penuh untuk satu perintah!

Penjelasan:

ç^The /     "On every line starting with 'The ',
       dw   "Delete a word
         A_ "And (A)ppend an underscore '_'

:sort       "Sort all lines alphabetically

ç_/         "On every line containing an underscore,
   $x       "Delete the last character
     IThe   "And prepened 'The '

Tidak terbiasa dengan V, tetapi sepertinya ini berfungsi dengan baik tanpa tanda bintang. Apakah ini kebetulan dengan input, atau sebenarnya tidak dibutuhkan?
kirkpatt

1
@kirkpatt Ide bagus! Itu hampir berhasil, tetapi tidak cukup. Misalnya, dengan input ini secara keliru menempatkan "Radiohead" setelah "The Ramones" dan "The Roots". Namun, itu memberi saya ide ...
DJMcMayhem

Apa yang terjadi jika thedalam semua huruf kecil, seperti the pAper chAse?
AdmBorkBork

4

Retina , 34 byte

Linefeed tambahan sangat penting.

%`^
$';
T`L`l`.+;
m`^the 

O`
.+;

I / O adalah satu band per baris.

Cobalah online!

Penjelasan

%`^
$';

Gandakan setiap baris, menggunakan ; sebagai pemisah.

T`L`l`.+;

Putar semuanya di depan a ; huruf kecil.

m`^the 

Hapus apa saja the yang muncul di awal baris.

O`

Urutkan garis.

.+;

Hapus awal garis yang kami gunakan untuk menyortir.


Tidak bisakah Anda mengemas 3 Langkah pertama menjadi satu langkah? Seperti di PCRE: s / (?i:the )?(.*)/ \L$1\E;$0/
Falco

@ Falco. NET tidak mendukung perubahan kasus dalam string substitusi dan saya belum menambahkannya ke custom replina Retina.
Martin Ender

4

Pyke, 16 byte

.#l1D"the ".^4*>

Coba di sini!

.#                - sort_by(V, input)
  l1              -  i = i.lower()
      "the ".^    -   i.startswith("the ")
              I   -  if ^:
               4> -   i[4:]

3

Perl, 52 byte

-13 byte terima kasih kepada @manatwork
-1 byte terima kasih ke @ msh210

sub f{lc pop=~s/^the //ri}print sort{f($a)cmp f$b}<>

Satu pita per baris sebagai input, dan demikian juga output.

Implementasinya cukup lurus ke depan: program mencetak daftar band, diurutkan dengan bantuan fungsi kustom ( f) yang mengembalikan nama band huruf kecil tanpa akhirnya memimpin the.


Lebih pendek dengan substitusi bukan pencocokan: sub f{lc$_[0]=~s/^the //ir}.
manatwork

1 byte lebih pendek, terima kasih.
Dada

Sebenarnya saya menghitung 2 atau 3 byte lebih pendek: tidak perlu untuk kedua kurung di sekitar lcparameter dan ibendera sebagai pengganti. Atau pernahkah Anda bertemu dengan test case yang tidak berfungsi?
manatwork

Berpikir lagi, jumlah opsi baris perintah juga bisa berkurang jika Anda mengambil setiap nama band pada baris yang terpisah: perl -e 'sub f{lc$_[0]=~s/^the //ri}print sort{f($a)cmp f$b}<>' <<< $'Queen\nAerosmith\nSunny Day Real Estate\nThe Strokes'.
manatwork

1
Simpan tiga byte: lc popbukannya lc$_[0], dan saybukannya print. (Yang terakhir membutuhkan -M5.01, yang gratis.) Diuji dalam Strawberry 5.20.2 dengan hanya test case pertama dari pertanyaan.
msh210

2

Python, 66 72 69 byte

lambda x:sorted(x,key=lambda a:a[4*(a.lower()[:4]=='the '):].lower())

Gunakan sortedmetode Python dengan keyargumen kata kunci untuk mengurutkan berdasarkan nama minus "The". Ini adalah lambda; untuk menyebutnya, beri nama dengan meletakkan f=di depan.

Sekarang dengan sensitivitas kasus ekstra!


2
Itu tidak memenuhi persyaratan kekurangan huruf besar-kecil, meskipun ... Nama band dapat dimulai dengan the , dalam hal ini metode ini tidak akan berfungsi dengan baik.
shooqie

@shooqie Oh, saya tidak melihat persyaratan itu. Saya akan memperbaikinya.
Tembaga


2

Perl 6 , 26 byte

*.sort({fc S:i/^'the '//})

Penjelasan:

# 「*」 is the input to this Whatever lambda
*.sort(

  # sort based on the return value of this Block lambda
  {
    fc # foldcase the following

    # string replace but not in-place
    S
      :ignorecase
      /
        # at the start of the string
        ^

        # match 「the 」
        'the '

      # replace with nothing
      //
  }
)

Uji:

use v6.c;
use Test;

my @tests = (
  « Queen Aerosmith 'Sunny Day Real Estate' 'The Strokes' »
    => « Aerosmith Queen 'The Strokes' 'Sunny Day Real Estate' »,
  « 'The Ramones' 'The Cure' 'The Pixies' 'The Roots' 'The Animals' 'Enrique Iglesias' »
    => « 'The Animals' 'The Cure' 'Enrique Iglesias' 'The Pixies' 'The Ramones' 'The Roots' »,
  « 'The The' 'The They' Thermodynamics »
    => « 'The The' Thermodynamics 'The They' »,
);

# give it a lexical name for clarity
my &band-sort = *.sort({fc S:i/^'the '//});

plan +@tests;

for @tests -> ( :key(@input), :value(@expected) ) {
  is-deeply band-sort(@input), @expected, @expected.perl;
}
1..3
ok 1 - ("Aerosmith", "Queen", "The Strokes", "Sunny Day Real Estate")
ok 2 - ("The Animals", "The Cure", "Enrique Iglesias", "The Pixies", "The Ramones", "The Roots")
ok 3 - ("The The", "Thermodynamics", "The They")

2

PowerShell v2 +, 33 32 29 byte

$args|sort{$_-replace'^the '}

Disimpan 3 byte berkat @MathiasRJessen

Input melalui argumen baris perintah. Urutkan nama asli berdasarkan hasil dari blok skrip {...}yang melakukan regex -replaceuntuk menghapus yang terkemuka (case-insensitive) "the ".

Contohnya

PS C:\Tools\Scripts\golfing> .\sort-band-names.ps1 'the Ramones' 'The cure' 'The Pixies' 'The Roots' 'the Animals' 'Enrique Iglesias'
the Animals
The cure
Enrique Iglesias
The Pixies
the Ramones
The Roots

PS C:\Tools\Scripts\golfing> .\sort-band-names.ps1 'The The' 'The They' 'Thermodynamics'
The The
Thermodynamics
The They

PS C:\Tools\Scripts\golfing> .\sort-band-names.ps1 'THE STOOGES' 'The Strokes' 'The The' 'the they' 'the band' 'STP'
the band
THE STOOGES
STP
The Strokes
The The
the they

-replacecase-insensitive secara default, '^the 'sudah cukup untuk polanya
Mathias R. Jessen

@ MathiasR.Jessen Ya, terima kasih atas pengingatnya.
AdmBorkBork

@ValueInk Lihat komentar Mathias tentang ketidakpekaan kasus dan contoh terakhir yang saya tambahkan.
AdmBorkBork

2

JavaScript / ECMAScript 6 93 70 byte

70 Terima kasih kepada Neil dan Downgoat untuk nasihatnya

B=>B.sort((a,b)=>R(a).localeCompare(R(b)),R=s=>s.replace(/^the /i,''))

Versi yang Dapat Dibaca untuk varian 70-byte

let sortBandNames = (bandNames) => {
    let stripThe = (name) => name.replace(/^the /i, '');
    let compareFunc = (a, b) => stripThe(a).localeCompare(stripThe(b));
    return bandNames.sort(compareFunc)
};

93

f=B=>{R=s=>s.toLowerCase().replace(/the /,'');return B.sort((a,b)=>R(a).localeCompare(R(b)))}

Versi yang Dapat Dibaca untuk varian 93-byte

let sortBandNames = (bandNames) => {
    let stripThe = (name) => name.toLowerCase().replace(/the /, '');
    let compareFunc = (a, b) => stripThe(a).localeCompare(stripThe(b));
    return bandNames.sort(compareFunc)
};

Bukankah seharusnya regexp itu ada ^di dalamnya? Juga, localeCompare tidak peka huruf besar-kecil pada sistem saya, jadi saya tidak perlu toLowerCase, hanya sebuah /iflag pada regexp. Akhirnya Anda dapat golf ini sebagai berikut: B=>B.sort((a,b)=>...,R=s=>...)- sortMengabaikan parameter tambahan yang ditetapkan R.
Neil

Di mana regex akan pergi? Itu akan menjadi negasi dan ungkapan itu seharusnya cocok dan menghapus "the". Saya akan mencoba menggunakan perbandingan lokal tanpa konversi huruf kecil.
Pandacoder

@Pacacoder ^shuold pergi di awal regex
Downgoat

@Downgoat Dari pengujian semua kasus yang diberikan, dan beberapa kasus saya datang dengan maksud khusus untuk melanggar RegEx, dengan atau tanpa ^ Saya tidak mendapatkan perubahan dalam perilaku, hanya karakter tambahan yang tidak menyelesaikan apa pun.
Pandacoder

@Pacacoder yang tidak membuatnya valid. ^ adalah jangkar yang mensyaratkan "the" berada di awal per spec
Downgoat

1

Java 8, 178 byte

void q(String[]s){java.util.Arrays.sort(s,(a,b)->(a.toLowerCase().startsWith("the ")?a.substring(4):a).compareToIgnoreCase(b.toLowerCase().startsWith("the ")?b.substring(4):b));}

Versi tidak disatukan:

void sort(String[] bands) {
    java.util.Arrays.sort(bands, (a, b) -> 
        (a.toLowerCase().startsWith("the ") ? a.substring(4) : a).compareToIgnoreCase(
            b.toLowerCase().startsWith("the ") ? b.substring(4) : b
        )
    );
}

Sebut seperti itu:

public static void main(String[] args) {
    String[] bands = {"The Strokes", "Queen", "AC/DC", "The Band", "Cage the Elephant", "cage the elephant"};
    sort(bands); // or q(bands) in the golfed version
    System.out.println(java.util.Arrays.toString(bands));
}

Saya tahu Anda sudah menjawab ini hampir setahun yang lalu, tetapi Anda bisa bermain golf beberapa hal. Karena Anda menyatakan Anda menggunakan Java 8, Anda dapat mengubah void q(String[]s){...}ke s->{...}. Dan Anda dapat mengubah keduanya (x.toLowerCase().startsWith("the ")?x.substring(4):x)dengan x.replaceFirst("(?i)the ",""). Jadi totalnya menjadi: s->{java.util.Arrays.sort(s,(a,b)->a.replaceFirst("(?i)the ","").compareToIgnoreCase(b.replaceFirst("(?i)the ","")));}- 118 byte
Kevin Cruijssen

Trik rapi dengan replaceFirst. Ketika saya menjawab ini, saya telah diberitahu beberapa kali tentang jawaban lain yang s->{ ... }tidak diizinkan dan saya harus memiliki tanda tangan metode lengkap dengan tipe dan yang lainnya. Saya tidak tahu apakah itu berubah sejak saat itu.
Justin

Tidak yakin tentang saat itu, tetapi hari ini diizinkan dan digunakan oleh hampir semua orang yang bermain golf di Jawa atau C # .NET.
Kevin Cruijssen

0

Nim , 96 byte

import algorithm,strutils,future
x=>x.sortedByIt toLower it[4*int(it.toLower[0..3]=="the ")..^0]

Itu importmengambil banyak byte:|

Terjemahan dari jawaban Python saya .

Ini adalah prosedur anonim; untuk menggunakannya, itu harus dilewatkan ke dalam prosedur pengujian. Inilah program lengkap yang dapat Anda gunakan untuk pengujian:

import algorithm,strutils,future
proc test(x: seq[string] -> seq[string]) =
 echo x(@["The The", "The They", "Thermodynamics"]) # Substitute your input here
test(x=>x.sortedByIt toLower it[4*int(it.toLower[0..3]=="the ")..^0])

0

Haskell, 84 byte

import Data.List
p(t:'h':'e':' ':s)|elem t"Tt"=s
p s=s
sortBy(\a b->p a`compare`p b)

Telepon dengan

sortBy(\a b->p a`compare`p b)["The The", "The They", "Thermodynamics"]

Kasus cobaan:

let s = sortBy(\a b->p a`compare`p b)
and[s["Queen", "Aerosmith", "Sunny Day Real Estate", "The Strokes"]==["Aerosmith", "Queen", "The Strokes", "Sunny Day Real Estate"],s["The Ramones", "The Cure", "The Pixies", "The Roots", "The Animals", "Enrique Iglesias"]==["The Animals", "The Cure", "Enrique Iglesias", "The Pixies", "The Ramones", "The Roots"],s["The The", "The They", "Thermodynamics"]==["The The", "Thermodynamics", "The They"]]

0

MATL , 16 byte

tk'^the '[]YX2$S

Format input adalah (setiap baris sesuai dengan kasus uji)

{'Queen', 'Aerosmith', 'Sunny Day Real Estate', 'The Strokes'} 
{'The Ramones', 'The Cure', 'The Pixies', 'The Roots', 'The Animals', 'Enrique Iglesias'}
{'The The', 'The They', 'Thermodynamics'}

Cobalah online!

Penjelasan

t        % Implicitly input cell array of strings. Push another copy
k        % Convert to lowercase
'^the '  % String to be used as regex pattern: matches initial 'the '
[]       % Empty array
YX       % Regex replacement: replace initial 'the ' in each string by empty array
2$S      % Sort input according to the modified cell array. Implicitly display

0

C #, 139 Bytes

using System.Linq;System.Collections.IEnumerable S(string[] l)=> l.OrderBy(b=>(b.ToLower().StartsWith("the ")?b.Substring(4):b).ToLower());

Coba online!

Tanpa menghitung usings, jawabannya adalah 102 byte.


Saya percaya Anda dapat mengabaikan final ToLower()karena persyaratan case-insensitive
TheLethalCoder

Anda juga dapat menjadikannya fungsi anonim yang akan menghemat beberapa byte:
TheLethalCoder

l=>l.OrderBy(b=>(b.ToLower().StartsWith("the ")?b.Substring(4):b));Untuk 67 byte dan kemudian Anda perlu menambahkan using System.Linq;juga
TheLethalCoder

@TheLethalCoder: Saya perlu yang kedua ToLowerkarena persyaratan case-insensitive. Kalau tidak, pesanan akan peka huruf besar-kecil.
raznagul

Oke poin tentang mengonversikannya ke fungsi anonim masih berdiri
TheLethalCoder

0

BASH, 64 Bytes

sed 's/^the / /;s/^The /    /'|sort -fb|sed 's/^ /the /;s/^ /The /'

Input: stdin, satu band per baris. Output: stdout

Catatan: Penggantian kedua (s / ^ The / / dan s / ^ / The /) menggunakan karakter tab, jadi mereka tidak selalu menyalin / menempel dengan benar.


0

Bash + coreutils, 44 byte

sed '/^the /I!s,^,@ ,'|sort -dk2|sed s,@\ ,,

Penjelasan: format input dan output adalah satu pita per baris

sed '/^the /I!s,^,@ ,'   # prepend '@ ' to each line not starting with 'the ', case
                         #insensitive. This adds a temporary field needed by sort.
sort -dk2                # sort in ascending dictionary order by 2nd field onward
sed s,@\ ,,              # remove the temporary field

Uji coba (menggunakan dokumen di sini dengan EOF sebagai penanda akhir):

./sort_bands.sh << EOF
> Queen
> Aerosmith
> Sunny Day Real Estate
> The Strokes
> EOF

Keluaran:

Aerosmith
Queen
The Strokes
Sunny Day Real Estate

0

Vim, 18 byte

Nah sekarang saya menyadari ini mungkin, saya agak malu dengan jawaban 26 byte V saya, terutama karena V seharusnya lebih pendek dari vim. Tapi ini cukup builtin.

:sor i/\(The \)*/<CR>

Penjelasan (langsung dari bantuan vim):

                            *:sor* *:sort*
:[range]sor[t][!] [b][f][i][n][o][r][u][x] [/{pattern}/]
            Sort lines in [range].  When no range is given all
            lines are sorted.

            With [i] case is ignored.

            When /{pattern}/ is specified and there is no [r] flag
            the text matched with {pattern} is skipped, so that
            you sort on what comes after the match.
            Instead of the slash any non-letter can be used.

0

C, 216 212 135 + 5 ( qsort) = 221 217 140 byte

M(void*a,void*b){char*A,*B;A=*(char**)a;B=*(char**)b;A=strcasestr(A,"The ")?A+4:A;B=strcasestr(B,"The ")?B+4:B;return strcasecmp(A,B);}

Yah, aku akhirnya menyelesaikan ini C. Tips bermain golf sangat dihargai.

Dalam pengajuan ini, Madalah fungsi perbandingan yang harus disediakan qsort. Oleh karena itu, untuk mengaktifkan ini, Anda harus menggunakan qsortdalam format di qsort(argv++,argc--,8,M)mana argvberisi argumen baris perintah dan argcjumlah argumen yang disediakan.

Cobalah secara Online!


0

05AB1E, 27 bytes (non-competing)

vyð¡RD¤…TheQsgα£Rðý})‚øí{ø¤

Try it online!

Explanation

vyð¡RD¤…TheQsgα£Rðý})‚øí{ø¤   Argument l
v                 }           For each y in l, do:
 yð¡                            Split y on space
    RD                          Reverse and duplicate
      ¤…TheQ                    Last element equals "The" (true = 1, false = 0)
            sgα                 Absolute difference with length of array
               £                Get elements from index 0 to calculated difference
                R               Reverse
                 ðý             Join on space
                    )‚øí      Pair each element with original
                        {ø¤   Sort and get the original band name

0

Groovy, 34 bytes

{it.sort{it.toLowerCase()-'the '}}

41% my answer is .toLowerCase(), kill me now.


Output

When running...

({it.sort{it.toLowerCase()-'the '}})(['The ramones','The Cure','The Pixies','The Roots','The Animals','Enrique Iglesias'])

The result is...

[The Animals, The Cure, Enrique Iglesias, The Pixies, The ramones, The Roots]

With no debug or error output.


0

q/kdb+, 36 33 bytes

Solution:

{x(<)@[x;(&)x like"[Tt]he *";4_]}

Example:

q){x(<)@[x;(&)x like"[Tt]he *";4_]}("Queen";"Aerosmith";"Sunny Day Real Estate";"The Strokes";"the Eagles")
"Aerosmith"
"the Eagles"
"Queen"
"The Strokes"
"Sunny Day Real Estate"

Explanation:

Strip out any "[Tt]he " from each input string, sort this list, then sort the original list based on the indexing of the sorted list.

{x iasc @[x;where x like "[Tt]he *";4_]} / ungolfed solution
{                                      } / lambda function
        @[x;                       ;  ]  / apply function to x at indices
                                    4_   / 4 drop, remove first 4 items
            where x like "[Tt]he *"      / where the input matches 'The ...' or 'the ...'
   iasc                                  / returns sorted indices
 x                                       / index into original list at these indices


-2

Java 176 158 bytes

public String[]sort(String[]names){
  for(int i=-1;++i<names.length;)
    if(names[i].startsWith("(The |the )"))
      names[i]=names[i].substring(4);
  return Arrays.sort(names,String.CASE_INSENSITIVE_ORDER);
  }

Main Function

public static void main(String[]args){
  Scanner s = new Scanner(System.in);
  List<String> list= new ArrayList<>();
  while(!(String h = s.nextLine).equalsIgnoreCase("~")){
    list.add(h);
  }
System.out.println(sort(list.toArray(newString[0]))

); }

Golfed sort function:

String[]s(String[]n){for(int i=-1;++i<n.length;)if(n[i].startsWith("(The |the )"))n[i]=n[i].substring(4);return Arrays.sort(n,String.CASE_INSENSITIVE_ORDER);}

Thanks to @raznagul for saving 18 bytes


Doesn't work if a name starts with the . The sort should be case insensitive.
shooqie

This won't work at all... Strings are immutable. You want to do public String[]sort(String[]names){ for(int i=-1;++i<names.length;) names[i]=names[i].replaceFirst("(the|The)", ""); return Arrays.sort(names,String.CASE_INSENSITIVE_ORDER); } Since the and The should work, and strings a immutable
Socratic Phoenix

Fixed that, but find me one band that starts with a small "the "
Roman Gräf

2
Arrays.sort returns type void
user902383

1
@RomanGräf the pAper chAse
AdmBorkBork
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.