Tantangan
Tantangannya adalah untuk menulis sebuah program yang mengambil koefisien dari setiap persamaan polinomial n-derajat sebagai input dan mengembalikan nilai integral x yang menjadi dasar persamaan tersebut. Koefisien akan diberikan sebagai input dalam urutan penurunan atau peningkatan daya. Anda dapat menganggap semua koefisien sebagai bilangan bulat .
Masukan dan keluaran
Input akan menjadi koefisien persamaan dalam mengurangi atau meningkatkan urutan daya. Tingkat persamaan, yaitu, daya maksimum x, selalu 1 kurang dari jumlah total elemen dalam input.
Sebagai contoh:
[1,2,3,4,5] -> represents x^4 + 2x^3 + 3x^2 + 4x + 5 = 0 (degree = 4, as there are 5 elements)
[4,0,0,3] -> represents 4x^3 + 3 = 0 (degree = 3, as there are 3+1 = 4 elements)
Output Anda harus hanya nilai integral x yang memenuhi persamaan yang diberikan. Semua koefisien input adalah bilangan bulat dan polinomial input tidak akan menjadi nol polinomial . Jika tidak ada solusi untuk persamaan yang diberikan, maka outputnya tidak ditentukan.
Jika sebuah persamaan memiliki akar berulang, tampilkan akar tertentu hanya sekali. Anda dapat menampilkan nilai dalam urutan apa pun. Juga, asumsikan bahwa input akan mengandung setidaknya 2 angka.
Contohnya
[1,5,6] -> (-3,-2)
[10,-42,8] -> (4)
[1,-2,0] -> (0,2)
[1, 1, -39, -121, -10, 168] -> (-4, -3, -2, 1, 7)
[1, 0, -13, 0, 36] -> (-3, -2, 2, 3)
[1,-5] -> (5)
[1,2,3] -> -
Perhatikan bahwa persamaan dalam contoh kedua juga memiliki root 0,2, tetapi tidak ditampilkan karena 0,2 bukan bilangan bulat.
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek (dalam byte) menang!
Jawaban:
MATL ,
1312 byteCobalah online!
Ini menggunakan fakta bahwa, untuk koefisien bilangan bulat, nilai absolut dari akar apa pun benar-benar kurang dari jumlah nilai absolut dari koefisien.
Penjelasan
Pertimbangkan input
[1 5 6]
sebagai contoh.sumber
X>t_w&:GyZQ~)
, tapi masih 13 byteSekam ,
109 byte-1 byte terima kasih kepada Zgarb
Cobalah online!
Penjelasan
sumber
ṁṡ
daripadaoṡ►a
menduplikat nanti.Haskell , 54 byte
Cobalah online!
Divisi kasar dan sintetis.
Tidak tergabung dengan UniHaskell dan
-XUnicodeSyntax
Solusi alternatif, 44 byte
Penghargaan untuk nimi.
Selamat mencoba dengan online , karena ini memeriksa setiap nomor dalam
Int
rentang.sumber
i
atas[minBound..]
dan drop seluruht
hal. Panggilf
denganInt
daftar eksplisit , misf [1::Int,5,6]
. Tentu saja ini tidak selesai dalam waktu yang wajar.Bounded
tipe berhenti dimaxBound
, misprint [minBound::Bool ..]
.Python 2 + numpy,
959391103939182 byte-2 byte terima kasih kepada Ov
terima kasih Luis Mendo untuk batas atas / bawah dari akar
-10 byte terima kasih kepada Tn. Xcoder
Cobalah online!
sumber
numpy.polyval
menghemat beberapa byteBahasa Wolfram (Mathematica) ,
5047422527 byteCobalah online!
Pembaruan: menggunakan fakta Luis Mendo, bermain golf 3 byte lagi
Menjadi lebih sembrono dengan batasan, kita dapat mengurangi 5 byte ini lebih per @tidak saran pohon:
Setelah memposting ini, OP berkomentar memungkinkan "polinomial asli", jadi inilah solusi 25 byte yang menerima polinomial sebagai input. Ini berfungsi karena secara default Mathematica faktor polinomial atas bilangan bulat, dan setiap akar rasional muncul dalam bentuk seperti
m*x+b
yang gagal cocok dengan pola.Seperti @alephalpha tunjukkan ini akan gagal untuk kasus di mana nol adalah root, jadi untuk memperbaikinya kita bisa menggunakan
Optional
simbol:
Ini mem-parsing baik-baik saja Mathematica 11.0.1 tetapi gagal dan membutuhkan set kurung tambahan sekitar
b_:0
dalam versi 11.2. Ini membutuhkan waktu hingga 27 byte, ditambah dua lagi setelah versi 11.0.1. Sepertinya "perbaikan" dimasukkan ke siniCobalah secara Online!
sumber
#.#
bukanTr@Abs@#
: itu adalah batas yang lebih buruk tetapi lebih sedikit byte.Bahasa Wolfram (Mathematica) ,
332631 byteMemperbaiki kesalahan yang dicatat oleh Kelly Lowder di komentar.
Cobalah online!
Solusi yang salah sebelumnya:
Saya hanya memperhatikan bahwa tanpa solusi integer, output tidak terdefinisi daripada daftar kosong; yang memungkinkan untuk menghapus beberapa byte.
Cobalah online!
Sekarang jika tidak ada solusi integer, fungsi kembali
x
.Sebelumnya:
Cobalah online!
sumber
Union
memperbaikinya.Solve
: daftar variabel dapat dihilangkan.R ,
6159 byteTerima kasih khusus kepada @mathmandan karena menunjukkan pendekatan saya (yang salah) dapat diselamatkan, dan bermain golf !
Cobalah online!
Mengambil input sebagai daftar koefisien dalam urutan meningkat , yaitu,
c(-1,0,1)
mewakili-1+0x+1x^2
.Menggunakan teorema root rasional, pendekatan berikut ini hampir berhasil, untuk 47 byte:
Cobalah online!
-p:p
menghasilkan berbagai simetris (dengan peringatan) hanya menggunakan elemen pertama darip
,a_0
. Dengan Teorema Akar Rasional , semua akar rasionalP
harus dari bentuk dip/q
manap
membagia_0
danq
membagia_n
(plus atau minus). Oleh karena itu, dengan hanya menggunakana_0
cukup untuk|a_0|>0
, seperti untukq
,|p/q|<=a_0
. Namun, ketikaa_0==0
, saat itu pun bilangan bulat terbagi0
, dan dengan demikian ini gagal.Namun, mathmandan menunjukkan bahwa sebenarnya, dalam hal ini, ini berarti bahwa ada faktor konstan
x^k
yang dapat diperhitungkan, dan, dengan asumsik
maksimal, kita melihat bahwaKami kemudian menerapkan Teorema Rasional Akar untuk
Q(x)
, dan sepertia_k
yang dijamin bukan nol dengan maksimalnyak
,a_k
memberikan ikatan rapi untuk akar bilangan bulatQ
, dan akarP
adalah akarQ
bersama dengan nol, jadi kami akan memiliki semua bilangan bulat akarP
dengan menerapkan metode ini.Ini sama dengan menemukan koefisien bukan nol pertama dari polinomial,
t=p[!!p][1]
dan menggunakannya sebagai pengganti naifp[1]
sebagai batas. Selain itu, karena rentang-t:t
selalu berisi nol, menerapkanP
ke rentang ini akan tetap memberi kita nol sebagai root, jika memang itu.ungolfed:
sumber
max
nilai absolut alih-alihsum
; ini tidak akan mengubah jumlah byte, tetapi seharusnya meningkatkan kinerja.) Bagaimanapun, ya, kasihan versi yang lebih pendek tidak bekerja dengan baika_0==0
. Apakah ada cara singkat dalam R untuk mencari koefisien bukan nol pertama (dengan kekuatan naik), dan menggunakannya sebagai gantinya? Ini akan sesuai dengan anjak sebanyak mungkin x pertama (tentu saja, maka Anda harus ingat untuk output0
juga, yang mungkin akan menelan biaya beberapa byte.)max
akan lebih efisien, tetapi untuk poin kedua Anda, karena saya tidak perlu khawatir tentang keluaran0
karena dihasilkan oleh kisaran-t:t
(di manat
adalah koefisien bukan nol pertama), menghemat 2 byte!Jelly , 8 byte
Cobalah online! atau sebagai test-suite!
Bagaimana?
Didasarkan atas jawaban Luis . Alternatif .
sumber
Ær+.Ḟ
?[1,2,3]
.[10,-42,8]
, kan?Oktaf ,
5949 byteCobalah online!
Ini adalah port jawaban R saya . Satu-satunya perbedaan adalah bahwa saya harus secara eksplisit menggunakan
sign(t)
danend
menghasilkan kisaran, danpolyval
harus menghitung polinomial.Mengambil input sebagai vektor baris koefisien dalam urutan menurun.
sumber
Pari / GP , 31 byte
Faktor polinomial, dan pilih faktor-faktor yang turunannya adalah 1.
Cobalah online!
sumber
C (gcc) ,
127126123 bytel+~j++
untukl-++j
.Cobalah online!
Penjelasan
C (gcc) , 517 byte
Cobalah online!
sumber
l+~j++
dapatl-++j
Java 8,
141140 byteTerinspirasi oleh @Rod 's Python 2 answer (versi 82 byte-nya) .
Tantangan yang menyenangkan! Saya tentu belajar banyak dari itu ketika menyelidiki tentang polinomial dan melihat bagaimana beberapa orang lain di sini melakukannya.
Penjelasan:
Cobalah online.
sumber
Oktaf dengan Paket Simbolik, 63 byte
Cobalah online!
sumber
05AB1E , 8 byte
Cobalah online!
sumber
JavaScript (ES6), 97 byte
Mengambil koefisien dalam mengurangi urutan daya dan output menghasilkan urutan menurun.
sumber
Bersih ,
11091 byteCobalah online!
sumber
Python 2 , 89 byte
Cobalah online!
sumber