Anda sedang memerangi jaringan mata-mata musuh yang luas . Anda tahu bahwa setiap mata-mata memiliki setidaknya satu (kadang-kadang banyak) identitas palsu yang mereka suka gunakan. Anda benar-benar ingin tahu berapa banyak mata-mata yang Anda hadapi sebenarnya.
Untungnya, agen kontra-intelijen Anda melakukan pekerjaan mereka dan kadang - kadang dapat mengetahui kapan dua identitas palsu sebenarnya dikendalikan oleh mata-mata musuh yang sama.
Artinya:
- Agen Anda tidak selalu tahu kapan dua identitas palsu memiliki mata-mata yang sama di belakang mereka
- Jika seorang agen memberi tahu Anda dua identitas palsu dikendalikan oleh mata-mata yang sama, Anda yakin itu benar.
Pesan agen
Agen mengirimi Anda pesan rahasia yang memberi tahu Anda identitas mana yang memiliki mata-mata yang sama di belakangnya. Sebuah contoh:
Anda memiliki 2 agen dan 5 identitas palsu untuk ditangani.
Agen pertama mengirimi Anda pesan:
Red Red Blue Orange Orange
Ini berarti mereka berpikir ada 3 mata-mata:
- yang pertama (Merah) mengontrol identitas 1 dan 2
- yang kedua (Biru) mengontrol identitas 3
- yang ketiga (Oranye) mengontrol identitas 4 dan 5
Agen kedua mengirimi Anda pesan:
cat dog dog bird fly
Ini berarti mereka berpikir ada 4 mata-mata:
- yang pertama (kucing) mengontrol identitas 1
- yang kedua (anjing) mengontrol identitas 2 dan 3
- yang ketiga (burung) mengontrol identitas 4
- yang keempat (terbang) mengontrol identitas 5
Kompilasi intel yang kita lihat:
Identities: id1 id2 id3 id4 id5
Agent 1: |--same-spy--| |--same-spy--|
Agent 2: |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|
Ini berarti ada paling banyak 2 mata-mata .
Catatan
Identitas yang dimiliki oleh mata-mata yang sama tidak harus berturut-turut, yaitu pesan seperti:
dog cat dog
adalah benar.
Juga, kata yang sama dapat digunakan oleh dua agen yang berbeda - itu tidak berarti apa-apa, itu hanya kebetulan, misalnya:
Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby
Es digunakan oleh kedua agen - yang Ice
digunakan oleh agen pertama tidak terkait dengan dua kejadian yang Ice
digunakan oleh agen kedua.
Tantangan
Kompilasi semua intel agen Anda dan cari tahu berapa banyak mata-mata musuh yang ada. (Untuk lebih tepatnya, dapatkan batas atas terendah, mengingat informasi terbatas yang Anda miliki.)
Kode terpendek dalam byte menang.
Input dan Output spec
Input adalah daftar n baris, yang mewakili n pesan dari agen. Setiap baris terdiri dari k token yang dipisahkan ruang, sama k untuk semua baris. Token adalah alfanumerik, panjang arbitrer. Kasus penting.
Outputnya harus berupa angka tunggal, mewakili jumlah mata-mata yang berbeda, berdasarkan intel agen Anda.
Contohnya
Contoh 1
Memasukkan:
Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee
Keluaran:
2
Contoh 2
Memasukkan:
Blossom Bubbles Buttercup
Ed Edd Eddy
Keluaran:
3
Contoh 3
Memasukkan:
Botswana Botswana Botswana
Left Middle Right
Keluaran:
1
Contoh 4
Memasukkan:
Black White
White Black
Keluaran:
2
Contoh 5
Memasukkan:
Foo Bar Foo
Foo Bar Bar
Keluaran:
1
Contoh 6
Memasukkan:
A B C D
A A C D
A B C C
A B B D
Keluaran:
1
Contoh 7
Memasukkan:
A B A C
Keluaran:
3
Contoh 8
Memasukkan:
A
B
C
Keluaran:
1
Contoh 9
Memasukkan:
X
Keluaran:
1
Jawaban:
Sledgehammer 0.5.1 ,
1615 byteMengekompres ke dalam fungsi Bahasa Wolfram ini (yang terakhir
&
adalah implisit):Cobalah online!
Transpose[StringSplit @ #1]
: Pisahkan setiap string dalam daftar input, dan ambil kolom (identitas mata-mata)RelationGraph[Inner[Equal, ##1, Or] &, ...]
: Buat grafik di mana dua simpul berbagi tepi jika setidaknya satu posisi sama (jika mereka diklasifikasikan sebagai mata-mata yang sama oleh beberapa agen ramah)Length[ConnectedComponents[...]]
: Jumlah komponen yang terhubung adalah batas atas jumlah mata-mata yang memungkinkan.sumber
JavaScript (Node.js) ,
155 150 142141 byteCobalah online!
Bagaimana?
Berkomentar
sumber
Jelly , 19 byte
Cobalah online!
Mengambil input sebagai daftar garis yang dipisahkan spasi (catatan kaki untuk itu).
Catatan:
ḲŒQ)PS
tidak tidak bekerja.sumber
Python 3 ,
132162154139135 byteCobalah online!
Ini adalah implementasi yang sangat kompak dari algoritma pengidentifikasi grafik cluster.
Untuk setiap agen, kita membuat peta profil dan alias mereka, yang merupakan indeks terendah penampilan:
[map(b.index,b)for b in map(str.split,a)]
. Yaitu[0,1,2,1,2]
mengidentifikasi tiga mata-mata, di mana profil pertama milik satu, yang kedua dan keempat yang lain dan yang ketiga dan kelima ke yang terakhir. Indeks grup juga merupakan indeks dari profil pertama dalam grup.Dengan mentransposkan matriks ini (
[*zip(*m...)]
), kami mendapatkan keanggotaan grup untuk setiap profil. Ini membentuk, grafik asiklik diarahkan, karena indeks grup adalah subset dari indeks profil, dan semua tepi menuju indeks yang lebih rendah atau sama. Profil yang sesuai dengan mata-mata yang sama sekarang membentuk sebuah cluster tanpa koneksi ke profil lain. Kami masih memiliki jalur duplikat, karena indeks profil ditautkan ke beberapa indeks grup.Dengan loop berikut, kami meminimalkan grafik ke hutan datar, di mana semua profil dihubungkan langsung ke indeks terendah di pohon mereka, yaitu root:
min(min(u)for u in r if min(w)in u)
Akhirnya, kembali jumlah akar di hutan, indeks yaitu terkait dengan diri mereka sendiri:
return sum(i==...)
.sumber
Arang ,
4943 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Mungkin dapat menyimpan beberapa byte dengan menggunakan format input yang rumit. Penjelasan:
Masukkan daftar agen pertama.
Ulangi untuk agen yang tersisa.
Masukkan daftar mereka.
Ulangi setiap indeks elemen.
Temukan elemen pertama dalam daftar agen ini dengan identitas yang sama dan perbarui daftar agen pertama untuk menunjukkan bahwa mereka adalah identitas yang sama.
Hitung jumlah identitas unik yang tersisa.
sumber
Jelly ,
2515 byteCobalah online!
Tautan monadik mengambil daftar klaim agen pemisah ruang dan mengembalikan batas atas terendah dari jumlah mata-mata yang berbeda.
Penjelasan
Terima kasih kepada @Arnauld dan @JonathanAllan untuk mengidentifikasi masalah dengan versi sebelumnya, dan @JonathanAllan lagi untuk menghemat byte! Jika spek input dilonggarkan untuk memungkinkan daftar daftar, ini akan menghemat satu byte.
sumber
Ġ
diurutkan dan hasil filter yang diratakan dan diduplikasifƇFQ
,, akan selalu, setelah aplikasi berulang, berakhir dengan ini dalam urutan diurutkan (mis. Tidak'a a b b c', 'a b a b c
akan menemukan akhirnya[3,4,1,2]
, meskipun akan muncul di sepanjang jalan). JadiḲĠ)ẎfƇFQɗⱮQ$ÐLL
mungkin baik untuk 15?JavaScript (Node.js) , 120 byte
Cobalah online!
sumber
Sekam , 12 byte
Cobalah online!
Penjelasan
Idenya adalah untuk membuat daftar semua kelompok mata-mata yang dikenal sebagai orang yang sama, kemudian secara progresif menggabungkan kelompok-kelompok yang berpotongan sampai titik tetap tercapai. Outputnya adalah jumlah grup yang tersisa yang tidak dapat digabungkan.
sumber
Python 3 ,
191182 byteTerima kasih, rekursif
Cobalah online!
sumber
Ruby ,
123117 byteMenggunakan ide yang mirip dengan solusi Python 3 movatica tetapi menghitung indeks mata-mata terendah untuk setiap "pohon" dengan cara yang sedikit berbeda (dengan melacak profil yang ditemukan sebelumnya, menemukan tumpang tindih jika ada, dan menggabungkannya)
-6 byte dari @GB.
Cobalah online!
Penjelasan
sumber
s.split.map{|i|s.index i}
itu bagus, tetapi itu dapat membuat kasus tepi tergantung pada panjang input. Input ini harus mengembalikan 3, bukan 2.Python 2 ,
229221 byteCobalah online!
8 byte thx ke wilkben .
sumber
g
hanya digunakan sekali, tidak bisakah Anda mendefinisikannya sebaris? Saya agak lupa jika itu mungkin dengan Python tapi saya ingat itu.Bersihkan , 137 byte
Cobalah online!
Mengaitkan string yang digunakan oleh agen dengan nomor baris yang muncul untuk mencegah kesetaraan di seluruh agen, lalu berulang kali memeriksa apakah ada frasa untuk posisi apa pun yang tumpang tindih dan menghitung jumlah set yang dihasilkan.
sumber
PHP , 271 byte
Ini tidak akan berfungsi jika salah satu identitas hanyalah angka ketika saya menyimpan "nomor mata-mata" dengan identitas. Saya tidak berpikir itu tidak akan sulit untuk memperbaikinya.
Cobalah online!
Penjelasan
Agak bingung sendiri menulis ini tetapi berfungsi untuk semua kasus uji!
Cobalah online!
sumber