Dalam tantangan ini, tugas Anda adalah membuat grafik yang tidak diarahkan dari urutan arahan. Ada satu arahan untuk setiap integer nonnegatif, dan masing-masing mengubah grafik yang diberikan menjadi yang baru.
- Arahan
0
: Tambahkan node terputus baru. - Arahan
1
: Tambahkan node baru, dan hubungkan ke setiap node yang ada. - Arahan
m > 1
: Hapus semua node yang derajatnya (jumlah tetangga) habis dibagim
. Catatan yang0
dapat dibagi oleh semuam
, sehingga node terputus selalu dihapus.
Arahan diterapkan satu per satu, dari kiri ke kanan, dimulai dengan grafik kosong. Misalnya, urutan [0,1,0,1,0,1,3]
diproses sebagai berikut, dijelaskan menggunakan seni ASCII yang mengagumkan. Kami mulai dengan grafik kosong, dan menambahkan satu titik seperti yang diarahkan oleh 0
:
a
Kemudian, tambahkan simpul lain dan hubungkan ke yang pertama, seperti yang diarahkan oleh 1
:
a--b
Kami menambahkan simpul terputus lain dan kemudian terhubung, seperti yang diarahkan oleh 0
dan 1
:
a--b c
\ \ /
`--d
Kami mengulangi ini sekali lagi, sebagaimana diarahkan oleh 0
dan 1
:
,--f--e
/ /|\
a--b | c
\ \|/
`--d
Akhirnya, kami menghapus simpul derajat-3 a
dan b
, sebagaimana diarahkan oleh 3
:
f--e
|\
| c
|/
d
Ini adalah grafik yang ditentukan oleh urutan [0,1,0,1,0,1,3]
.
Memasukkan
Daftar bilangan bulat negatif, mewakili urutan arahan.
Keluaran
Jumlah node dalam grafik ditentukan oleh urutan.
Uji kasus
[] -> 0
[5] -> 0
[0,0,0,11] -> 0
[0,1,0,1,0,1,3] -> 4
[0,0,0,1,1,1] -> 6
[0,0,1,1,0,0,1,1,2,5,7,0,1] -> 6
[0,0,1,1,1,1,5,1,4,3,1,0,0,0,1,2] -> 6
[0,0,1,1,0,0,1,1,5,2,3,0,0,1,1,0,0,1,1,3,4,0,0,1,1,2,1,1] -> 8
[0,0,1,1,0,0,1,1,2,5,7,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,8] -> 14
Aturan terperinci
Anda dapat menulis fungsi atau program lengkap. Hitungan byte terpendek menang. Celah standar tidak diijinkan. Tolong jelaskan algoritma Anda dalam jawaban Anda.
Sudah seminggu, jadi saya telah menerima jawaban terpendek. Jika yang lebih pendek datang nanti, saya akan memperbarui pilihan saya. Disebutkan dengan terhormat jawaban Peter Taylor , yang menjadi dasar beberapa orang lain, termasuk pemenangnya.
sumber
Jawaban:
Pyth ,
3731Solusi ini menggunakan fungsi pengurangan (
u
) untuk membangun daftar, di mana setiap entri sesuai dengan simpul yang tersisa dalam daftar, dan nilai entri yang sesuai dengan apakah simpul awalnya ditambahkan di bawah direktif 0 atau 1.G
adalah variabel akumulator dalam fungsi pengurangan, dan memegang daftar tersebut di atas. Ini diinisialisasi ke daftar kosongY
,.H
mengambil nilai setiap anggotaQ
, input, satu per satu. Hasil dari ekspresi ditugaskan untukG
setiap waktu, dan entri berikutnyaQ
ditugaskan untukH
, dan ekspresi dijalankan kembali.Untuk memperbarui
G
dengan benar, ada dua kemungkinan, satu untuk arahan 0 atau 1, dan satu untuk arahan lainnya. Kasus ini dibedakan dengan ternary? ... <H2 ...
Jika
H
adalah 0 atau 1, maka semua yang perlu kita lakukan adalah appendH
untukG
.+GH
menyelesaikan ini.Jika tidak, hal pertama yang perlu adalah menentukan, untuk setiap node dalam grafik, berapa banyak tetangga yang dimilikinya. Ini dicapai dalam dua langkah:
Pertama,
s>GT
menghitung jumlah node pada atau setelah input node yang 1s. Ini semua terhubung ke input node, kecuali bahwa kita akan menghitung lebih dari 1 jika input node adalah 1.Kedua, kita membutuhkan jumlah node lebih awal dari input node yang terhubung dengannya. Ini adalah 0 jika simpul input adalah 0, dan indeks dari simpul input
T
,, jika simpul input adalah 1. Nilai ini akan diberikan oleh*@GTT
. Namun, masih ada kelebihan dari bagian pertama yang perlu diperbaiki. Jadi, kita menghitung*@GTtT
sebaliknya, yaitu 1 kurang jika simpul input adalah 1. Nilai-nilai ini dijumlahkan, untuk memberikan jumlah simpul yang terhubung ke simpul input.% ... H
akan memberi 0 adalah angka itu dapat dibagi denganH
, dan dengan demikian harus dihapus, dan tidak akan memberikan 0 sebaliknya.f ... UG
dengan demikian akan memberikan indeks input yang tidak boleh dihapus, karenaf
merupakan filter, dan 0 salah.m@Gd
mengkonversi indeks ini ke 0s dan 1s dari node yang sesuai.Akhirnya, setelah daftar node yang dihasilkan berlabel 0 dan 1 ditemukan, panjangnya dihitung (
l
) dan dicetak (implisit).Gagasan luas berkat @PeterTaylor.
sumber
GolfScript (53 byte)
Demo online
Saya belum benar-benar bermain golf ini, tetapi saya telah menemukan bahwa itu tidak mudah untuk menghilangkan
H
danT
variabel jadi ini mungkin minimum lokal.Mengambil input pada stdin dalam format
[0 1 2 3]
. Meninggalkan output pada stdout.Tidak Disatukan:
sumber
CJam,
129 75 73 68 61 4642 byteSolusi berdasarkan algoritma Peter:
Perluasan kode untuk diikuti.
Solusi sebelumnya (61 byte):
Mengambil input dari STDIN seperti:
Output adalah angka pada STDOUT:
Algoritma :
U
yang menyimpan id dari node yang akan ditambahkan.0
, tambahkan[U]
ke daftar daftar1
, tambahkanU
ke setiap daftar dalam daftar daftar dan tambahkan daftar lain yang terdiri dari elemen pertama dari masing-masing daftar daftar danU
length - 1
dapat dibagi denganm
dan terus mencatat elemen pertama dari daftar tersebut. Setelah memfilter, saya menghapus semua id yang dihapus dari daftar id yang tersisa.Perluasan kode :
Coba di sini
sumber
Pyth,
888075 karakterSaya selesai. Mungkin ada orang lain yang punya kiat bermain golf.
Y
adalah daftar kedekatan grafik. Untuk alasan bermain golf, saya juga menyimpan simpul dalam daftar ini, bahkan setelah simpul dihapus (Kalau tidak, saya harus memperbarui semua indeks). Setiap node memiliki dirinya sendiri sebagai tetangga. DaftarJ
melacak node yang dihapus.Saya menunjukkan perubahan daftar kedekatan pada input contoh
[0,1,0,1,0,1,3]
:Algoritma kemudian cukup sederhana: Iterate atas semua input, jika input == 0: tambahkan node baru dengan dirinya sebagai tetangga, jika input == 1: tambahkan node baru dengan semua node sebagai tetangga (juga yang dihapus) dan tambahkan node ini ke daftar adjacency dari semua node, jika input> 1: tentukan node dengan # neighbor-1% input == 0 dan tambahkan mereka
J
, dalam setiap kasus, perbarui tetangga masing-masing node menggunakanJ
. Pada akhirnya cetak panjangY
minus panjang (set)J
.Pemakaian
Panggil saja skrip dan berikan sebagai input
[0,1,0,1,0,1,3]
atau beberapa test case lainnya.sumber
APL,
716555 karakter{⍬≡⍺:≢⍵⋄r←1↓⍺⋄1<c←⊃⍺:r∇i⌿⍵/⍨i←0≠c|+/⍵⋄c:r∇∨⌿↑a(⍉a←⍵,1)⋄r∇0,0⍪⍵}∘(0 0⍴0)
{⍺←0 0⍴0⋄⍬≡⍵:≢⍺⋄(⍺{1<⍵:i⌿⍺/⍨i←×⍵|+/⍺⋄⍵:-⌿↑(1,1⍪⍺)1⋄0,0⍪⍺}⊃⍵)∇1↓⍵}
{g←0 0⍴0⋄(≢g)⊣{1<⍵:g⌿⍨←g/⍨←×⍵|+/g⋄(⊃g)-←g⍪⍨←g,⍨←⍵}¨2,⍵}
Grafik direpresentasikan sebagai matriks kedekatan boolean. Baris / kolom ditambahkan dan dihapus seperlunya.
sumber
Python 2, 296
Setiap node diberi id unik dan id tetangga dari setiap node dicatat. Ketika direktif adalah 0, daftar tetangga kosong ditambahkan untuk node baru. Ketika direktifnya adalah 1, id dari semua node yang ada menjadi daftar tetangga untuk simpul baru, dan semua daftar tetangga lainnya diperbarui untuk menyertakan id simpul baru. Untuk m> 1, node dengan daftar tetangga yang merupakan kelipatan m dihapus dari daftar simpul dan semua daftar tetangga. Terima kasih kepada @Optimizer karena menangkap bug di versi sebelumnya.
sumber
NetLogo, 160
Implementasinya mudah, membaca setiap simbol dan melakukan tindakan yang sesuai.
Anda dapat menjalankan dari baris perintah sebagai
f[0 0 1 1 0 0 1 1 2 5 7 0 1]
.sumber
Ruby
159157 ( demo )Ini mendefinisikan fungsi yang disebut
G
menggunakan sintaks stabby-lambda. GunakanG[[0, 1]]
untuk memanggilnya dengan perintah0
dan1
.Implementasinya cukup mudah: ada
Node
struktur (disebut diN
atas) yang menyimpan referensi ke semua node yang terhubung melaluil
properti.G
membuat simpul sesuai kebutuhan dan memanipulasi tautannya. Versi yang dapat dibaca tersedia di sini .sumber
CJam,
9997 byteMasih banyak yang bisa dimainkan dalam golf ini. Algoritma ini didasarkan pada melacak matriks adjacency, tetapi mewakili matriks kosong tanpa harus memperlakukannya secara khusus membuat saya sakit kepala.
Uji di sini.
Input adalah larik gaya CJam:
Anda dapat menggunakan test harness ini untuk menjalankan semua tes:
sumber
Python 2, 174
Ini mungkin masih bisa banyak golf.
Saya menggunakan kamus
g
untuk mewakili grafik. Node diberi label oleh angka, dan mereka memetakan ke set node yang berdekatan. Ini berarti bahwa setiap pembaruan tepi perlu dieksekusi di kedua titik akhir.Indeks simpul baru dibuat dengan menghitung
n
. Setiap kali, saya membuat simpul kosong barun
. Untuk perintah0
, tetap saja. Untuk perintah1
, terhubung ke setiap node lain melaluig[i]^={n};g[n]^={i}
; menggunakan xor make-nya sehingga node tidak terhubung dengan dirinya sendiri. Untuk perintah> 1, segera dihapus.Pemfilteran node-node yang derajatnya adalah kelipatan dilakukan dengan pertama-tama menemukan node-node yang tetap (
h
), kemudianand
dengan daftar node-node dan tetangga-tetangga dari masing-masing node.Akhirnya, jumlah entri dalam kamus grafik adalah jawabannya.
sumber
Mathematica, 223 byte
Wow, ini ternyata lebih lama dari yang saya harapkan.
Pemakaian:
Berikut adalah hasil dari kasus uji:
Kurang golf:
Cara kerjanya adalah dengan menampilkan grafik sebagai daftar "daftar tetangga".
Untuk arahan 0 , saya hanya menambahkan daftar kosong.
Untuk arahan 1 , saya menambahkan daftar semua node sebelumnya, dan menambahkan node baru ke semua node sebelumnya.
Untuk arahan > 1 , saya menghapus node yang ditentukan dan memperbarui sisanya.
sumber