Saatnya untuk menggali catatan trigonometri lama Anda dari sekolah menengah! Tantangannya adalah untuk menyelesaikan sisi dan sudut segitiga yang tidak diketahui. Dan seperti kebiasaan dalam golf kode, kode kerja terkecil menang.
Ini bukan masalah sepele; implementasi referensi saya di python saat ini turun ke 838 837 karakter, tapi saya yakin Anda akan dapat solusi golf yang jauh lebih kecil.
Selain itu, jika Anda buntu, bagian Wikipedia ini akan membantu Anda: Segitiga: Menghitung sisi dan sudutnya .
Memasukkan
Segitiga berikut menunjukkan nama sisi dan sudut yang digunakan dalam tantangan ini. Perhatikan bahwa sisi adalah huruf kecil dan sudut adalah huruf besar.
Input diberikan sebagai enam nilai yang dipisahkan ruang, baik pada stdin
argumen baris perintah atau (pilihan Anda). Enam nilai sesuai dengan sisia, b, c
dan sudut A, B, C
. Sisi yang tidak dikenal diberikan sebagai tanda tanya ( ?
). Baik sudut input dan output harus dalam radian. Anda dapat mengasumsikan bahwa nilai input benar (Anda tidak perlu memvalidasi apa pun). Anda juga dapat mengasumsikan bahwa segitiga input adalah non-merosot, dan bahwa semua sisi dan sudut adalah nol.
Input contoh berikut memberi tahu Anda bahwa sisi a
adalah 8
, sisi b
adalah 12
dan sudut A
adalah 0.5
radian:
8 12 ? 0.5 ? ?
Keluaran
Output diberikan dalam format yang sama dengan input - enam angka yang dipisahkan spasi stdout
. Satu-satunya pengecualian adalah ketika tidak dimungkinkan untuk menyelesaikan segitiga input - maka string "No solution"
harus ditulis stdout
. Jika dua solusi mungkin, keduanya dihasilkan dengan garis baru di antara mereka.
Berikut ini adalah output untuk input di atas:
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
Output tidak harus memiliki banyak presisi, tetapi setidaknya beberapa desimal diperlukan.
Aturan
- Input dibaca dari
stdin
atau argumen baris perintah - Output ditulis untuk
stdout
- Jika dua solusi dimungkinkan dengan input yang diberikan, output keduanya
- Jika terlalu sedikit informasi untuk mendapatkan satu atau dua solusi yang jelas, anggap itu sebagai
"No solution"
kasus - Tidak ada kode bawaan atau yang sudah ada sebelumnya yang dapat digunakan (tentu saja Anda dapat menggunakan fungsi trigonometri, tetapi tidak "
solveTriangle
" atau semacamnya) - Kode terpendek menang
Uji kasus
Di 3 4 5 ? ? ?
Di luar 3.0 4.0 5.0 0.643501108793 0.927295218002 1.57079630572
Di ? 4 ? 0.64 0.92 1.57
Di luar 3.00248479301 4.0 5.02764025486 0.64 0.92 1.57
Di ? ? 5 ? 0.92 ?
Di luar No solution
Di ? ? 5 ? 0.92 1.57
Di luar 3.03226857833 3.97800936148 5.0 0.65159265359 0.92 1.57
Di 8 12 ? 0.5 ? ?
Keluar (dua solusi)
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
Di 8 12 ? ? .5 ?
Di luar 8.0 12.0 18.3912222133 0.325325285223 0.5 2.31626736837
Semoga berhasil!
sumber
Jawaban:
Python, 441 karakter
Apakah pemicu khas Anda untuk menghitung jawabannya. Solusi saat ini yang mungkin disimpan sebagai tupel dalam V. Setiap nilai yang tidak diketahui dicatat sebagai 0. Variabel ketujuh R adalah nilainya
a/sin(A)==b/sin(B)==c/sin(C)
.Saya menggunakan trik di mana nilai a / b / c didaur ulang setiap iterasi untuk menghindari banyak logika yang berlebihan. Lingkaran dalam hanya perlu menghitung nilai sisi atau sudut A.
sumber
8 12 ? ? .5 ?
.if a
denganif not a
dan meratakan kondisional ke level 1.Biasa C,
565555530 karakterC bukan bahasa terbaik untuk Code Golf, saya kira, jadi itu hanya untuk bersenang-senang.
Disusun dengan
cc -o trig trig.c -lm
. Membaca input sebagai argumen baris perintah.sumber
8 12 ? ? .5 ?
- Saya menambahkannya sebagai test case tambahan di OP.Perl - 412 karakter
Sebagai perl one-liner, berdasarkan dari Solusi Python Keith Randall:
Di sini dalam bentuk yang lebih mudah dibaca:
sumber