Mengubah string menjadi huruf kecil (tanpa fungsi bawaan ke bawah!)


25

Tujuan golf kode ini adalah membuat kode yang memungkinkan pengguna memasukkan string ASCII (hanya berisi karakter ASCII yang dapat dicetak ), dan program Anda menghasilkan varian huruf kecil dari string ini.

Penting: Anda TIDAK diizinkan menggunakan fungsi bawaan yang mengubah string (atau hanya satu karakter) menjadi huruf kecil (seperti ToLower()dalam .NET, strtolower()dalam PHP, ...)! Anda diizinkan menggunakan semua fungsi bawaan lainnya.

Catatan penting lainnya: String input tidak hanya berisi karakter huruf besar. String input adalah campuran karakter huruf besar, huruf kecil, angka dan karakter ASCII lainnya yang dapat dicetak .

Semoga berhasil!


4
sayangnya, saya harus memilih keluar. Saya bukan pemula.
John Dvorak

@ Jan: Ya, dengan pemula, saya sebenarnya bermaksud bahwa level skill ini adalah 'pemula', bukan hanya pemula yang diizinkan masuk. Saya menghapus kata 'pemula' dan tentu saja, Anda diizinkan masuk.
ProgramFOX

1
Apakah ekspresi reguler diizinkan? Hanya GolfScript yang bisa dikalahkan s/./\L\0/g.
manatwork

3
@manatwork: pasti \Lsudah ada di dalam?
marinus

@manatwork: Ya, regex diperbolehkan.
ProgramFOX

Jawaban:


21

Shell - 10

Terjemahan dari solusi Perl @ Gowtham menggunakan /bin/tr.

tr A-Z a-z

Contoh dijalankan:

% tr A-Z a-z <<<'Hello WORLD! @'
hello world! @

Apa yang membuat ini jawaban yang diterima, karena penasaran? Gowtham memiliki solusi 10 karakter terlebih dahulu ...
Ry-

1
Berdasarkan diskusi tentang meta , tampaknya alasannya adalah bahwa solusi Gowtham adalah 11 karakter (karena -pbendera dihitung sebagai satu). Saya setuju, sepertinya itu lebih pantas untuk diterima ..
FireFly

Ah, terima kasih - itu masuk akal. Saya akan mengingatnya!
Ry-

53

Python 2.7 - 30 (dengan penyalahgunaan aturan yang mengerikan dan tidak menyesal)

raw_input().upper().swapcase()

Seperti yang ditunjukkan oleh hasil edit anonim, Anda dapat melakukannya 2726 dalam Python 3 :

input().upper().swapcase()

Saya terang-terangan menyalahgunakan aturan di sini, tapi ...

Penting: Anda TIDAK diizinkan menggunakan fungsi bawaan yang mengubah string (atau hanya satu karakter) menjadi huruf kecil (seperti ToLower()dalam .NET, strtolower()dalam PHP, ...)! Anda diizinkan menggunakan semua fungsi bawaan lainnya.

Ini mengambil string dan menutupinya ke huruf besar . Kemudian dalam pemanggilan metode yang sangat tidak terkait, itu membalik case dari string - sehingga setiap huruf kecil menjadi huruf besar ... dan menukar setiap huruf besar menjadi huruf kecil .


1
Solusi Python 3 adalah 26 karakter.
Timtech

@Timtech saya tidak bisa menghitung.

1
Bukan hanya tidak berhubungan. Ini sangat tidak berhubungan.
Carter Pape

1
Ini akan memiliki hasil yang aneh ketika menemukan teks yang berisi karakter ß.
FUZxxl

33

Perl - 11 10 karakter.

y/A-Z/a-z/

y///sama dengan tr///!

Beraksi:

% perl -pe 'y/A-Z/a-z/' <<< 'Hello @ WORLD !'
hello @ world !

3
+1, untuk satu-satunya bahasa kehidupan nyata yang mengalahkan semua yang kurang nyata (?).
Behrooz

Sebenarnya itu 11 karakter. The -popsi dihitung sebagai 1.
manatwork

@manatwork Atau harus dihitung sebagai 2: -dan p:)
Gowtham

1 jika Anda menganggap -e( perl -e-> perl -pe), 3 jika Anda menggunakan skrip ( perl-> perl -p).
nyuszika7h

10

Befunge-98 - 26 22 21 19

~:''-d2*/1-!' *+,#@

Bergantung pada kenyataan bahwa (c-39)/26ini 1hanya untuk kode karakter dari karakter ASCII huruf besar (dengan asumsi pembagian integer). Untuk setiap karakter c, cetak c + (((c-39)/26)==1)*' '.

Sesi sampel:

% cfunge lower.b98
hello WORLD!
hello world!
This is a TEST!!11 az AZ @[`{
this is a test!!11 az az @[`{

9

Python 3, 58

print("".join(chr(ord(x)+('@'<x<'[')*32)for x in input()))

Bisakah Anda menjelaskan cara kerjanya? Saya benar-benar tertarik untuk menjadi lebih baik di Python. Saya tidak mengerti bagaimana map(ord,input())bit bekerja.
asteri

1
@ JeffGohlke: mapmenerapkan fungsi (dalam hal ini, ord) ke interable dan mengembalikan iterable. Ini seperti bentuk yang lebih pendek (ord(x) for x in input()).
Ry-

Oke. Terima kasih untuk penjelasannya!
asteri

1
Jawaban Anda mengikuti semangat pertanyaan, tetapi pertanyaan saya mengikuti surat pertanyaan ...

Sangat bagus. Kalahkan solusi panjang 62 saya yang belum dikirim for c in input():print([c,(chr(ord(c)+32))]['@'<c<'['],end=''). Saya mencoba beberapa dengan map(ord,input())trik, tetapi melewatkan nilai kebenaran dengan mengalikan 32 dan menambahkannya ke trik kode karakter. Sangat bagus.
Steven Rumbalski

8

Ruby, 18 karakter

Tidak ada yang benar-benar menarik.

gets.tr'A-Z','a-z'

(dijalankan di IRB)

Hanya untuk bersenang-senang: versi yang membingungkan:

$,=$* *' ';$;=$,.tr'A-Z','a-z';$><<$;

Jalankan seperti ini:

c:\a\ruby>lowercase.rb Llamas are AMAZING!

Keluaran

llamas are amazing!

7

J - 30

'@Z'(]+32*1=I.)&.(a.&i.)1!:1]1

J dibaca kanan-ke-kiri, jadi untuk memecah ini:

  1. Pengguna yang cepat untuk input: 1!:1]1
  2. Lakukan algoritma dalam kode-titik-ruang: &.(a.&i.)
  3. Identifikasi rentang karakter untuk setiap huruf; karakter antara codepoints "@" dan "Z" dianggap huruf besar: 1=I..
  4. Untuk setiap codepoint huruf besar, tambahkan 32: ]+32* ...
  5. Perhatikan bahwa langkah (2) menciptakan langkah implisit (5): kami mulai dengan memproyeksikan dari karakter ke domain integer, jadi sekarang setelah kami selesai, kami memetakan bilangan bulat tersebut kembali ke karakter.

Jelas implementasi khusus ini hanya mempertimbangkan ASCII; tetapi pendekatan tersebut dapat diperluas setidaknya ke pesawat multibahasa dasar di Unicode.


1
Bagus! Sayangnya, tampaknya solusi Anda adalah CARA YANG SALAH. ;-) Seharusnya perbaikan yang mudah. (Sunting: '@Z'(]+32*1=I.)&.(a.&i.)1!:1]1harus melakukannya)
FireFly

Tangkapan yang bagus, terima kasih. Saya juga terkesan Anda dapat memperbaiki kode sendiri: J bukan bahasa yang paling mudah diakses di luar sana :)
Dan Bron

Ah, saya sudah bermain-main dengan J sendiri .. Saya berhasil membuat u:(a.i.x)+32*1='@Z'I.x=.1!:1]1, yang cocok dengan panjang Anda tetapi jauh lebih menarik (karena tidak menggunakan 'bawah'). Omong-omong, saya tidak tahu tentang diad I., jadi terima kasih telah menggunakan itu. :-)
FireFly

Keren. Tapi solusi Befunge Anda masih memiliki J beat dengan 4 karakter. Jelas saya tidak bisa membiarkan hal itu terjadi :) Saya mencoba untuk melihat apakah memangkas solusi J dengan mengikuti petunjuk Anda hanya mengandalkan '@', daripada '@' dan 'Z'.
Dan Bron

(32(23)b.])&.(3&u:), harus lebih pendek 5 byte.
FrownyFrog

7

C 64 63 59 55 karakter

main(c){while(c=getchar(),~c)putchar(c-65u<27?c+32:c);}

Saya menghitung hanya 63 karakter di sana.
manatwork

Anda dapat kehilangan 9 karakter: drop int dan ,c>=0. Mereka tidak perlu di sini.
JoeFish

kita perlu c> = 0 karena getchar (EOF) akan menjadi <0. Terima kasih atas saran lainnya.
Rozuur

2
1. ~(c=getchar())2.c-64u<27
ugoren

1
Bug yang tidak terlalu kecil: sepertinya harus ada 65 bukannya 64. pastebin.com/Zc9zMx2W
manatwork

5

Golfscript - 17

Program:

{..64>\91<*32*+}%

Penjelasan:

  1. {}% memetakan kode di dalam ke setiap karakter dalam string.
  2. .. menyalin bagian atas tumpukan (karakter) dua kali.
  3. 64> 1 jika kode karakter lebih besar dari 64, atau 0.
  4. \menukar kedua item di tumpukan (mendapatkan salinan kedua surat itu, dan menyimpan hasilnya 64>di posisi dua).
  5. 91< memeriksa untuk melihat apakah kode karakter kurang dari 91. Mirip dengan langkah 3.
  6. *mengalikan hasil dari langkah 3 dan 5 bersamaan. Hanya sama dengan 1, jika kedua langkah itu benar.
  7. 32* gandakan hasil langkah 6 dengan 32. Akan menjadi 32 jika langkah 6 adalah 1, jika tidak 0.
  8. + tambahkan hasilnya (32 atau 0) ke kode karakter.

Contoh output:

echo HelLO @ WorLD | ruby golfscript.rb upper_to_lower.gs
hello @ world

4

Perl: 24 karakter

s/[A-Z]/chr 32+ord$&/ge

Contoh dijalankan:

bash-4.1$ perl -pe 's/[A-Z]/chr 32+ord$&/ge' <<< 'Hello @ WORLD !'
hello @ world !

Hem, kenapa chr ord? Saya cukup yakin Anda tidak akan belajar apa pun dalam membaca jawaban saya ;-)
F. Hauri

Trik yang luar biasa, @ F. Hauri!
manatwork

@ nyuszika7h, +1 adalah -pparameter baris perintah, bukan baris baru.
manatwork

Oh benar, maaf.
nyuszika7h

3

Python (33)

Jika ragu, gunakan shell.

import os;os.system('tr A-Z a-z')

Sayangnya, ini masih lebih lama dari solusi Lego.


+1 Itu memang bukan built-in Python yang Anda gunakan. Hanya bekerja di linux, tetapi masih sangat tidak sesuai !!!

@LegoStormtroopr Bekerja di mana-mana ada trperintah (yang melakukan hal yang benar) di jalur shell yang dipanggil, saya kira.
Paŭlo Ebermann

3

DELPHI

const
  UpChars:set of AnsiChar = ['A'..'Z'];
var
  I: Integer;
begin
  SetLength(Result, Length(pString));
  for I := 1 to length(pstring) do
    Result[i] := AnsiChar((Integer(pString[i] in UpChars))*(Ord(pString[i])+32));
  WriteLn(Result);
end;

3
Ini bukan golf. Tidakkah Anda merasa bagian ini sangat berbeda dibandingkan dengan yang lain?
Ray

1
@ray Golf adalah tentang mendapatkan kode Anda sesingkat mungkin. Delphi bukan bahasa yang bagus untuk bermain golf. Saya menggunakan delphi sendiri dan meskipun tidak ada peluang besar saya bisa memenangkan golf dengan delphi, masih menyenangkan untuk menantang diri sendiri.
Teun Pronk

3

JavaScript - 109 104 (ES6: 95)

Terima kasih beberapa untuk versi yang diperbaiki.

a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&c<91)*32);alert(b.join(""))

Berikut ini berfungsi jika browser mendukung ekspresi fungsi ES6:

alert(prompt().split("").map(c=>String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)).join(""))

Kode pertama tidak berfungsi (diuji dalam FF dan Chrome) karena ketika mencoba mendapatkan karakter setelah panjang string, Anda mendapatkan undefineddan kemudian c.charCodeAt()gagal karena tidak terdefinisi charCodeAt. Contoh kerja 105 karakter:a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&&c‌​<91)*32);alert(b.join(''))
beberapa

@Beberapa oops, saya bertanya-tanya bagaimana saya menghasilkan potongan itu .. Saya cukup yakin saya menguji kode itu, mungkin saya menyalin versi yang tidak berfungsi atau sesuatu. Bagaimanapun, terima kasih atas koreksinya.
FireFly

Menggunakan bitwise andbukannya yang logis ... bagus!
beberapa

Sebuah bahkan lebih ES6 solusi ( 79 ): L=s=>[String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)for(c of s)].join(''). Penggunaan:L('SoMeTeXt')
Florent

Bagus! Saya tidak yakin membuatnya menjadi fungsi belaka, karena semua solusi lain adalah program yang "tepat". Tetap saja, penggunaan yang sangat baik for..ofterlepas.
FireFly

3

Perl 18

s/[A-Z]/$&|" "/eg

Sesuatu seperti:

perl -pe 's/[A-Z]/$&|" "/eg'  <<<'are NOT allowed to: ToLower() in .NET, strtolower() in PHP'
are not allowed to: tolower() in .net, strtolower() in php

dan

perl -pe 's/[A-Z]/$&|" "/eg' <<< "The input string Doesn't cOntaIn...( C0D3-@01F. ;-)"
the input string doesn't contain...( c0d3-@01f. ;-)

Untuk @FireFly :

perl -pe 's/[A-Z]/$&|" "/eg' <<< "Doesn't this translate @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

tidak.

Lebih umum: 18 karakter:

s/[A-Z]/$&|" "/eg

s/[A-Z]/$&^" "/eg

Ini tidak akan mengubah apa pun dalam status:

perl -pe 's/[A-Z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

Semua berfungsi dengan baik, tetapi keuntungan dari mengubah |(atau) oleh ^(xor) adalah bahwa sintaks yang sama dapat digunakan untuk toLower, toUpperatau swapCase:

ke Atas:

perl -pe 's/[a-z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
DOESN'T ... @ TO ` AND [\]^_ TO {|}~DEL? 

dan swapCase (18 + 1 = 19 karakter) :

perl -pe 's/[a-z]/$&^" "/egi' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
dOESN'T ... @ TO ` AND [\]^_ TO {|}~del? 

I forgot +1 for -p sorry @manatwork
F. Hauri

Doesn't this translate @ to backtick and [\]^_ to {|}~DEL? And therein lies the tricky part..
FireFly

1
@FireFly No, $& have to match [A-Z].
F. Hauri

Oh, my bad. Very cool, then!
FireFly

3

javascript 80

"X".replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)})

(76 if you remove "X")

with prompt and alert - 92

alert(prompt().replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)}))

fiddle

thanks to @FireFly @some @C5H8NNaO4 and @minitech


Er, you'd need to wrap the second argument to replace with function($){return ...}, no? By the way, the first param to the replacement function is the matched string, so you could drop the parens in the regex.
FireFly

How would i go about running it,like this?
C5H8NNaO4

@C5H8NNaO4 str(code here)
Math chiller

6
I think all (or at least most) answers in here read from stdin and print to stdout. From what I gather the convention is to use prompt and alert for I/O in JS.
FireFly

1
You need a /g flag for this to work properly.
Ry-

2

R

71 characters:

chartr(paste(LETTERS,collapse=""),paste(letters,collapse=""),scan(,""))

83 characters:

a=as.integer(charToRaw(scan(,"")))
b=a%in%(65:90)
a[b]=a[b]+32
rawToChar(as.raw(a))

That's 86 characters - newlines count as 2 characters. (string-functions.com/length.aspx)
Timtech

@Timtech: In R you can replace newlines in code by ; so no they count just for one character. It could be written: a=as.integer(charToRaw(scan(,"")));b=a%in%(65:90);a[b]=a[b]+32;rawToChar(as.raw(a))
plannapus

Yes, now I realized. I read up on meta... seems that only on Windows that newlines are 2 characters (I was using a program to measure the length of my code).
Timtech



2

PHP (42)

Run from the command line:

-R'echo@str_ireplace($a=range(a,z),$a,$argn);'

-R and the single quotes are not counted.


If you follow Gowtham's Peal solution, you would only count 42 characters.
eisberg

1
@eisberg: Updated the score, leaving a 43-character version in the history in case of any dispute.
PleaseStand

str_ireplace does case insensitive search, which is stretching the rules, if not breaking them.
ugoren

@ugoren I do not think so. As it is clearly stated that only build in function changing the case are not allowed and this is ignoring the case not changing it.
eisberg

2

PowerShell: 69 65 64

I've tried a half-dozen ways to get Replace to work the way I want it to without using the long [regex]::Replace syntax, but I haven't had any luck. If anyone else has an idea of what might work, please do suggest it.

Golfed code:

[regex]::Replace((read-host),"[A-Z]",{[char](32+[char]"$args")})

Changes from original:

  • Rearranged last argument so that [int] is no longer needed, per suggestion in comments.

Explanation:

(read-host) gets the user input.

[regex]::Replace(...) tells PowerShell to use RegEx matching to perform replacement operations on a string.

"[A-Z]" matches all uppercase letters.

{...} tells PowerShell to use a script to determine the replacement value.

[char]"$args" takes the current match and types it as an ASCII character.

32+ converts the character to an integer, representing the ASCII code, and increases the value by 32 - which would match ASCII code of the corresponding lowercase letter.

[char](...) takes the resulting value and converts it back to an ASCII character.

Demo of original:

enter image description here

(Current version tested - screenshot not yet posted.)


1
Haven't checked on how to get around that [regex]::Replace, but you can save 4 chars by changing [int] to +
goric

1
Actually, the whole last argument can be rearranged to {[char](32+[char]"$args")}, which removes the need to explicitly cast to int and shaves off one more character
goric

@goric Geez, why didn't I think of that already? Still learning, I guess.
Iszi

2

k2, 15 bytes

I am super late to this one, but I found this cool anyway.

{_ci 32+_ic x}'

Also:

Pyth, 10 bytes

Doesn't really count because Pyth was created after this was posted. Still cool.

jkmC+32Cdw

2

05AB1E, 3 bytes

u.š

Port of @user8777 Python 3 answer.

Try it online.

Explanation:

u    # Convert the (implicit) input to uppercase
   # Switch the case (upper to lower and vice-versa)
     # (and output the result implicitly)

But without any case-altering builtins:

05AB1E, 12 11 bytes

ÇIS.u32*+çJ

-1 byte thanks to @Emigna.

Try it online.

Explanation:

Ç            # Get the unicode values of each character of the (implicit) input-String
 IS          # Get the input-string, split to characters again
   .u        # Check for each if it's uppercase or not (1 if truthy; 0 if falsey)
     32*     # Multiply that result by 32 (32 if truhy; 0 if falsey)
        +    # Add it to all the unicode values at the same indices in the list
         ç   # Convert the now modified unicode values back to characters
          J  # And join all characters together to a string again
             # (which is output implicitly as result)

1
ÇIS.u32*+çJ saves a byte on your 12-byte version.
Emigna

@Emigna Ah, smart. I had tried the .u32*+ approach like this: εÇy.u32*+ç]J, but unfortunately ç wraps the characters in a list, so an additional J or ` was required after the ç..
Kevin Cruijssen

1

Javascript, 105

prompt().split("").map(function(a){c=a.charCodeAt(0);return String.fromCharCode(c|(c-64?32:0))}).join("")

Actually ther was no output form specified, so run it in console Yea, JavaScript really is verbose with charcode <-> string


1
c.charCodeAt() -- it defaults to 0 if an index is omitted. Also, breaks on '@' I believe (it gets "lowercased" into backtick)
FireFly

@FireFly Nice, Thanks!, ok i'll gonna fix it =)
C5H8NNaO4

1

Ruby: 66

def l(s)s.bytes.map{|b|(65..90).include?(b)?b+32:b}.pack('c*');end

1

C# - 108

class P{static void Main(string[]a){foreach(var c in a[0])System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

About 70 for just the method body.

Add 5 chars to include a LF/CR in the output:

class P{static void Main(string[]a){foreach(var c in a[0]+"\n")System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

A LINQ version would be shorter:

class P{static void Main(string[]a){a[0].Any(c=>System.Console.Write(
(char)(c>64&&c<91?32+c:c))is P);}}

(103) .. except that it requires using System.Linq; (total: 121).


1

Haskell - 58

p x|(elem x['A'..'Z'])=[x..]!!32|1<2=x
main=interact$map p

1

Python 3 - 70

Updated for OP's changes.

I'm a Python newbie, so any critique is welcome.

print("".join(chr(ord(c)+32) if 64<ord(c)<91 else c for c in input()))

I'm sorry, I had to say that you're not allowed to use a to-lower function on one character. Question updated.
ProgramFOX

1
Please see my recent comment: your code does only work if the input string contains only uppercase characters, but please note that it also contain other ASCII characters such as lowercase characters and numbers.
ProgramFOX

Okay, will update when I get home
asteri

@ProgramFOX Updated.
asteri

Jeff, check out @minitechs answer. You both have very similar approaches so you should be able to see how, and why his answer is shorter.

1

Perl, 9 + 1 (for -p flag) = 10

$_="\L$_"

\L was specifically asked about and allowed, because even though it's a built-in, it's not a function.


1

Powershell, 53 49 bytes

-4 bytes thanks @AdmBorkBork

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

Test script:

$f = {

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

}

@(
    ,("Hello WORLD from PowerShell", "hello world from powershell")
) | % {
    $a,$e = $_
    $r = &$f $a
    "$($r-eq$e): $r"
}

Output:

True: hello world from powershell

cool! ¯\_(ツ)_/¯
mazzy

1

8086 machine code, 14 bytes

Assembled:

AC 3C 41 7C 06 3C 5A 7F 02 0C 20 AA E2 F2

Unassembled listing:

 ; Lowercase a string
 ; Input: string: SI, length: CX
 ; Output: string: DI
 TOLOW  MACRO   
        LOCAL _LOOP, _STORE
       _LOOP:
 AC         LODSB           ; load byte from [SI] into AL, advance SI 
 3C 41      CMP  AL, 'A'    ; is char less than 'A'? 
 7C 06      JL   _STORE     ; if so, do not convert 
 3C 5A      CMP  AL, 'Z'    ; is char greater than 'Z'? 
 7F 02      JG   _STORE     ; if so, do not convert 
 0C 20      OR   AL, 020H   ; lowercase the char 
       _STORE:
 AA         STOSB           ; store char to [DI], advance DI 
 E2 F2      LOOP _LOOP      ; continue loop through string 

Implemented as a MACRO (essentially a function). Input string in SI, length in CX. Output string in DI.

Output from PC DOS test program:

enter image description here

Download and test TOLOW.COM example program.


where is the 14 byte count coming from? the snippet is longer than that, even without comments... is 14 bytes the compiled program?
Jonah

1
@Jonah The byte opcode is in the lefthand column, AC 3C 41, etc. I'll add the assembled hex byte code to the top for clarity. codegolf.meta.stackexchange.com/a/12340/84624
640KB
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.