pengantar
Tulis program atau fungsi yang, dengan koordinat di mana anak panah mendarat di papan panah, kembalikan skor anak panah itu. Koordinat x,y
dart diberikan sebagai dua bilangan bulat, diukur dari pusat papan dart, dengan presisi milimeter.
Cara mencetak anak panah
Darts adalah permainan yang dimainkan dengan melemparkan anak panah ke papan bundar. Papan panah dibagi menjadi 20 "wedges" berukuran sama. Mulai dari atas dan searah jarum jam, bagian memiliki nilai 20.1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12 , 5. Jika anak panah Anda mendarat di bagian hitam atau putih dari salah satu irisan, Anda mencetak nilai yang ditunjukkan di luar irisan itu.
.
Namun, jika panah Anda mendarat di cincin hijau / merah luar papan panah, Anda mencetak dua kali lipat poin yang ditunjukkan di luar irisan yang Anda pukul. Demikian juga, dengan memukul cincin hijau / merah bagian dalam (yang ada di antara dua bagian putih / hitam), Anda mencetak tiga kali lipat dari angka yang ditunjukkan di bagian luar irisan. Jika panah Anda mengenai lingkaran paling dalam (mata merah), Anda mencetak skor 50 poin dan akhirnya, jika panah Anda menyentuh lingkaran kedua yang paling dalam (cincin hijau di sekitar mata sapi), Anda mencetak 25 poin.
Dimensi cincin, diukur dari pusat papan dart, adalah sebagai berikut:
Bullseye (50): [0mm-6mm)
25: [6mm-16mm)
Inner Single: [16mm-99mm)
Triple: [99mm-107mm)
Outer Single: [107mm-162mm)
Double: [162mm-170mm)
Miss (0): 170mm+
Catatan 1: Gambar yang disediakan hanya untuk tujuan ilustrasi, dan tidak untuk skala.
Catatan 2: Pengukuran yang diberikan merupakan perkiraan, dan mungkin tidak akurat untuk papan dart nyata.
Catatan 3: Semua pengukuran yang diberikan adalah [inclusive-exclusive)
. Untuk keperluan tantangan ini, kita tidak akan khawatir tentang panah yang mengenai kawat dan memantul. Jika anak panah mendarat "di kawat" dengan salah satu garis radial, maka tergantung pada penjawab untuk memutuskan apakah akan memutuskan ikatan searah jarum jam atau berlawanan arah jarum jam. Arah pemutusan ikatan harus konsisten, dan ditunjukkan.
Catatan 4: Papan Dart digantung dengan cara standar dengan bagian tengah 20 berada tepat di atas bullseye, dan 3 bagian langsung di bawah bullseye.
Memasukkan
Dua bilangan bulat yang mewakili x,y
koordinat tempat anak panah mendarat, diukur dalam milimeter, relatif terhadap bagian tengah papan panah.
Keluaran
Bilangan bulat tunggal, untuk jumlah poin yang akan diberikan kepada anak panah yang mendarat di koordinat yang diberikan.
Mencicipi
0,0 -> 50
2,101 -> 60
-163,-1 -> 22
6,18 -> 1
-6,18 -> 5
45,-169 -> 0
22, 22 -> 4 (if tie-broken clock-wise)
18(if tie-broken counter-clockwise)
-150,0 -> 11
-150,-1 -> 11
Mencetak gol
kode-golf . Byte paling sedikit dalam kode sumber Anda menang.
-150,-1
dan-150,0
yang harus memberi11
dan mungkin merupakan kasus tepi pada beberapa implementasi, karena ini adalah transisi antara theta konvergen ke -pi dan theta = + pi dalam koordinat polar. (Jawaban awal saya gagal pada jawaban ke-2.)Jawaban:
JavaScript (ES7), 137 byte
Mengambil koordinat dalam sintaks currying
(x)(y)
. Menggunakan tie-break berlawanan arah jarum jam.Cobalah online!
Bagaimana?
Kami menerjemahkan input koordinat Cartesian ke dalam koordinat polar dengan:( x , y) ( r , θ )
Kami menggunakan untuk menentukan apakah panah terletak di atas Bullseye , 25 , Single dalam , Triple , Outer Single , Double atau jika tembakannya adalah Miss .r
Jika kita berada di atas Tunggal , ganda atau triple , kita menggunakan untuk menentukan di mana sektor kita dengan:θ s
Untuk area , kita membutuhkan 4 tempat desimal untuk mendapatkan presisi yang cukup, yang menghasilkan:340 × 340 10 / π
Skor basis disimpan berlawanan arah jarum jam dalam string yang dikodekan base-36 dari 21 entri, dimulai dan berakhir pada :11
Kita perlu mengulangi karena setengah dari sektor ini milik keping pertama (di mana dekat dengan ), sedangkan separuh lainnya milik keping terakhir (di mana dekat dengan ).θ - π θ + π11 θ - π θ + π
Output grafis
Cuplikan kode ES6 berikut ini menggambar papan dart menggunakan logika yang sama seperti pada kode golf.
Tampilkan cuplikan kode
sumber
JavaScript (ES6) + SVG (HTML5),
53 + 52351 +519507 =576570558 byteInput adalah melalui klik mouse, output melalui
alert
. Sunting: Disimpan 12 byte dengan menggunakan sedikit lebih banyak warna perkiraan seperti yang disarankan oleh @Arnauld.sumber
b33
dan474
untuk merah dan hijau. :-)b33
adalahbb3333
begitub22
(aliasbb3322
) lebih dekat dengan asli Andabe3628
.Perakitan Intel 8086/8087,
180144142138 byteIni menggunakan prosesor matematika 8087 untuk semua aritmetika trigonometri dan mengambang. Semua perhitungan dilakukan dalam perangkat keras dengan presisi floating-point 80-bit.
Ditulis sebagai MASRO MACRO (pada dasarnya fungsi), mengambil X dan Y sebagai koordinat dan mengembalikan skor yang dihitung dalam AX. Dasi rusak searah jarum jam.
Contoh program uji untuk PC DOS. Unduh di sini DARTTEST.COM .
Keluaran
Contoh penggunaan program uji di atas . Diperlukan IBM PC aktual dengan 8087, DOSBox atau emulator favorit Anda.
* Suntingan:
sumber
Jelly , 56 byte
Tautan monadik yang menerima pasangan sebagai daftar
[x,y]
yang menghasilkan skor.Menggunakan searah jarum jam.
Cobalah online! Atau lihat test-suite
NB versi diad juga 56 byte
Bagaimana?
sumber
TI-Basic (TI-84 Plus CE),
147146 byteAnjuran untuk X dan Y pada jalur terpisah.
Ikat-putus berlawanan arah jarum jam.
TI-Basic adalah bahasa tokenized ; semua token yang digunakan di sini adalah satu byte.
Penjelasan:
Memanfaatkan fakta bahwa perbandingan boolean TI-Basic menghasilkan 0 atau 1 dengan menambahkannya dan mengalikannya dengan nilai poin.
sumber
T-SQL,
392 374366 byteJeda baris adalah untuk keterbacaan. Awal
UPDATE
menanganix=y=0
masalah yang jika tidak akan menimbulkan kesalahanATN2()
, tetapi tidak mengubah skor.Input diambil melalui tabel t yang sudah ada , sesuai pedoman IO kami . Karena menggunakan
TOP 1
, tabel ini hanya boleh berisi satu baris.Pada dasarnya saya bergabung dengan 3 tabel:
ROUND()
, yang sedikit lebih pendek, tetapi itu memberikan tie breaker yang tidak konsisten.)TOP 1
. Nilai f adalah skor tetap (untuk bulls-eye) atau pengali untuk skor irisan.EDIT : Menjatuhkan
ORDER BY
, tampaknya berfungsi dengan baik tanpanya, setidaknya pada SQL 2017. Saya juga menjatuhkanAND y=0
pada kondisi pembaruan; Saya menguji semuay
nilai integer , berubahx=0
menjadix=1
tidak pernah mengubah skor.EDIT 2 : Menghapus kolom g dari tabel d , menggantinya dengan
IIF()
pernyataan yang mengembalikanf
langsung (untuk mata bulls), atauf*b
, menyimpan 8 byte. Juga menghapus ruang setelahTOP 1
.sumber
Haskell , 198 byte
Tie rusak berlawanan arah jarum jam.
(#)
adalah fungsi pencarian. Sudut kutub digunakan untuk mengindeks dari daftar angka, mulai dariatan2
titik cutoff di 11. Jarak digunakan untuk mengindeks dari daftar fungsi[const 50, const 25, id, (*3), id, (*2), const 0]
dan akhirnya fungsi ini diterapkan ke nomor yang sebelumnya kita dapatkan.Cobalah online!
sumber
Perl 5
-MMath::Trig':pi' -MMath::Trig':radial' -apl
, 166 byteCobalah online!
Membawa dua koordinat ruang terpisah pada STDIN. Tie-breaking berlawanan arah jarum jam.
sumber