Saya pikir semua orang terbiasa dengan panah, beberapa orang tidak mengerti nilainya jadi bagi orang-orang di sini adalah tautan yang bermanfaat.
Papan
Papan dart dapat dibandingkan dengan potongan pai dalam 20 potong. Setiap bagian dibagi dalam 4 bagian.
- cincin luar kecil yang disebut ganda (poin x2)
- cincin besar yang disebut tunggal (poin x1)
- cincin kecil lain yang disebut triple (poin x3)
- cincin besar lain yang disebut tunggal (poin x1)
Di tengah papan ada 2 cincin lagi, yang hijau dan merah (papan klasik)
- Cincin merah, tengah papan disebut bullseye atau double bull dan bagus untuk 50 poin. Yang ini dianggap sebagai dobel dan karena itu diperbolehkan untuk checkout dengannya.
- Cincin hijau, disebut banteng, banteng tunggal atau hanya 25 dan dianggap sebagai satu.
Tantangan
Temukan semua kemungkinan checkout dengan 3 anak panah atau kurang.
Pengguna dapat memasukkan bilangan bulat dan Anda harus memeriksa apakah mungkin untuk mendapatkan skor 0 dengan 3 anak panah (atau lebih sedikit).
Contohnya
Contoh 1:
Input: 170
Output: T20, T20, Bullseye
Contoh 2:
Input: 6
Output: D3;
S3,S1,D1;
S2,D2;
S2,S2,D1;
D2,D1;
S4,D1;
D1,D1,D1;
S1,S1,D2;
T1,S1,D1;
Contoh 3:
Input: 169
Output: No possible checkout!
Aturan
- Aturan panah dasar, Anda harus mengakhiri dengan dobel (cincin luar papan atau bullseye)
- Tidak menggunakan sumber daya eksternal.
- Pengodean keras dari kemungkinan checkout diperbolehkan tetapi ingat ini adalah codegolf, itu tidak akan membuat kode Anda pendek;)
- Sel yang dipukul akan ditampilkan dalam format C + N di mana C = T untuk Triple, D untuk double dan S untuk single.
- Bullseye dapat disebut Bullseye atau DB, DBull atau sesuatu yang serupa.
Kemungkinan checkout
Untuk memulainya, checkout tertinggi yang mungkin adalah 170.
169.168.166.165.163.162.159 tidak dimungkinkan dalam 3 anak panah.
Checkout serendah mungkin adalah 2.
Tambahan
Ini bukan persyaratan, tambahkan kemungkinan untuk menampilkan semua kemungkinan checkout untuk semua skor. Pada dasarnya karena saya bertanya-tanya berapa banyak kombinasi yang mungkin: P
Pemenang akan menjadi orang dengan kode terpendek.
Selamat coding.
Jawaban:
C ++
248/228230/214 karakterWahyu 0:
Rev 1. Menyimpan beberapa karakter dengan mendeklarasikan semua variabel sekaligus, dan dengan menghilangkan tanda kurung yang tidak perlu. Ternyata di C ++ semua logika dan bitwise dan / atau lebih diutamakan daripada perbandingan.
Saya melakukan fungsi daripada program, seperti yang dilakukan orang lain. Ini mengembalikan jumlah total kemungkinan yang ditemukan. Ini dapat dikurangi dari 230 hingga 214 karakter dengan menghilangkan fitur totalising.
Output sampel, skor 6:
Saya menghitung anak panah pertama dan kedua yang berbeda sebagai kombinasi yang sama, seperti yang telah dilakukan OP (contoh:
T1 S1 D1 = S1 T1 D1) walaupun ini membutuhkan 7 karakter tambahan. Saya selalu membuat daftar skor yang lebih tinggi terlebih dahulu (mengabaikan penggandaan dan trebling) karena menurut saya ini lebih relevan bagi pemain (yang mungkin mengubah strateginya jika dia gagal dengan panah pertama.) Untuk alasan yang sama saya mendaftar panah sesuai dengan panah kedua. Saya menganggap panah ke-3 benar-benar berbeda dengan dua panah yang lain, oleh karena itu saya menganggap D1 D2 dan D2 D1 sebagai kasus yang berbeda sedangkan OP telah mendaftarkannya sebagai sama.
Dengan sistem penghitungan ini, saya mendapatkan 42336 kemungkinan total , sama seperti mmumboss. Menghitung anak panah pertama dan kedua yang berbeda sebagai kombinasi yang berbeda, ini meningkat hingga 83349.
Saya belum pernah menggunakan for for dengan set seperti yang dilakukan orang lain (saya cukup baru untuk C ++ dan saya bahkan tidak tahu apakah itu mungkin.) Sebagai gantinya saya menyalahgunakan syarat dalam kenaikan loop untuk melompat dari 20 hingga 25 Saya menggunakan variabel dari satu loop untuk mengkodekan semua skor yang mungkin untuk satu anak panah, seperti ini: S1 D1 T1 S2 D2 T2 dll dengan modulus dan pembagian untuk memecahkan kode. Ini menghemat verbositas menyatakan lebih banyak untuk loop, meskipun itu membuat ekspresi lebih rumit.
Hasil dari ini adalah bahwa panah yang tidak digunakan ditampilkan sebagai T0, tapi saya pikir itu jelas apa yang dimaksud, terutama karena (dengan mempertimbangkan anak panah pertama dan kedua sebagai kombinasi yang sama), saya telah dapat mengelompokkan mereka semua bersama-sama di awal. dari output saya.
Versi tidak dikolomasikan di sini. Beberapa fitur lainnya adalah penggunaan operator & & && secara selektif dengan | sedemikian rupa untuk memberikan urutan prioritas yang saya inginkan tanpa tanda kurung.
sumber
MATLAB (
299249241 karakter)Ini adalah golf serius pertama saya. Upaya pertama saya (136 karakter) memberikan hasil yang benar, tetapi tidak dengan format yang benar. Ini memberikan semua kemungkinan melihat jumlah poin untuk setiap panah. Ini berarti bahwa tunggal 20 dan ganda 10 memiliki entri yang terpisah, namun keduanya ditampilkan sebagai 20. Tentu saja panah terakhir selalu ganda.
Dalam upaya kedua pemformatan ditingkatkan, yang tentu saja meningkatkan jumlah karakter:
Ditingkatkan dari 299 menjadi 249 karakter, sementara pada saat yang sama bahkan meningkatkan format output. Untuk versi yang ditingkatkan ini keluaran untuk contoh kasus adalah:
f (170):
f (6):
f (169):
Tambahan:
Menurut kemampuan berhitung saya, ada total 42336 kemungkinan untuk mengakhiri permainan panah.
sumber
60 60 50
seharusnyaT20 T20 Bullseye
. Saya akan menjelaskan hal ini dalam pertanyaan. Nice going though, hampir di sana :)Ruby (260 karakter)
"Yang terakhir harus ganda" adalah bagian yang hilang - tidak bisa mengetahui mengapa 168 tidak memiliki hasil ...:
c. (170)
c. (6)
sumber
Python 2.7 (270 karakter)
Tidak yakin python akan mengizinkan satu-liner, tetapi ia dalam tiga.
Atau 278+ karakter dengan pesan 'No Checkout' yang tepat (mis. 290 di sini):
Kita mulai:
f (170)
f (6)
f (169)
Hal-hal yang tidak saya sukai:
Ini lebih dari 10% dari total. Apakah ada cara yang lebih ringkas tanpa itertools dll?
Ini digunakan untuk mencegah duplikat dalam kasus finish dua panah (misalnya ['', 'S1', 'D1'] dan ['S1', '', 'D1']). Saya anggap penting (hei - panah terakhir harus ganda, jadi jelas urutan masalah), tetapi lemparan non-lemparan adalah kasus khusus.
sumber
05AB1E , 43 byte
Cukup lambat .. Keluaran sebagai daftar daftar, atau daftar kosong jika tidak ada penyelesaian yang mungkin. Kerbau saya adalah
S25
danD25
; jika ini tidak diizinkan, saya bisa mengubahnya.Cobalah secara online atau verifikasi beberapa uji sekaligus .
Penjelasan:
Ada beberapa langkah:
1) Buat daftar semua anak panah yang mungkin tunggal, ganda, dan tiga kali lipat:
2) Dapatkan semua pelapis yang mungkin (diakhiri dengan dua kali lipat) hingga 3 anak panah:
3) Hanya simpan yang nilai totalnya sama dengan bilangan masukan:
4) Konversi data ke daftar hasil yang tercetak cantik (yaitu
[[20,3],[5,1],[1,2]]
menjadi["T20","S5","D2"]
):sumber
Kotlin , 254 byte
Catatan: algorythm didasarkan pada jawaban C ++ Level River St.
Cobalah online!
sumber