pengantar
Arena ini adalah dataran datar yang dipenuhi gedung pencakar langit, yang digunakan musuh untuk berlindung. Anda dan musuh Anda saling menembak dengan laser. Anda semua membawa paket jet, memungkinkan penerbangan.
Musuh mana yang bisa Anda pukul dengan laser, dan yang bersembunyi?
Masalah
Pertama, ukuran arena diberikan oleh integer n
pada satu baris. Baris berikut n
berisi n
bilangan bulat per baris yang dipisahkan oleh spasi. Setiap bilangan bulat mewakili ketinggian bangunan di lokasi itu. Setiap bangunan adalah benda padat persegi panjang, 1 unit kali 1 unit dengan unit tinggi.
Berikutnya, lokasi Anda diberikan pada satu baris tiga angka floating point x
, y
, z
.
Akhirnya, jumlah musuh diberikan oleh integer m
pada satu baris. Baris berikut m
berisi tiga angka floating point per baris yang dipisahkan oleh spasi. Ini mewakili x
, y
dan z
koordinat musuh. Sistem koordinat didefinisikan sebagai berikut:
x
diukur dari kiri ke kanan di input kotay
diukur dari atas ke bawahz
diukur dari bawah ke atas
Untuk setiap musuh, jika garis yang tidak terhalang dapat ditarik dari Anda ke musuh itu, berikan bilangan bulat positif . Jika tidak, hasilkan bilangan bulat negatif . Pisahkan output dengan baris baru.
Input Sampel
Komentar, dilambangkan dengan '#', hadir untuk membantu Anda dengan cepat melihat apa yang dilakukan setiap baris. Mereka tidak akan hadir dalam input aktual.
5 # Size of the map
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
4 4 4 4 4 # Buildings
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
2.5 0.0 4.0 # Your location
3 # Number of enemies
2.5 5.0 0.1 # Enemy location
2.5 5.0 5.0 # Enemy location
0.0 2.7 4.5 # Enemy location
Output sampel
Untuk input sampel di atas, kami menampilkan yang berikut:
-1
1
1
Asumsi
- 0
n
<<100 - 0
m
<<100 - 0 <=
x
<=n
- 0 <=
y
<=n
- 0 <=
z
<n
- Pemain tidak akan berlokasi di atau di dalam sudut, tepi, atau sisi bangunan
- Garis pandang Anda kepada musuh tidak akan pernah bersinggungan dengan sudut, tepi, atau sisi bangunan
- Seorang pemain bukan halangan
Jawaban:
Perl,
301 296282Sunting 2: Sebenarnya, kompetisi atau tidak, tidak ada alasan untuk tidak bermain golf sedikit lebih jauh. Uji secara online .
Sunting: Beberapa tanda kurung hilang, regex sederhana untuk memeriksa bilangan bulat tidak nol.
Dengan baris baru dan lekukan agar mudah dibaca:
Ini membutuhkan
5.14
argumen skalar (referensi array) untukpop
.sumber
PE
menghubungkan dua titik dalam ruang 3-D, "Player" (X1Y1Z1) dan "Musuh" (X2Y2Z2). Proyeksi pada(XY)
bidang memotong beberapa garis grid yaitu bilangan bulatx = const
atauy = const
sepertiX1 < x < X2
atauY1 < y < Y2
(dengan asumsi di sini misalnyaX1 < X2
, tetapi tidak penting). Koordinatx y
persimpangan ini dapat dengan mudah ditemukan, dan karenanyaz
mengkoordinasikan titik padaPE
garis juga.x y
koordinat apa pun , kita mengetahui ketinggianh
bangunan (lebih tepatnya, ketinggian maksimum hingga 4 bangunan yang memilikix y
titik berbagi ). Musuh dapat ditembak jika (dan hanya jika)h < z
untuk semua "titik persimpangan" yang disebutkan di atas. Implementasi adalah beberapa aritmatika dasar, serta beberapa trik dengan Perl untuk tujuan bermain golf. Menguraikan detail bagaimana saya melakukannya sebulan yang lalu akan memakan waktu sekarang :-).@a
array dalamgrep
ekspresi harus muncul dalam urutan0,3,0,4,1,5,2
alih-alih3,0,3,1,4,2,5
- maaf.Python 2.7 -
429420308308 karakterSaya menganggap tantangan ini lebih sebagai masalah matematika daripada masalah golf kode, jadi jangan terlalu keras bagi saya jika saya melewatkan beberapa optimasi yang jelas. Bagaimanapun, ini kodenya:
Ini harus bekerja untuk kasus tepi dan sudut (pun tidak diinginkan) dan cukup solid. Ouput untuk contoh yang diberikan:
Dan inilah penjelasan "singkat":
Saya kira ini penuh dengan kekurangan. Btw saya menyimpan karakter di nesting (level pertama adalah satu spasi, tab kedua, lalu satu tab dan spasi ...). Saya berharap setelah semua jawaban ini dapat menunjukkan cara untuk melakukannya.
sumber
print 1-2*...
bukanprint.5-...
) Jadi saya kira tidak ada perbedaan besarC - 2468
Tidak bermain golf sama sekali, tapi mudah-mudahan ini merupakan titik awal untuk implementasi yang lebih menarik. Implementasi
intersect
ini banyak dikutip dari Adrian Boeing . Pseudo-code-nya tidak lengkap, tetapi penjelasannya tentang matematika sangat berharga. Ide dasarnya adalah Anda mengambil garis dari pemain ke target dan menempelkannya ke semua dinding di setiap bangunan, memperbarui panjang untuk setiap dinding. Panjang yang tersisa adalah bagian di dalam gedung, jadi jika nol, tidak ada persimpangan.sumber