Menghitung jumlah segitiga dalam gambar adalah tugas yang biasa digunakan dalam tes otak. Anda diberi gambar yang berisi bentuk yang terdiri dari segitiga. Anda kemudian harus menemukan semua kemungkinan segitiga dalam gambar.
Tugas
Anda diberi daftar garis dalam format pilihan Anda. Anda kemudian harus menampilkan daftar segitiga yang ditemukan di dalamnya
Memasukkan
Anda diberi daftar garis, masing-masing diberikan oleh empat koordinat bilangan bulat (mis. x1 y1 x2 y2
). Anda dapat memilih format input, asalkan terdokumentasi dengan jelas. Contoh:
0 4 8 1
0 4 9 5
8 1 9 5
2 8 0 4
9 5 2 8
[[0, 4, 8, 1], [0, 4, 9, 5], [8, 1, 9, 5], [2, 8, 0, 4], [9, 5, 2, 8]]
Berikut input yang sama dengan gambar:
Yang lain, dengan persimpangan (hanya dalam satu format untuk menghemat ruang):
[[2, 1, 5, 0], [2, 1, 2, 7], [5, 0, 6, 6], [5, 0, 2, 7], [6, 6, 2, 1], [2, 7, 6, 6]]
Keluaran
Anda harus menampilkan daftar semua segitiga, masing-masing diberikan oleh enam koordinat floating-point (mis. x1 y1 x2 y2 x3 y3
), Pada gambar yang ditentukan oleh input. Ini mungkin bukan bilangan bulat, karena garis-garis mungkin melintas di titik mana pun. Anda dapat memilih format output, asalkan terdokumentasi dengan jelas. Contoh output untuk input contoh di atas:
0 4 8 1 9 5
0 4 9 5 2 8
[[0, 4, 8, 3, 9, 5], [0, 4, 9, 5, 2, 8]]
[[2, 1, 5, 0, 2, 7], [2, 1, 5, 0, 6, 6], [5, 0, 6, 6, 2, 7], [2, 1, 6, 6, 2, 7], [2, 1, 5, 0, 3.674, 3.093], [5, 0, 6, 6, 3.674, 3.093], [6, 6, 2, 7, 3.674, 3.093], [2, 7, 2, 1, 3.674, 3.093]]
Anda mungkin menganggap itu
tidak ada kasus tepi di mana garis melintasi persimpangan tetapi tidak ada garis, seperti
[[0, 9, 1, 8], [1, 8, 2, 9], [2, 9, 3, 8], [3, 8, 4, 9], [4, 9, 0, 9]]
tidak ada sudut lebih dari 179 derajat, seperti
[[0, 0, 0, 1], [0, 1, 0, 2], [0, 2, 0, 0]]
Aturan
- Anda dapat menggunakan bahasa apa pun yang Anda inginkan.
- Tidak ada sumber daya eksternal yang harus digunakan.
- Celah standar berlaku.
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
[0,9],[1,8],[2,9],[3,8],[4,9]
sebenarnya adalah W dengan garis yang ditarik di bagian atas. Apakah itu tidak ada segitiga atau 2 segitiga?[0,0],[1,0],[2,0],[1,2]
"segi empat" dengan satu sudut 180 derajat. Tidak ada segitiga atau 1 segitiga?Jawaban:
PostGIS, 162
Saya pikir ini sesuai dengan aturan, Ini adalah permintaan untuk PostGIS, yang merupakan perpanjangan dari PostgreSQL. Input diasumsikan sebagai tabel koordinat untuk setiap baris yang disebut L Output adalah seperangkat baris dengan definisi poligon untuk segitiga yang dibentuk.
Dalam penggunaannya terlihat seperti berikut ini
Outputnya adalah sebagai berikut
sumber
Mathematica
915 395 401405Memperbarui
Tantangan pemrograman ini jauh lebih sulit daripada yang pertama kali terlihat.
Pendekatan saat ini bekerja dengan kasus-kasus sederhana, di mana hanya ada satu persimpangan sepanjang panjang segmen garis apa pun. Dengan beberapa persimpangan sepanjang satu segmen, perlu untuk melacak semua titik persimpangan di sepanjang setiap garis dan membuat sub-segmen baru (karenanya tepi grafik tambahan) yang menghubungkan persimpangan baru ke semua titik persimpangan di sepanjang garis target.
Terlepas dari keterbatasan itu, mungkin ada baiknya berbagi logika yang mendasari pendekatan saat ini.
Segmen jalur input diperlakukan sebagai daerah. Jika mereka berpotongan, pusat massa akan menjadi koordinat persimpangan. Kita perlu menghilangkan persimpangan yang terjadi pada simpul segmen garis. Garis-garis yang tidak berpotongan akan memiliki pusat massa tak tentu.
Empat tepi baru dibuat untuk setiap titik persimpangan. Mereka menghubungkan titik persimpangan ke empat simpul dari dua garis berpotongan.
Grafik seperti yang di bawah ini di sebelah kanan dihasilkan menggunakan kedua sisi yang lama dan yang baru.
Verteks adalah koordinat dari masing-masing titik. Siklus, yaitu, loop tertutup dari tiga simpul akan menjadi segitiga asalkan ketiga simpul tersebut tidak collinear.
Saat ini kami memeriksa untuk melihat apakah "segitiga" memiliki area yang tidak ditentukan. (Untuk beberapa alasan itu tidak mengembalikan area 0 untuk tiga titik collinear.)
Contoh sederhana
Di bawah ini adalah (a) gambar yang diplot dalam bidang koordinat dan (b) grafik yang menunjukkan node yang diberikan serta simpul persimpangan
{114/23, 314/69}
,. Dalam yang terakhir, simpul tidak terletak di koordinat Cartesius masing-masing.Mungkin terlihat bahwa ujungnya lebih banyak di kanan daripada di kiri. Tetapi ingat bahwa ada sisi grafik yang tumpang tindih di sebelah kiri. Setiap diagonal sebenarnya sesuai dengan 3 tepi grafik!
Setiap baris di bawah adalah segitiga.
Contoh yang lebih kompleks
Inilah grafik yang sesuai dengan koordinat input . Verteks berada pada koordinat Kartesius yang diharapkan. (Jika Anda menjalankan kode golf itu akan menampilkan simpul di tempat lain sambil menghormati label dan tepi simpul. Untuk keterbacaan, saya menetapkan koordinat titik menggunakan segelintir kode tambahan, tidak perlu untuk solusi.)
Inilah grafik yang diturunkan.
Ini mencakup titik potong persimpangan
(0,1/11)
, tempat beberapa garis input bersilangan.Kode menemukan 19 segitiga. Sembilan dari mereka memiliki titik,
(0,1/11)
sebagai salah satu simpul.sumber
Java,
10511004(Program sepenuhnya bekerja)
Saya pikir ini adalah tantangan yang bagus bukan hanya untuk bermain golf beberapa kode, tetapi terutama untuk berlatih menulis fungsi matematika.
Dan untuk menggambar "garis dasar" saya membuatnya di Jawa * Menunggu semua orang mulai tertawa * .
Kode
Memasukkan
Bilangan bulat yang dipisahkan ruang. Berpasangan 4 (x1, y1, x2, y2)
Output (output nyata tidak membulatkan ke 3 desimal)
Setiap garis mengandung satu segitiga. Setiap garis terdiri dari titik-titik mengambang yang dipisahkan ruang dalam pasangan 2 (x1, y1, x2, y2, x3, y3). (Catatan: urutan 3 titik yang membentuk segitiga tidak terdefinisi.)
Penjelasan
Saya mulai menulis metode untuk menemukan persimpangan antara dua baris yang tidak terbatas. Metode yang dihasilkan adalah untuk gaya Java yang cukup pendek (246). Alih-alih membiarkan input metode terdiri dari 8 Poin ganda atau dua (P) saya memilih untuk menggunakan parameter arbitrer untuk mengamankan sejumlah besar karakter. Untuk meminimalkan penggunaan array operator setiap parameter yang digunakan lebih dari 2 kali ditempatkan dalam variabel itu sendiri.
Penjelasan lebih lanjut untuk ditambahkan ... (jawaban ini mungkin dapat golf lebih)
sumber
BBC BASIC
Emulator di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Saya berharap ini golf turun ke 400-an.
Input output
Setiap kali pengguna memasuki baris baru, program memeriksa apakah ada segitiga baru yang telah dibuat, dan langsung mengeluarkannya, lihat di bawah.
Segitiga baru dibuat di mana pun garis baru berpotongan dengan dua garis yang sudah ada sebelumnya yang juga saling berpotongan (kecuali ketika ketiga garis berpotongan pada suatu titik, yang merupakan kasus khusus yang harus ditangani.)
Kode
Program utama adalah sesederhana mungkin. Pada akhirnya adalah fungsi, yang melakukan tugas kompleks mendeteksi persimpangan, sesuai dengan rumus di http://en.wikipedia.org/wiki/Line%E2%80809393_line_intersection
Fungsi mengembalikan nol jika tidak ada persimpangan dan nomor titik mengambang bukan nol jika ada. Ini juga memiliki efek samping: koordinat persimpangan ditambahkan ke string z $. Selain itu, di BBC basic variabel fungsi dapat dilihat oleh program utama asalkan program utama tidak memiliki variabel dengan nama yang sama (bahkan setelah fungsi selesai.)
Oleh karena itu program utama memiliki akses ke variabel
x
dany
, danm
dann
, yang menyimpan koordinat persimpangan saat ini dan sebelumnya. Ini digunakan untuk mendeteksi jika kita benar-benar menemukan segitiga dan bukan hanya tiga garis berpotongan pada suatu titik.sumber