Saringan berbeda


17

Diberikan daftar bilangan bulat, buat topeng boolean sedemikian rupa sehingga indeks yang sebenarnya dapat digunakan untuk memfilter nilai yang berbeda dari daftar. Indeks mana yang dipilih sebagai yang benar tidak masalah asalkan hanya satu dari mereka yang dipilih untuk setiap set indeks yang sesuai dengan nilai yang identik.

Input akan berupa daftar bilangan bulat non-kosong dalam format yang sesuai untuk bahasa Anda dan hasilnya akan berupa daftar nilai boolean mengikuti spesifikasi di atas. Anda diizinkan untuk menggunakan definisi Anda sendiri tentang nilai-nilai kebenaran dan kepalsuan dalam daftar keluaran.

Dalam contoh saya di bawah ini, saya mendefinisikan 1sebagai kebenaran dan 0kepalsuan.

[5, 4, 7, 1]  Input
[1, 1, 1, 1]  Output
              Select only the values with with true indicies in the sieve
[5  4  7  1]  Contains zero duplicate values

[5, 9, 7, 5, 6, 0, 5]
[0, 1, 1, 1, 1, 1, 0]
[   9, 7, 5, 6, 0   ]

Uji Kasus

Ketika ada or, itu berarti ada beberapa keluaran yang valid. Jika ada elips trailing ...setelah or, itu berarti bahwa tidak semua output yang mungkin terdaftar.

[0] = [1]

[55] = [1]

[32, 44] = [1, 1]

[0, 0] = [1, 0] or [0, 1]

[9001, 9001, 9001] = [1, 0 , 0] or [0, 1, 0] or [0, 0, 1]

[5, 4, 7, 1] = [1, 1, 1, 1]

[1, 2, 3, 4, 3, 5] = [1, 1, 1, 1, 0, 1] or
                     [1, 1, 0, 1, 1, 1]

[5, 9, 7, 5, 6, 0, 5] = [1, 1, 1, 0, 1, 1, 0] or
                        [0, 1, 1, 1, 1, 1, 0] or
                        [0, 1, 1, 0, 1, 1, 1]

[0, 8, 6, 6, 3, 8, 7, 2] = [1, 1, 1, 0, 1, 0, 1, 1] or
                           [1, 0, 0, 1, 1, 1, 1, 1] or
                           [1, 0, 1, 0, 1, 1, 1, 1] or
                           [1, 1, 0, 1, 1, 0, 1, 1]

[45, 47, 47, 45, 24, 24, 24, 8, 47, 41, 47, 88]
= [1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1] or ...

[154, 993, 420, 154, 154, 689, 172, 417, 790, 175, 790, 790, 154, 172, 175, 175, 420, 417, 154, 175, 172, 175, 172, 993, 689, 993, 993, 790]
= [1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] or ...

Aturan

  • Ini adalah sehingga solusi terpendek menang.
  • Dibangun secara bawaan!
  • Anda diizinkan untuk menggunakan definisi Anda sendiri tentang nilai-nilai kebenaran dan kepalsuan dalam daftar keluaran. Jika Anda memilih untuk melakukannya, sebutkan definisi Anda.
  • Input akan berupa daftar bilangan bulat non-kosong yang tidak kosong.
  • Anda bebas memilih antara mengeluarkan hanya satu saringan atau beberapa saringan atau bahkan semuanya. Selama setiap saringan valid, itu akan diterima.

2
Sebab [0, 8, 6, 6, 3, 8, 7, 2], harus [1, 0, 0, 1, 1, 1, 1, 1]ditambahkan ke daftar output yang valid?
atlasologist

Apakah definisi Anda sendiri tentang nilai - nilai kebenaran dan kepalsuan merujuk pada bahasa atau dapatkah kita memilih dengan bebas? Apakah mereka harus konsisten?
Dennis

@atlasologist Terima kasih telah menangkap kesalahan ketik
miles

@ Dennis Anda bebas menentukan nilai boolean Anda sendiri, mereka tidak harus sama dengan bahasa yang Anda pilih, tetapi Anda harus konsisten dengan definisi Anda sendiri. Alih-alih 1 dan 0 untuk benar dan salah dalam contoh saya, saya bisa melakukan nilai negatif sebagai nilai false dan non-negatif (nol atau positif) sebagai benar.
mil

OK, terima kasih sudah menjelaskan. Dengan konsisten, maksud saya jika harus ada nilai kebenaran tunggal atau jika ada beberapa.
Dennis

Jawaban:


11

MATL, 7 6 4 byte

1 byte disimpan berkat @Luis
2 byte disimpan berkat @Dennis

&=Rs

Kami mendefinisikan 1kebenaran dan semua nilai lainnya sebagai falsey

Cobalah secara Online

Semua uji kasus

Penjelasan

    % Implicitly grab input array
&=  % 2D array of equality comparisons
R   % Get the upper triangular portion
s   % Sum down the columns
    % Implicitly display the result

1 byte lebih sedikit: &=Rs1=
Luis Mendo

@LuisMendo Ha Saya benar-benar hanya bermain dengan pendekatan itu!
Suever

2
OP telah menjelaskan apa arti kebenaran dan kepalsuan dalam tantangan ini. Jika Anda mendefinisikan 1 sebagai kebenaran dan yang lainnya palsu, Anda dapat menghapus l=.
Dennis

Penggunaannya bagus. Maksudnya adalah untuk menghindari keharusan menambahkan langkah pemfilteran dan sekarang Anda telah mencocokkan solusi Dennis 'Jelly.
mil

9

Jelly , 4 byte

ĠṪ€Ṭ

Nikmat kejadian terakhir. Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ĠṪ€Ṭ  Main link. Argument: A (array)

Ġ     Group; paritition the indices of A according to their corresponding values.
 Ṫ€   Tail each; select the last index of each group.
   Ṭ  Untruth; generate a Boolean array with 1's at the specified indices.

Bukankah ini akan memangkas nol pada akhirnya?
Leaky Nun

2
Tidak boleh ada nol di akhir, karena kami memilih kejadian terakhir dari setiap integer unik.
Dennis

Itu pintar.
Leaky Nun

8

Python 3, 47 35 39 36 byte

lambda n:[n.pop(0)in n for x in n*1]

Pops item pertama dari daftar, periksa apakah ada di tempat lain dalam daftar, dan masukkan Trueatau Falseke dalam daftar baru.

Untuk fungsi ini, Falsetunjukkan nilai yang berbeda, danTrue jika tidak ( True=0dan False=1)

Terima kasih kepada Dennis untuk satu ton byte

Asli, 47 byte:

lambda n:[(1,0)[n.pop()in n]for x in[1]*len(n)]

Cobalah


lambda n:[1-(n.pop()in n)for x in n*1]menghemat beberapa byte.
Dennis

3
OP telah mengklarifikasi bahwa nilai kebenaran tidak harus benar-benar kebenaran, jadi lambda n:[n.pop()in n for x in n*1]berfungsi juga.
Dennis

Versi baru membuat saya kehilangan sedikit sampai saya menyadari itu menggunakan nilai-nilai yang dinegasikan seperti xnor lakukan untuk kebenaran dan kepalsuan.
mil

Yang perlu Anda lakukan .pop(0)atau topeng keluar terbalik.
xnor

Bukan itu arti xnor. .pop()memproses elemen terakhir terlebih dahulu, sehingga berada dalam urutan terbalik.
Dennis

7

Pyth, 6 byte

.eqxQb

Menghasilkan daftar bools ( Truedan False). Memeriksa setiap elemen dalam input, jika indeksnya sama dengan indeks kemunculan nilai pertama. Dengan kata lain, ini memeriksa apakah setiap elemen adalah kejadian pertama.

Dalam pseudocode pythonic:

.e      enumerated_map(lambda b,k:    # maps with b as value and k as index
  q       equal(
   xQb      Q.index(b),
            k),                       # implicit lambda variable
          Q)                          # implicit argument to map

Uji di sini.


6

J , 2 byte

~:

Dari sinilah ide untuk tantangan ini berasal. Builtin ~:disebut Nub-Sievedalam J dan membuat daftar boolean yang melakukan operasi yang dijelaskan dalam tantangan. Di sini, 1mewakili truedan 0mewakili false.


6

05AB1E , 8 byte

Kode:

v¹ykN>Qˆ

Penjelasan:

y         # For each in the array
 ¹yk      # Get the index of that element in the array
    N>Q   # And see if it's equal to the index
       ˆ  # Add to the global array and implicitly output

Menggunakan pengkodean CP-1252 . Cobalah online! .


4

APL, 6 byte

⍳∘⍴∊⍳⍨

Cobalah

Penjelasan:

   ⍳⍨  For each character in the string, get the index of its first occurrence
⍳∘⍴     Make a list 1 .. length of input
  ∊    Check if each index is present

4

C #, 63 byte

int[]l(List<int> i)=>i.Select((m,n)=>i.IndexOf(m)-n).ToArray();

Saya juga bisa membuatnya mengembalikan 1 atau 0 dan therby membuat parameter dan kembali ketik yang sama therby memungkinkan saya untuk membuat ini ekspresi lambda dengan sendirinya?

beberapa panduan akan dihargai

kode jenis yang sama

    public static List<int>l(List<int>i){
        return i.Select((m,n)=>i.IndexOf(m)==n?1:0).ToList();
    }

jika Anda mendefinisikan true menjadi 0 dan falsy menjadi hal lain, Anda dapat mengganti == n dengan -n dan mengembalikan int []
raggy

itu ide yang bagus
downrep_nation

juga menggunakan fungsi ekspresi tubuh int [] l (Daftar <int> i) => i.Select ((m, n) => i.IndexOf (m) -n) .ToArray ();
Roby

oh my god, itu menyimpan begitu banyak byte dalam jawaban saya mulai sekarang. terima kasih banyak
downrep_nation

Bisakah Anda memberikan contoh di .NetFiddle?
aloisdg mengatakan Reinstate Monica

3

Python, 35 byte

f=lambda l:l and[l.pop(0)in l]+f(l)

Digunakan Truesebagai nilai palsu dan Falsenilai kebenaran. Menandai penampilan terakhir setiap elemen.

Pilih elemen pertama hanya jika itu tidak muncul di antara elemen-elemen yang tersisa, kemudian berulang ke sisa daftar selama itu tidak kosong. The l.pop(0)ekstrak elemen pertama sementara juga menghapus itu.


3

Retina , 23 byte

(\d+)((?!.* \1\b))?
$#2

Input adalah daftar yang dipisahkan oleh ruang. (Sebenarnya, format lain seperti [1, 2, 3]juga akan berfungsi selama ada ruang di depan setiap angka kecuali yang pertama.)

Cobalah online!(Bekerja pada beberapa test case yang dipisahkan linefeed sekaligus.)

Kami cukup mengubah setiap elemen menjadi 0jika ada salinan lain nanti di input dan 1sebaliknya.


2

PowerShell v2 +, 40 byte

$a=@();$args[0]|%{(1,0)[$_-in$a];$a+=$_}

Membuat array kosong $a. Lalu kami mengambil daftar input melalui $args[0]dan pipa itu menjadi satu lingkaran |%{...}. Setiap iterasi kita pilih salah satu 1atau 0dari pseudo-ternary berdasarkan pada apakah elemen saat ini ada $aatau tidak. Pilihan-pilihan itu ditinggalkan di jalur pipa. Kami kemudian menambahkan elemen saat ini ke dalam array$a . Elemen-elemen pipa dikumpulkan, dan output sebagai array adalah implisit.

Contoh:

(output di sini dengan pemisah baris baru, karena itu default .ToString()untuk array)

PS C:\Tools\Scripts\golfing> .\distinct-sieves.ps1 1,2,3,4,1,3,5,7
1
1
1
1
0
0
1
1

1

JavaScript (ES6), 31 byte

f=a=>a.map((e,i)=>i-a.indexOf(e))

Nol adalah kebenaran dan angka lainnya palsu.


1

Mathematica, 53 31 byte

Terima kasih kepada mil karena memberi saya ide yang menghemat 22 byte.

s[[;;x++]]~FreeQ~#&/@(x=0;s=#)&

Bagaimana kalau menggunakan MapIndexedlebih dari daftar sebelumnya? MapIndexed[s[[;;#-1&@@#2]]~FreeQ~#&,s=#]&membutuhkan 41 byte.
mil

@miles Ohh, itu jauh lebih baik (dan saya memperbaikinya sedikit lebih;))
Martin Ender

Oo itu cara yang bagus untuk mempersingkat MapIndexedkasus ini dan Anda bahkan tidak perlu mengekstraksi atau mengurangi indeks
mil

1

Perl 5

push@o,map{$b=pop@a;(grep{/^$b$/}@a)?1:0}(1..~~@a);

1. ..menyediakan konteks skalar, jadi Anda tidak perlu ~~. 2. grepMengembalikan kebenaran / kepalsuan, jadi Anda tidak perlu ?1:0. 3. grep/.../,@alebih pendek darigrep{/.../}@a . 4. Anda tidak perlu membutuhkan final ;. 5. Anda tidak perlu lagi menggunakan tanda kurung 1..@a. 6. Anda tidak menunjukkan dari mana input berasal atau output akan menuju: lihat meta.codegolf.stackexchange.com/q/2447
msh210

1

Java, 96 byte

void s(int[]a){for(int i=0,j,n=a.length,b=1;i<n;a[i++]=b,b=1)for(j=i+1;j<n;)b=a[i]==a[j++]?0:b;}

Memodifikasi array di tempat. Nikmat kejadian terakhir.

Nilai sebenarnya adalah 1sementara nilai palsu adalah0 .

Verifikasi semua testcases .

Tidak Disatukan:

void sieve(int[]a){
    int n = a.length;
    for(int i=0;i<n;i++){
        int b = 1;
        for(int j=i+1;j<n;j++){
            if(a[i] == a[j]){
                b = 0;
            }
        }
        a[i] = b;
    }
}

1

Sebenarnya, 11 byte

;╗ñ`i@╜í=`M

Cobalah online!

Penjelasan:

;╗ñ`i@╜í=`M
;╗           save a copy of input in reg0
  ñ          enumerate
   `i@╜í=`M  for each (index, value) pair:
    i@         flatten, swap
      ╜í       first index in input of value
        =      compare equality

1

Pyke, 4 byte

F@oq

Coba di sini!

     - o = 0 #(Implicit)
F    - for i in input:
 @   -   input.index(i)
   q -  ^==V
  o  -   o+=1

1

C ++, 242 byte

Diakui solusi berlebihan, karena bekerja pada setiap kontainer standar setiap jenis memerintahkan:

#include<algorithm>
#include<list>
#include<set>
template<class T>auto f(T a){using V=typename T::value_type;std::set<V>s;std::list<bool>r;std::transform(a.begin(),a.end(),std::back_inserter(r),[&](V m){return s.insert(m).second;});return r;}

Tidak Disatukan:

(dan selanjutnya digeneralisasi)

template<class T>
auto f(T a)
{
    using std::begin;
    using std::end;
    using V=typename T::value_type;
    std::set<V>s;
    std::list<bool>r;
    std::transform(begin(a),end(a),std::back_inserter(r),[&](V m){return s.insert(m).second;});
    return r;
}

Test suite:

int test(const std::list<bool>& expected, const auto& x) { return f(x) != expected; }
#include<array>
#include<chrono>
#include<forward_list>
#include<initializer_list>
#include<string>
#include<vector>
using namespace std::literals::chrono_literals;
int main()
{
    return 0
        + test({},            std::vector<short>{})
        + test({1},           std::array<int,1>{})
        + test({1},           std::vector<char>{55})
        + test({true,true},   std::vector<unsigned>{32,44})
        + test({1,0},         std::list<std::string>{"zero", "zero"})
        + test({1,0,0},       std::vector<long>{9001,9001,9001})
        + test({1,1,1,1},     std::array<char,4>{5,4,7,1})
        + test({1,1,1,1,0,1}, std::initializer_list<std::string>{"one","two","three","four","three","five"})
        + test({1,0,1,0,0},   std::forward_list<std::chrono::seconds>{60s, 1min, 3600s, 60min, 1h});
}

1

TSQL 52 byte

DECLARE @ TABLE(i int identity, v int)
INSERT @ values(1),(2),(3),(4),(3),(5)

SELECT i/max(i)over(partition by v)FROM @ ORDER BY i

Biola


1

PHP, 66 62 39 byte

  • menerima semua nilai atom (boolean, integer, float, string)
    kecuali nilai yang bernilai false (false, 0, "") dan string numerik ("1" sama dengan 1)
  • bendera kemunculan pertama

versi baru (program, 37 + 2 byte)
mengalahkan Java dan (sekarang lagi) C #. Bahkan hampir mengalahkan Python sekarang. Senang.

<?foreach($a as$v)$u[$v]=print$u[$v]|0;
  • +6 untuk PHP> = 5.4, + 16-3 untuk suatu fungsi
  • mencetak daftar tidak 0benar dari (benar) dan 1(salah)
    memasukkan !setelah printmembalik
  • penggunaan: set register_globals=On, short_open_tags=Ondan error_reporting=0dalam php.iniuntuk php-cgi
    itu panggilphp-cgi -f <filename> a[]=<value1> a[]=<value2> ...;echo"" ;
  • untuk PHP> = 5.4: ganti $adengan $_GET[a](+6), atur short_open_tags=Ondanerror_reporting=0
  • atau ganti $adengan array_slice($argv,1)(+19), hapus <?(-2)
    dan panggilphp -d error_reporting=0 -r '<code>' <value1> <value2> ...;echo""

versi lama (fungsi, 62 byte)

function f($a){foreach($a as$v)$u[$v]=1|$m[]=$u[$v];return$m;}
  • mengembalikan array falseuntuk true dan truefalse; (ouput sebagai string kosong atau 1)
    masukkan !sesudahnya$m[]= untuk membalikkan
  • Ada cara lain untuk fungsi yang memenuhi syarat dengan 55 byte juga.

tes (pada versi lama)

function out($a){if(!is_array($a))return$a;$r=[];foreach($a as$v)$r[]=out($v);return'['.join(',',$r).']';}
function test($x,$e,$y){static $h='<table border=1><tr><th>input</th><th>output</th><th>expected</th><th>ok?</th></tr>';echo"$h<tr><td>",out($x),'</td><td>',out($y),'</td><td>',out($e),'</td><td>',(strcmp(out($y),out($e))?'N':'Y'),"</td></tr>";$h='';}
$samples=[
    [0],[1],    [55],[1],    [32,44],[1,1],    [9001,9001,9001],[1,false,false],
    [5,4,7,1],[1,1,1,1],    [1,2,3,4,3,5],[1,1,1,1,false,1],
    [5,9,7,5,6,0,5],[1,1,1,false,1,1,false],    [0,8,6,6,3,8,7,2],[1,1,1,false,1,false,1,1],
    [45,47,47,45,24,24,24,8,47,41,47,88],[1,1,'','',1,'','',1,'',1,'',1],
    [154,993,420,154,154,689,172,417,790,175,790,790,154,172,175,
        175,420,417,154,175,172,175,172,993,689, 993,993,790],
        array_merge([1,1,1,false,false,1,1,1,1,1],array_fill(0,18,false))
];
for($i=count($samples);$i--;--$i)for($j=count($samples[$i]);$j--;)$samples[$i][$j]=!$samples[$i][$j];
while($samples)
{
    $a=array_shift($samples);
    $em=array_shift($samples);
    test($a,$em,$ym=s($a));
    $eu=[];foreach($em as$i=>$f)if($f)$eu[]=$a[$i];
    $yu=[];foreach($ym as$i=>$f)if($f)$yu[]=$a[$i];
#   sort($eu); sort($yu);
    test('unique values',$eu,$yu);
}
echo '</table>';

1

Haskell, 29 27 byte

f a=[elem x t|x:t<-tails a]

Gunakan Falsesebagai benar, Truesebagai nilai palsu:

λ> let f a=[elem x t|x:t<-tails a] in f [5, 9, 7, 5, 6, 0, 5]
[True,False,False,True,False,False,False]

Anda mungkin harus import Data.Listmenggunakan tailstetapi, tryhaskell.org menjalankan kode apa adanya.


Tidak perlu untuk kurung luar. \a->[...]adalah fungsi yang tepat. Jika ragu, berikan nama: f a=[...].
Nimi

@nimi tidak bisa menyebutnya tanpa tanda kurung. tapi memberi nama itu berhasil, terima kasih banyak.
Will Ness

Saya tidak suka pembenaran untuk menghilangkan ini import Data.Listsangat banyak. Sebuah. adalah kemiringan yang sangat licin karena Anda dapat memasukkan jumlah impor (atau bahkan definisi!) dalam konfigurasi GHCi Anda. b. memperlakukan tryhaskell.org sebagai implementasi otoritatif dari bahasa Haskell, tetapi sebenarnya bukan satu. (Sekali lagi, bagaimana jika saya membuat lingkungan try-Haskell-online saya sendiri yang dilengkapi dengan semua impor dan definisi yang diinginkan pegolf? Apakah itu masih benar-benar “Haskell”?)
Lynn

Saya diberitahu di sini sekali bahwa jika ada platform yang menjalankan kode apa adanya, maka kode itu dapat diterima. Saya tidak tahu apa aturan sebenarnya, saya menuruti apa yang diperintahkan. Saya kira ya, jika situs Anda tersedia 24/7, dan menjalankan Haskell standar, mengapa tidak. Tapi Anda benar tentang yang pertama, saya menghapusnya. Terima kasih.
Will Ness

1

Perl 5 + Perligata , 343 byte

315 byte, ditambah 28 untuk -MLingua::Romana::Perligata

Gunakan sebagai perl -MLingua::Romana::Perligata foo.pl; input (dari stdin) dan output (ke stdout) adalah string underscore yang dipisahkan oleh bilangan bulat desimal. Diuji pada Strawberry 5.20.2 dengan versi 0.6 dari Perligata; Saya tidak tahu apakah itu berfungsi dengan Perligata versi 0.50.

huic vestibulo perlegementum da.qis _ scindementa da.dum qis fac sic
ao qis decumulamentum da.ao aum tum nullum addementum da.meo io.meo ro.per ium in qis fac sic
si ium tum aum aequalitas fac sic ro I da cis cis
ro nullum tum non rum addementum da.capita bis rum cis
per in bis fac sic hoc tum _ egresso scribe cis

Jelas ini sejelas bel. Jika tidak, jalankan dengan-MLingua::Romana::Perligata=converte alih alih -MLingua::Romana::Perligata, dan perlakan, alih-alih menjalankan skrip, menghasilkan terjemahan ke dalam Perl biasa:

 $_ = Lingua::Romana::Perligata::getline (*STDIN );
 @q = split ( '_');
while (@q) { $a = pop (@q );
 $a =  ($a + 0);
my $i ;
my $r ;
for $i (@q) {if ( ($i eq $a)) { $r = 1}
}
;
 $r =  (0 +  ! ($r));
unshift (@b, $r)}
;
for $_ (@b) {print (STDOUT $_, '_')}

Untuk analisis token-to-token, gunakan -MLingua::Romana::Perligata=discribe.


Catatan golf:

  • Tidak berdokumen (tapi tidak mengejutkan), Anda tidak perlu spasi setelahnya . .
  • (Juga tidak mengejutkan,) scinde tidak perlu argumen kedua, dan menggunakanhoc .
  • Saya harus menggunakan ao aum tum nullum addementum da karena saya tidak bisa mendapatkanmorde bekerja.
  • Demikian pula, saya menggunakan per ium in qis... ro I da karena saya tidak bisa mendapatkanvanne bekerja.
  • Alih-alih huic vestibulo perlegementum da, saya mencoba -pMLingua::Romana::Perligata, tetapi tidak berhasil, juga.

Hanya untuk iseng (walaupun seluruh jawaban ini hanya untuk iseng):

  • Setelah membersihkannya hingga Huic vestibulo perlegementum da. Qis lacunam scindementa da. Dum qis fac sic ao qis decumulamentum da. Ao aum tum nullum addementum da. Meo io. Meo ro. Per ium in qis fac sic si ium tum aum aequalitas fac sic ro I da cis cis. Ro nullum tum non rum addementum da. Capita bis rum cis. Per in bis fac sic hoc tum lacunam egresso scribe cis., Google Terjemahan memberi This court perlegementum grant. QIS gap scindementa grant. While QIS QIS decumulamentum do so ao da. Ao sum and no addementum grant. My io. My ro. Through ium in QIS do so if the sum ium equality do so ro 1 from cis. Ro was not any rum addementum grant. The heads of the bis side. Write, do so as soon as he at that time that in the gap by the Kish was taken..
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.