Anda adalah kapten kapal perang. Departemen teknik telah mengambil jalan pintas dengan desain tahun ini, jadi kapal yang Anda tumpangi berbentuk segitiga sederhana.
Anda berjalan ke geladak dan menikmati angin laut ... meskipun tidak lama. Musuh telah menembaki Anda! - tetapi apakah tembakannya akan mengenai?
Memasukkan
Anda dapat menulis fungsi atau program lengkap untuk tantangan ini.
Program Anda akan mencakup 11 bilangan bulat, sepuluh di antaranya dipasangkan:
Tiga pasang bilangan bulat pertama (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) akan menentukan simpul kapal Anda. Segitiga yang terbentuk akan memiliki area bukan nol.
Sepasang bilangan bulat berikutnya (e x , e y ) menentukan lokasi meriam musuh. Meriam musuh tidak akan pernah berbaring, atau dalam batas kapal Anda. *
Pasangan (a x , a y ) setelah itu menentukan ke mana tujuan musuh. Ini akan berbeda dari (e x , e y ).
Integer positif akhir R menentukan kisaran tembakan musuh
* Anda akan menjadi kapten yang mengerikan jika Anda bahkan tidak melihat itu terjadi!
Keluaran
Anda harus mencetak / mengembalikan truthy nilai (misalnya benar, 1) jika kapal perang akan terkena, jika nilai falsy (misalnya palsu, 0).
Apa itu hit?
Tembakan musuh adalah segmen garis lurus dengan panjang R dari (e x , e y ) ke arah (a x , a y ). Jika segmen garis ini tumpang tindih dengan bagian mana pun dari interior kapal perang segitiga Anda, maka ini dianggap sebagai hit. Kalau tidak, itu bukan hit.
Tembakan yang merumput di sepanjang atau hanya mencapai hingga batas segitiga tidak dihitung sebagai hit.
Contohnya
0 0 0 1 1 0
1 1
0 0
2
Hit: Musuh telah menembak tepat melalui pusat kapalku!
2 0 0 2 4 4
0 0
1 1
1
Tidak ada pukulan: Rentang musuh terlalu pendek, jadi Anda aman.
0 0 1 2 3 0
-4 0
0 0
8
Tanpa pukulan: Musuh telah menyerempet sisi kapal Anda, jadi ini tidak dihitung sebagai pukulan. Beruntung!
0 0 -1 3 4 -1
-3 -4
3 4
5
Tanpa pukulan: Tembakan musuh hanya berhenti di dekat kapal, jadi Anda aman. Jika meriam musuh memiliki jangkauan yang sedikit lebih baik, maka Anda akan terkena! Fiuh!
-2 -3 -3 6 7 -2
-6 2
1 -4
7
Hit: Meskipun tembakan tidak menembus ke sisi lain, ini masih menjadi hit.
-3 2 2 -4 7 -3
-3 -4
-3 0
10
Tanpa hit: Sebagai catatan, ini adalah miss close lainnya.
Kasus uji tambahan
0 0 6 0 6 8
-6 -8
6 8
20
Tidak ada pukulan: Ini adalah satu lagi goresan, tetapi pada satu sudut.
0 0 -2 -5 5 3
-3 4
0 0
6
Hit: Tembakan masuk melalui simpul kapal.
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte menang. Celah standar berlaku.
0 0 -1 3 4 -1 -3 -4 3 4 6
.Jawaban:
Python 3, 252 byte
Ini tentu saja variabel terbanyak yang pernah saya gunakan dalam kode golf. : ^ P
Sedikit ungolfed, dengan komentar:
Bagaimana itu bekerja:
Sampel berjalan:
sumber
Python 2.7, 235 byte
Menghitung produk silang
AB x AP
antara sudut A, B dan titik P. Jika ketiganya memiliki tanda yang sama, maka titik tersebut berada di dalam segitiga.Tidak Disatukan:
Tes:
sumber
C, 247 byte
Jelas belum bermain golf.
Saat ini ini menggunakan pendekatan yang mirip dengan solusi DLosc, yaitu iterate melalui semua koordinat yang mungkin pada segmen garis untuk menentukan apakah itu bersinggungan dengan segitiga. (Jadi itu akan gagal jika rentangnya lebih dari 1000) Namun, ia menggunakan rumus dari http://mathworld.wolfram.com/TriangleInterior.html untuk menentukan apakah suatu titik berada di dalam segitiga. Ini menghindari banyak fungsi trigonometri.
Contoh cek, harus dicetak
1 0 0 0 1 0
.sumber
JavaScript (ES6) 320
448 522 627(Masih bisa bermain golf lagi?)
Langkah:
Ref:
Segment intersection
Point dalam segitiga
Point dalam suatu segmen diberi jarak
Tes di Firefox
Tidak disatukan
sumber