Masalahnya : Hitung jumlah lubang dalam poligon yang terhubung. Konektivitas poligon dijamin oleh kondisi bahwa setiap segitiga dalam triangulasi input berbagi setidaknya 1 sisi dengan segitiga lain dan bahwa hanya ada satu set segitiga yang terhubung.
Input adalah daftar L
dari n
poin dalam pesawat dan daftar T
dari 3-tupel dengan masukan dari 0...n-1
. Untuk setiap item dalam T
tupel (t_1,t_2,t_3)
mewakili tiga simpul (dari daftar L
) segitiga dalam triangulasi. Perhatikan bahwa ini adalah triangulasi dalam arti 'triangulasi poligon' , karena ini tidak akan pernah ada dua segitiga dalam T
tumpang tindih itu. Ketentuan tambahan adalah bahwa Anda tidak perlu membersihkan input, L
dan T
tidak mengandung pengulangan.
Contoh 1 : Jika L = {{0,0},{1,0},{0,1},{1,2}}
dan T = {{0,1,2},{1,2,3}}
kemudian poligon yang ditentukan memiliki jumlah lubang 0.
Contoh 2 : Jika L = {{0,0},{1,0},{2,0},{2,1},{2,2},{1,2},{0,2},{0,1},{.5,.5},{1.5,.5},{1.5,1.5},{.5,1.5}}
dan T = {{5,6,11},{5,10,11},{4,5,10},{3,8,10},{2,3,9},{2,8,9},{1,2,8},{0,1,8},{0,8,11},{0,7,11},{6,7,11},{3,4,10}}
kemudian input poligon harus menghasilkan output 2.
Tugasnya adalah menulis program terpendek (atau fungsi) yang mengambil L
dan T
sebagai input dan mengembalikan jumlah lubang. 'Pemenang' akan diakui sebagai entri dengan jumlah karakter paling sedikit (tanggal akhir tentatif 1 Juni).
Contoh pemformatan input (perhatikan 0 pengindeksan):
0,0
1,0
0,1
1,2
0,1,2
1,2,3
T=1,2,3/1,2,4/5,6,7/5,6,8
,. Setiap segitiga berbagi keunggulan dengan segitiga lain, tetapi triangulasi terputusT=1,2,3/1,4,5
terhubung tetapi tidak terhubung ke tepi)Jawaban:
GolfScript (23 karakter)
Mengasumsikan format input menggunakan notasi larik GolfScript dan koordinat yang dikutip (atau tidak terpisahkan). Misalnya
( Setara online )
atau
( Setara online )
sumber
Python, 71
Berikut ini adalah program (bukan fungsi ) yang menghitung angka yang diinginkan.
Contoh penggunaan:
sumber
APL, 36
Fungsi mengambil
L
sebagai argumen kiri danT
sebagai kanannya.Sebagai contoh:
Penjelasan, dari kanan ke kiri:
⍴⍺,⍵
menggabungkan dua vektor input dan mengembalikan panjangnya (V + F
)¨⍵
menerapkan fungsi di sebelah kiri untuk setiap elemen argumen yang benar dan mengembalikan hasilnya⍵,⍵
mengembalikan argumen yang tepat digabungkan dengan dirinya sendiri3 2⍴
membentuk argumen vektor menjadi tiga pasangan. Dalam hal ini pasangan dari item vektor pertama dan kedua, ketiga dan pertama, dan kedua dan ketiga.,/
bergabung dengan argumen vektor bersama⍵[⍋⍵]
mengurutkan argumen yang benar∪/
memfilter duplikat apa pun⍴⊃
mengubah skalar bersarang menjadi vektor, dan mengembalikan panjangnya.E
)1
cukup jelas (saya harap ...)Seluruh fungsi lalu kembali
1+E-(V+F)
, atau1-(F+V-E)
.sumber
Mathematica, 93 (belum banyak bermain golf)
(Spaces ditambahkan untuk kejelasan)
Pengujian:
sumber
Erosion
)?Ruby, 239 karakter (227 tubuh)
perhatikan bahwa saya hanya mempertimbangkan topologi. Saya tidak menggunakan posisi titik dengan cara apa pun.
pemanggil (mengharapkan T dalam format Mathematica atau JSON):
Uji:
sumber
Mathematica
76 73 72 6762Setelah banyak percobaan, saya menyadari bahwa lokasi yang tepat dari simpul tidak menjadi masalah, jadi saya merepresentasikan masalah dengan grafik. Invarian esensial, jumlah segitiga, tepi dan simpul tetap invarian (asalkan penyilangan garis dihindari).
Ada dua jenis "segitiga" internal dalam grafik: yang ada di sana mungkin adalah wajah, yaitu segitiga "terisi", dan yang tidak ada. Jumlah permukaan internal tidak memiliki hubungan dengan tepi atau simpul. Itu berarti bahwa menusuk lubang di grafik "penuh" hanya mengurangi jumlah wajah. Saya bermain secara sistematis dengan variasi di antara segitiga, melacak wajah, simpul dan tepi. Akhirnya saya menyadari bahwa jumlah lubang selalu sama dengan 1 - #faces - # vertices + #edges. Ini ternyata 1 minus karakteristik Euler (yang hanya saya ketahui tentang konteks polyhedra biasa (walaupun panjang tepinya jelas tidak penting).
Fungsi di bawah ini mengembalikan jumlah lubang ketika simpul dan segitiga dimasukkan. Tidak seperti pengiriman saya sebelumnya, itu tidak bergantung pada pemindaian gambar. Anda dapat menganggapnya sebagai 1 - Karakteristik Euler, yaitu 1 - (F + V -E) di mana
F
= #faces,V
= # simpul,E
= # tepi. Fungsi mengembalikan jumlah lubang1 - (F + V -E)
,, mengingat wajah sebenarnya (segitiga) dan simpul.Dapat dengan mudah diperlihatkan bahwa penghilangan segitiga apa pun di bagian luar kompleks tidak memengaruhi karakteristik Euler, terlepas dari apakah segitiga itu berbagi satu atau dua sisi dengan segitiga lainnya.
Catatan: Huruf kecil
v
akan digunakan sebagai pengganti dariL
formulasi asli; yaitu, berisi simpul itu sendiri (bukan V, jumlah simpul)f
digunakan untukT
dari formulasi asli; yaitu, berisi segitiga, direpresentasikan sebagai triple dipesan dari indeks titik.Kode
(Terima kasih kepada Tn. Wizard untuk mencukur 5 karakter dengan menghilangkan aturan penggantian.)
Contoh 1
v = {{0, 0}, {1, 0}, {0, 1}, {1, 2}}; f = {{0, 1, 2}, {1, 2, 3}};
Nol lubang.
Contoh 2
v = {{0, 0}, {1, 0}, {2, 0}, {2, 1}, {2, 2}, {1, 2}, {0, 2}, {0, 1} , {.5, .5}, {1.5, .5}, {1.5, 1.5}, {.5, 1.5}}; f = {{5, 6, 11}, {5, 10, 11}, {4, 5, 10}, {3, 8, 10}, {2, 3, 9}, {2, 8, 9} , {1, 2, 8}, {0, 1, 8}, {0, 8, 11}, {0, 7, 11}, {6, 7, 11}, {3, 4, 10}};
Jadi, 2 lubang dalam contoh 2.
sumber
MorphologicalEulerNumber[]
). Mma 9.01, Menangkan XP.MorphologicalEulerNumber
terkadang membutuhkan gambar; ia menolak untuk menerima objek grafis. Dalam kasus ini, ukuran lubang dan resolusi sangat penting (lihat codegolf.stackexchange.com/questions/8706/… ). Tapi di sini ia bekerja secara langsung dengan objek Grafik, yang secara eksplisit berisi semua simpul. Saya membayangkan (atau berharap) bahwa itu akan menggunakan pendekatan yang tidak bergantung pada gambar. Saya berharap saya tahu bagaimana upaya untuk memecahkan masalah ini. Mungkin beberapa spelunking dalam kode sumber untuk fungsi ini akan mengklarifikasi hal-hal.Python, 107
Saya menyadari bahwa mengambil pasangan secara langsung lebih pendek daripada
from itertools import*
dan mengetikcombinations()
. Namun saya juga memperhatikan bahwa solusi saya bergantung pada wajah segitiga input dengan simpulnya terdaftar dalam urutan yang konsisten. Oleh karena itu keuntungan dalam jumlah karakter tidak terlalu besar.Python, 115
Dengan pendekatan karakteristik Euler, verbositas itertools tampaknya mustahil untuk dihindari. Saya ingin tahu apakah akan lebih murah menggunakan teknik yang lebih langsung untuk membuat pasangan simpul.
Contoh penggunaan:sumber