Tugas: Mengingat luas segitiga, temukan segitiga Heronian dengan area itu. Segitiga Heronia dengan area yang ditentukan diperbolehkan.
Segitiga Heronian adalah segitiga dengan sisi bilangan bulat dan area bilangan bulat . Dengan rumus Heron, sebuah segitiga dengan panjang sisi a,b,c
memiliki luas
sqrt(s*(s-a)*(s-b)*(s-c))
di mana s=(a+b+c)/2
setengah perimeter segitiga. Ini juga dapat ditulis sebagai
sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4
Jika tidak ada segitiga seperti itu, output dengan nilai falsey yang konsisten.
Input: Bilangan bulat tunggal, positif yang mewakili area segitiga.
Output: Setiap tiga sisi panjang untuk segitiga seperti itu ATAU nilai yang salah.
Contoh:
Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error
Ini adalah kode golf, jawaban terpendek dalam byte menang.
Jawaban:
Jelly ,
1716 byte-1 byte terima kasih kepada Erik the outgolfer (gunakan quick,
¥
)Aplikasi brute force formula Heron.
Cobalah online! (mencapai waktu 60-an untuk 114 tes. Mengambil 3m 30-an secara lokal - ini memeriksa 114 3 = 1.481.544 tiga kali lipat)
Bagaimana?
Solusi golf sejati - diberikan area
a
yang menemukan semua tupel dari tiga bilangan bulat di antara1
dana
(bahkan dengan segitiga berulang dan yang tidak ada area), dapatkan area mereka dan filter untuk mereka yang memiliki area yang diinginkan (bahkan tidak berhenti segera setelah satu ditemukan, itu membajak mereka semua dan muncul hasil pertama sesudahnya). Hasil0
jika tidak ada.sumber
ç
denganÇ⁼¥
dan menghapus baris kedua seluruhnya.JavaScript (ES7),
10910210098 byteMengembalikan array 3 integer atau
false
. Seperti jawaban Jelly , ini dengan kasar memaksa formula Heron.Uji kasus
Tampilkan cuplikan kode
Versi rekursif, 83 byte
Mengembalikan array 3 bilangan bulat atau melempar kesalahan rekursi. Sayangnya, ini hanya berfungsi untuk input kecil.
Demo
Tampilkan cuplikan kode
sumber
Haskell , 69 byte
Cobalah online!
Output tunggal dari daftar tiga sisi segitiga suka
[[3.0,4.0,5.0]]
. Masukan yang tidak mungkin diberikan[]
. Secara teknis hanyaFalse
Falsey untuk Haskell, tetapi karena Haskell membutuhkan semua output yang mungkin dari jenis yang sama, itu tidak dapat digunakan. Jika kesalahan dapat digunakan sebagai Falsey,[...]!!0
akan menghemat 3 bytetake 1[..]
.Mencoba semua tiga kali lipat
t
dari panjang sisi masing-masing mulai dari1
ke daeraha
. Rumus Heron digunakan untuk memeriksa apakah daerah cocok melalui(s-0)(s-x)(s-y)(s-z)==a*a
manas=(x+y+z)/2
adalahsum t/2
. Produk(s-0)(s-x)(s-y)(s-z)
dinyatakan sebagaiproduct
dengan elemen yang diambil0:t
, yaitu rangkap tiga dan 0.sumber
F #,
170156152 byteCobalah online!
"Tidak Diundang"
Jika tidak ada hasil yang ditemukan, program akan salah. Jika ini tidak diinginkan, saya harus mengganti
List.find
denganList.filter
(+2 byte) yang akan menghasilkan daftar kosong jika tidak ada yang ditemukan atauList.tryFind
(+3 byte), mengembalikan None jika tidak ada segitiga yang ditemukan.Saya selalu menemukan bahwa versi F # golf masih terbaca wajar.
sumber
System.Math.Sqrt
dan membandingkan nilai yang dihasilkanA * A
?1.0..A [...] 1.0..A [...] 1.0..A
dengan1.0..A [...] a..A [..] b..A
harus menghemat beberapa byte dan mempercepat Anda sedikit (jika berhasil; Saya memiliki pengalaman F # sangat minimal).Python 2 (PyPy) ,
131123118 byteCobalah online!
Meskipun ini juga berfungsi pada CPython, PyPy jauh lebih cepat dan mampu menghitung segitiga untuk 114 dalam batas waktu pada TIO.
Pengaturan waktu dari mesin saya:
sumber
Pyth - 23 byte
Yang mencetak nilai kebenaran / kepalsuan, atau
yang mencetak semua solusi yang mungkin, dan sangat lambat untuk input besar. Masukkan 'h' di awal untuk hanya mencetak satu.
Penjelasan:
Cobalah
sumber
Perl 6 , 54 byte
Pencarian kasar dari semua sisi yang memungkinkan hingga satu kurang dari
a
, area input.^a
adalah rentang angka dari 0 hinggaa - 1
.[X] ^a xx 3
mengurangi, dengan produk silang, tiga salinan dari kisaran itu, menghasilkan semua kembar tiga dari(0, 0, 0)
ke(a - 1, a - 1, a - 1)
.first
triplet sedemikian rupa sehingga luas segitiga dengan sisi-sisinya samaa
, menggunakan rumus Heron .Di dalam blok kode yang diberikan kepada
first
:$_
adalah triplet. Sebut di(x, y, z)
sini.(0,|$_)
adalah triplet yang sama tetapi dengan0
prepended:(0, x, y, z)
..sum / 2
adalah setengah perimeter (jumlah yang disebutkans
dalam ungkapan biasa rumus Heron)..sum / 2 «-« (0, |$_)
adalah pengurangan hiperoperator dengans
di kiri dan(0, x, y, z)
di kanan, memberi(s - 0, s - x, s - y, s - z)
.[*]
kemudian mengurangi quadruplet itu dengan multiplikasi, memberikan kuadrat area tersebut.a * a ==
mencari area kuadrat sama dengan kuadrat area yang diberikan.Jika tidak ada triplet yang ditemukan,
Nil
(yang merupakan falsey) dikembalikan.sumber
Haskell , 76 byte
Ini menampilkan daftar daftar yang berisi semua kemungkinan ukuran integral yang menghasilkan area yang benar melalui kekuatan kasar (mengeluarkan daftar kosong jika tidak ada). Peringatan itu menghasilkan mereka dua kali lipat karena pembagian di tengah tetapi bagian pecahan mereka selalu 0.
Jika Anda karena suatu alasan tidak dapat mengambil itu,
Ini akan menampilkan jawaban sebagai daftar daftar bilangan bulat untuk total
8977 byte atau131 byte tambahan. (Terima kasih kepada Neil)Jika Anda hanya perlu / ingin elemen pertama yang diletakkan
!!0
di bagian akhir hanya akan memberi Anda elemen pertama jika ada angka yang berlaku dan kesalahan jika tidak ada untuk 3 byte lebih dantake 1
pada awalnya akan mengambil elemen pertama tanpa kesalahan untuk 6 byte lagi.Cobalah online!
sumber
TI-Basic,
7069 byteMenampilkan panjang tiga sisi jika ada segitiga, melempar kesalahan sintaksis jika tidak ada (terima kasih
/
pada akhirnya).-1 byte terima kasih atas komentar Sean pada jawaban yang berbeda
sumber
Mathematica, 77 byte
dengan matematika Menyelesaikan
Mathematica, 117 byte
paksaan
sumber
Area@SSSTriangle[a,b,c]
juga.Sebenarnya , 22 byte
Cobalah online!
Penjelasan:
sumber
Casio Basic, 123 byte
Solusi brute force standar. 122 byte untuk kode, 1 byte untuk ditentukan
n
sebagai parameter.sumber
Bahasa Wolfram (Mathematica) , 59 byte
Cobalah online!
sumber