Cetak Pohon Natal


26

Tantangan

Cetak pohon Natal yang bagus dengan bintangnya sendiri di atas menggunakan kode sesingkat mungkin. Bintang pohon adalah tanda bintang ( *) dan badan pohon terbuat dari 0pohon harus setinggi 10 baris. Setiap baris harus diberi indentasi dengan benar sehingga baris sebelumnya dipusatkan di atas baris berikutnya. Setiap baris yang diberikan harus memiliki 2 lebih banyak dari sebelumnya, kecuali untuk yang pertama yaitu bintang dan yang kedua, yang hanya memiliki satu 0. Hasilnya adalah seperti ini:

          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

Tie break untuk pohon ketinggian yang dapat diubah ukurannya tanpa perubahan perangkat lunak (kecuali mengubah parameter ketinggian)

Tolong, rekatkan pohon hasil kode Anda juga!


Papan peringkat


Jawaban:


17

Golfscript, 27 karakter

" "9*"*"9,{n\.4$>\.+)"0"*}%

Pohon yang dihasilkan terlihat seperti ini:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

Versi yang menggunakan parameter ketinggian hanya sekali adalah satu karakter lebih panjang:

9." "*"*"@,{n\.4$>\.+)"0"*}%

Membaca ketinggian dari stdin (dengan input "10" untuk menghasilkan pohon contoh) membutuhkan jumlah karakter yang sama (28):

~,)" "*"*"@{n\.4$>\.+)"0"*}%

56

Saya tahu ini tidak sesuai dengan speknya, tetapi saya pikir saya akan mencoba menambahkan keragaman ke pohon-pohon di sini dengan meniru adegan seni Natal ASCII klasik ini oleh Joan G. Stark .

Saya tidak mencoba mereproduksi seluruh gambar - itu akan menjadi terlalu banyak - tetapi hanya pohon, di mana saya menyajikan program Perl 138-byte ini:

$_=join$/,qw'11| 8\2_2/ 9(\o/) 5---2/1\2--- 10>*<',map(11-$_.A.AA x$_,2..11),'9\|H|/';s/\d+/$"x$&/eg,s/A/substr">>>@*O<<<",rand 9,1/eg,say

Dan, tentu saja, inilah contoh hasilnya:

           |
        \  _  /
         (\o/)
     ---  / \  ---
          >*<
         >O><@
        <><<>><
       @><><>@<<
      @<O><*@*>>O
     OO@@*O<<<*<OO
    ><<>@><<>@<><><
   >><O<>>><@*>>><<O
  *<>*<><<>@><O*>><*<
 O><><<@<*>><O*@>O><>*
O<><<><@O>>*O*OO<><<>O>
         \|H|/

Cobalah online!

Kode ini menggunakan fitur Perl 5.10+ say, dan karena itu perlu dijalankan dengan saklar baris perintah -M5.010(atau -E). (Sebenarnya, hanya mengganti saydi akhir dengan printakan menghindari itu, dengan biaya dua byte lagi dan hilangnya baris baru setelah garis keluaran terakhir.)

Perhatikan bahwa sebagian besar pohon dihasilkan secara acak, sehingga penempatan ornamen akan bervariasi di antara lintasan. Namun demikian, malaikat, dudukan, dan barisan atas pohon tetap.


Untuk menjaga agar jawaban populer ini tidak secara singkat dihapus di bawah kebijakan yang dilembagakan setelah diposkan , berikut ini juga merupakan solusi yang sesuai dengan spesifikasi token (45 byte, juga Perl 5):

$_=$"x10 ."*";say,s/ 0/00/,s/\*?$/0/ while/ /

Cobalah online!

Seperti program di atas, yang ini juga perlu dijalankan pada Perl 5.10+ dengan -M5.010sakelar untuk mengaktifkan sayfitur. Jelas (ini merupakan tantangan ) yang menghasilkan keluaran membosankan yang sama persis dengan semua entri yang sesuai lainnya, yang tidak akan saya ulangi di sini. (Ini juga dapat diubah ukurannya dengan mengubah angka 10menjadi nilai lain apa pun.)


1
Besar! Bukan berdasarkan spec tetapi saya pikir penghargaan khusus juri adalah untuk Anda! :)
Averroes

6
ini menendang pepatah spesifikasi di belakang, +2 jika aku bisa.
Kris

3
Maaf, tetapi sesuai aturan, jawaban yang tidak memenuhi spesifikasi harus dihapus.
mbomb007


1
Bisakah Anda memindahkan jawaban yang valid ke atas dan menambahkan header?
Dennis

13

GolfScript (33 karakter)

Versi ketinggian tetap:

;8:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

Atau untuk panjang yang persis sama

;8:^' '*.'*'+n@'0'+^{.n\(;'00'+}*

Pohon itu terlihat sangat mirip dengan pohon orang lain:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Versi yang membutuhkan ketinggian dari stdin:

~((:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

Awal dari baris sebelumnya adalah salah satu smilies yang lebih baik yang saya buat dalam program GolfScript "berguna".


10

Script shell, 44 karakter

printf %9c\\n \* 0|sed ':x
p;s/ 0/000/;tx
d'

Mencetak pohon ini:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

9

Maple, 30/37 karakter

Terinspirasi oleh entri Mr.Wizard's Mathematica , saya menyajikan perintah 30-char Maple 12 ini:

<`*`,('cat(0$2*i+1)'$i=0..8)>;

Keluaran:

                              [        *        ]
                              [                 ]
                              [        0        ]
                              [                 ]
                              [       000       ]
                              [                 ]
                              [      00000      ]
                              [                 ]
                              [     0000000     ]
                              [                 ]
                              [    000000000    ]
                              [                 ]
                              [   00000000000   ]
                              [                 ]
                              [  0000000000000  ]
                              [                 ]
                              [ 000000000000000 ]
                              [                 ]
                              [00000000000000000]

Saya juga dapat menyingkirkan tanda kurung dengan biaya tujuh karakter lagi:

`*`;for i in$0..8 do;cat(0$2*i+1);od;

Keluaran dihilangkan - terlihat seperti di atas, hanya tanpa tanda kurung. Sayangnya, saya tidak tahu cara apa pun untuk mencegah Maple memasukkan garis kosong antara baris output dalam mode teks. Ini terlihat lebih baik dalam mode lembar kerja klasik. Saya kira saya bisa memasukkan tangkapan layar ...

tangkapan layar

(Tangkapan layar menunjukkan versi 44-char sebelumnya dari perintah, tapi saya terlalu malas untuk mengambilnya kembali. Outputnya masih sama.)

Oh, dan ya, ukuran sepenuhnya dapat disesuaikan: ganti saja 8 dengan n -2 untuk n pohon -row. Dengan solusi pertama, naik di atas 25 baris (atau 10 dalam GUI) memerlukan pengaturan antarmuka (rtablesize = n ).

(Ps. Saya pikir saya berhasil mengalahkan GolfScript dengan versi terbaru, tetapi sayangnya ... )


8

Perl, 42 karakter

say$"x9,"*";say$"x(9-$_),"00"x$_,0for 0..8

Keluaran:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

Ketinggian pohon dapat diubah antara 1 dan 11 baris dengan mengganti 8di akhir dengan nilai dari -1ke 9. Pergi di atas 11 baris juga memerlukan peningkatan dua 9s sebelumnya dalam kode, yang mengontrol seberapa jauh dari sisi kiri layar pohon indentasi.


Yang ini memiliki 11 baris: P Minor perubahan kurasa
Averroes

@Averroes: Ya, saya pertama kali berasumsi seharusnya 10 baris ditambah bintang, tapi kemudian saya benar-benar menghitung baris dalam output sampel dan memperbaikinya.
Ilmari Karonen

8

Groovy, 65

(p={c,r->println' '*(9-r)+(c*(r*2-1))})'*',1;(1..9).each{p'0',it}

Yang mengejutkan, pohon itu terlihat seperti ini:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Bagian 'post the tree output' adalah untuk membawa semangat Natal ke situs ini: P
Averroes

Juga, Anda memiliki 11 baris juga!
Averroes

Saya dapat memperbaikinya dengan menyesuaikan parameter ketinggian!
Armand

8

Ruby, 46 karakter

puts" "*8+?*;9.times{|i|puts"%8s0"%(v=?0*i)+v}

Untuk mengubah ketinggian, Anda harus mengubah 8s dan tentu saja juga 9. Output program adalah sebagai berikut:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Sunting : Tidak bisa dimungkiri saya menghilangkan output dalam pengiriman pertama.


1
Anda lupa memposting output. :)
Ilmari Karonen

7

PowerShell, 41

" "*8+"*";0..8|%{" "*(8-$_)+"0"+"0"*$_*2}

Tidak mengherankan, menghasilkan pohon yang sama dengan pohon orang lain :-p

Jika Anda menetapkan 8, itu akan menghasilkan hingga ukuran konsol Anda, di, katakanlah, 48 karakter :

" "*($w=8)+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

Atau, sebagai skrip lengkap yang mengambil argumen, 53 karakter :

param($w)" "*$w+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

Disebut, sepertinya:

PS>: Get-Tree.ps1 8
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

7

Python 3: 62 karakter

print(' '*9+'*',*('\n'+' '*(9-i)+'0'*(i*2+1)for i in range(9)))

Keluaran:

        * 
        0 
       000 
      00000 
     0000000 
    000000000 
   00000000000 
  0000000000000 
 000000000000000
00000000000000000

Perhatikan bahwa ini pada dasarnya mengalahkan jawaban @ Ante dengan 11 karakter, karena jawaban itu, ketika dikonversi ke Python 3, menggunakan 73 karakter.

Ubah masing 9- masing ke nilai lain untuk ketinggian yang berbeda.


3
Saya pikir Anda juga bisa kehilangan ruang sebelumnya for.
badp

@badp Terima kasih — diubah dari 63 menjadi 62!
Kazark

6

Python, 59

print' '*9+'*'
for i in range(9):print' '*(9-i)+'0'*(i*2+1)

Kerja bagus — ini menunjukkan bahwa meskipun jawaban oleh @Ante menjadi lebih panjang di Python 3, jawaban Python 3 saya lebih pendek di Python 2 ( printbukan fungsi).
Kazark

6

Prolog: 183 atau 186

r(0,_,L,L).
r(N,C,L,[C|T]):-N>0,M is N-1,r(M,C,L,T).
y(S,T,C):-r(T,C,[10],X),r(S,32,X,Y),atom_codes(A,Y),write(A).
x(A,B):-A>0,y(A,B,48),C is A-1,D is B+2,x(C,D).
x(N):-y(N,1,42),x(N,1).

Cetakan:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
false.

Dapat diperas lebih lanjut untuk penerjemah tertentu (mis. Menggunakan tab / 1 pada SWI)

Aktifkan dengan x (N). Di mana N adalah jumlah baris di pohon aktual (tidak termasuk bintang). Memberikan ketinggian yang tetap akan membuatnya menjadi 183


6

C

Ini adalah versi C Wade Tandy tetapi sedikit dimodifikasi:

           ;
          int
         main(
        ){int i
       =-1,j=0,c
      =10;while(j
     ++<c){printf(
    " ");}{;printf(
   "*");}while(++i<c
  ){for(j=-2;++j<c-i;
 )printf(" ");for(j=0;
++j<2*i;){printf("0");}
          ;;;
        printf(
         "\n")
          ;}}


5

Applesoft BASIC, 143 karakter

Karena pertanyaan ini mengingatkan saya pada tugas pekerjaan rumah yang saya miliki di sekolah menengah (ketika mereka mengajar di Apple // e):

1INPUTH:X=(H*2)-2:C=(X/2):S$="*":O=0:GOSUB2:S$="0":FORO=0TOX-2STEP2:GOSUB2:NEXT:END
2FORS=0TOC-(O/2):?" ";:NEXT:FORI=0TOO:?S$;:NEXT:?"":RETURN

Saya menggunakan JavaScript Applesoft BASIC yang ditemukan di sini: http://www.calormen.com/applesoft/

KELUARAN:

?10
          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

5

Prolog: 127 karakter

p:-write('        *'),h(1).
h(L):-(L<10,nl,w(L,-8),h(L+1));!.
w(L,N):-(N<9,N<L,(L>abs(N)->write('0');write(' ')),w(L,N+1));!.

Keluaran:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
true 

Digunakan Prologkarena saya tidak dapat mengalahkan Groovyrekor tanpa melihat kode-nya :(.


5

PostScript (dengan tinggi parameterised), 114 karakter

/h 9 def/b{{( )=print}repeat}def
h -1 0{dup h eq{dup b(*)=}if dup b h sub neg 2 mul 1 add{(0)=print}repeat()=}for

Keluaran:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
0000000000000000000

Apa, Anda ingin mencetak?


4

JavaScript (Badak: 108, Node: 114, Web Dev Dev Console: 119, jQuery Plugin: 132)


Badak adalah yang terpendek (pada 108 karakter) karena (a) printfungsinya memiliki nama pendek dan (b) ia akan membiarkan Anda menetapkan fungsi bawaan menjadi nama variabel yang lebih pendek. Begitu:

h=10,p=print,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


Node.js hadir dalam detik dekat (pada 114 karakter) karena fungsi cetaknya console.logmemiliki nama yang lebih panjang, tetapi ia akan membiarkan kami menetapkannya ke variabel pendek juga:

h=10,p=console.log,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


Namun, Konsol Dev WebKit (dan mungkin Firebug juga) menganggapnya p=console.logagak terlalu licik (ketika Anda mencoba menelepon p(), ia akan mengeluh pada Anda). Jadi, kita harus memperpanjang menjadi 119 karakter:

h=10,m='0',a=Array(h-1),s=a.join(' ');with(console){log(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();log(a.join(' ')+m);}}

(Menariknya, withhanya menyelamatkan kita karakter).


Terakhir ... plugin jQuery (masih dapat tweet dengan 132 karakter!):

$.fn.xms=function(h){var m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$(this).css({textAlign:'center'}).html(l.join('\n<br/>'));}

Dan Anda dapat memohonnya di footer halaman ini: $('#footer').xms(3)

Tentu saja, itu tidak harus menjadi plugin ... karena kita mungkin harus menggunakan konsol JavaScript untuk menambahkannya ke halaman dan memintanya, kita bisa saja membuat potongan jQuery :

h=10,m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$('#footer').css({textAlign:'center'}).html(l.join('\n<br/>'));

yang berbobot 116 karakter yang lebih kompetitif - pada kenyataannya, mengalahkan implementasi konsol dev lainnya. Tetapi, sekali lagi, menggunakan jQuery dan / atau mesin tata letak browser mungkin dianggap curang. :)


4

C, 67

Saya tahu ini sudah lama berakhir, tetapi ini adalah upaya pertama saya di kode golf, dan saya pikir saya punya solusi C yang cukup bagus.

Menariknya, saya datang dengan ini secara independen dari solusi yang sangat mirip @ Patrick.

Dan ya, saya tidak akan memenangkan ikatan apa pun dengan nilai-nilai hardcod saya;) Lagi pula, saya cukup senang.

i;main(){for(;i<10;++i)printf("%*s%0*c\n",i?9-i:8,"",i*2,i?32:42);}
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
Tekan tombol apa saja untuk melanjutkan . . .

4

Peramal

select lpad('*', 11) from dual
union all
select rpad(' ', 10 - level) || rpad(' ', level * 2, '0') from dual
connect by level <= 9;


          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

10 rows selected.

4

PHP, 106 karakter

7 lebih sedikit dari yang sebelumnya:

<?php echo str_pad(' ',9)."*\n";for($i=0;$i<9;$i++){echo str_pad("",9-$i).str_pad("",($i*2)+1,"0")."\n";}

2
aktifkan tag pendek dan simpan sendiri 3 karakter, atau gunakan <?=dan simpan 5 lainnya dari "echo".
Brombomb

Saya tahu saya terlambat 8 ​​bulan, tetapi codegolf.stackexchange.com/a/6783/4967 :)
Leigh

4

LOLCODE, 527 byte

CAN HAS STDIO?
HAI 1.2
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 8
    VISIBLE " "!
IM OUTTA YR LOOP
VISIBLE "*"
I HAS A SPACES
SPACES R 8
I HAS A ZEROS
ZEROS R 1
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 9
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN SPACES
        VISIBLE " "!
    IM OUTTA YR LOOP
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN ZEROS 
        VISIBLE "0"!
    IM OUTTA YR LOOP
    VISIBLE ""
    SPACES R DIFF OF SPACES AN 1
    ZEROS R SUM OF ZEROS AN 2
IM OUTTA YR LOOP
KTHXBYE

Cobalah online!

Keluaran:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

1
Ini adalah kode-golf , jadi silakan tambahkan jumlah byte kiriman Anda ke header.
lirtosiast

4

Python, 70 karakter

Tidak terlalu pendek, tetapi solusi rekursif :-)

def a(s):
 print s
 if s<"0":a(s[1:]+"00")
print" "*8+"*"
a(" "*8+"0")

Ubah 8 untuk mengatur ketinggian.


4

Javascript, 119 karakter

Output ke konsol pembakar

i=h=9;a=new Array(h);a[0]=a.join(' ');b=a.join('000');a[0]+='*';while(i)a[i--]=b.substr(i,h+i);console.log(a.join('\n'))


        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

2
Ini sebenarnya 120 karakter.
Rob Fox

3

PHP 113

Kupikir aku akan berpadu dengan versi php:

113 karakter (sesuaikan $huntuk mengubah ketinggian, jumlah garis termasuk bintang):

$h=10;for($n=0;$n<$h;$n++){$i=$n>0?$n:1;$c=$n<1?"*":"0";echo str_repeat(" ",$h-$i).str_repeat($c,($i*2)-1)."\n";}

Saya mencoba untuk membuatnya singkat, tidak dapat dibaca dan kita sudah tahu php tidak dapat bersaing dalam keringkasan jadi ini tidak akan memenangkan apa-apa, masih sedikit teka-teki yang menyenangkan.

output adalah sebagai spec:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Hardcoding sedikit lebih banyak, 103 karakter, (Anda tidak dapat melihat spasi di gema pertama di dalam komentar ini) $ n = 0; echo "* \ n"; untuk ($ i = 9; $ i> 0; $ i -, cetak str_repeat ('', $ i) .str_repeat ('0', $ n + 9- $ i). "\ n", $ n ++);
Lucia

Baris pertama hardcoded Anda akan tidak seimbang jika Anda mengubah ketinggian pohon tho :-(
Kris

3

C, 77

i;main(c){printf("%*c\n",c,42);while(i<c)printf("%*s%0*d\n",c-i,"",i++*2+1,0);}

Sebelum membaca spec printf lebih hati-hati, saya punya nomor kecil yang lucu ini hingga 138 karakter:

#define x sprintf(b,
#define y printf(b,
i;main(c){char b[9]="%%%dc\n",*t="%%%ds%%0%dd\n";x b,c);y 42);while(i<c)x t,c-i,i++*2+1),y "",0);}

3

Java, 192 (198 dengan param)

class V{public static void main(String[]a){int c=10,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

Mencetak pohon yang diminta:

        *           
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

Untuk tinggi variabel, sedikit lebih panjang:

class W{public static void main(String[]a){int c=a.length,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

Panjang daftar argumen baris perintah menentukan tinggi (mis java W a a a a a Akan memberikan tinggi 5).

(Ini pada dasarnya adalah versi Java dari solusi Wade Tandy C.)


Saya tahu ini sudah diposting beberapa waktu lalu :), tapi di sini ada dua hal yang saya lihat: 1. Anda dapat menggunakan antarmuka alih-alih kelas di java 8 2. untuk menyimpan dua karakter, while (++i < c) {-> for (s += "*";++i < c;s = "") {, dan menghapus s += "*";dans = "";
Reinis Mazeiks

3

Vim, 18 byte

17i0<esc>qqYPxr q8@qa*

Cobalah online di penerjemah V yang kompatibel-mundur!

Meskipun ini adalah pendekatan yang sangat mirip dengan jawaban V saya, yang ini tidak non-bersaing karena vim sudah tua gila. :)

Penjelasan:

17i0<esc>               " Insert 17 '0's
         qq     q       " Start recording into register 'q'
           YP           " Duplicate this line upwards
             x          " Delete one character
              r         " Replace this character with a space
                 8@q    " Playback macro 'q' 8 times
                    a*  " Append an asterisk

3

Scala, 74 byte

val h=10;println(" "*h+"*");for(i<-0 to h-2)println(" "*(h-i)+"0"*(i*2+1))

h - ketinggian pohon

Keluaran

        *          
        0          
       000         
      00000        
     0000000       
    000000000      
   00000000000     
  0000000000000    
 000000000000000   
00000000000000000  

2

C, 80

i=9,k=10,j;main(F){while(i)putchar(++j<i?32:j<k?48-F*6:(i-=!F,k+=!F,F=j=0,10));}

Inisialisasi k ke ketinggian pohon, i ke k-1. F adalah flag baris pertama. Karena tidak ada argumen, maka F harus 1 pada saat masuk.

Versi yang sedikit lebih panjang (81) di mana f bukan flag baris pertama:

i=9,k=10,j,f;main(){while(i)putchar(++j<i?32:j<k?42+f*6:(i-=f,k+=f,f=1,j=0,10));}
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.