pengantar
Manusia adalah spesies yang luar biasa, tetapi kadang-kadang kita bisa canggung untuk memahaminya — terutama untuk komputer. Secara khusus, kami sepertinya suka menulis polinomial dengan cara yang sangat berbelit-belit dengan aturan yang tampaknya arbitrer.
Apa program terpendek yang dapat Anda tulis untuk memformat polinomial dengan benar menggunakan aturan ini?
Tantangan
Memasukkan
Daftar bilangan bulat antara -1000 dan 1000 (inklusif), yang mewakili koefisien polinomial, dengan entri terakhir menjadi koefisien x ^ 0 (konstanta), yang terakhir adalah koefisien x ^ 1, dll.
Keluaran
Sebuah string yang mewakili polinomial ini dalam notasi matematika yang diformat dengan benar dari manusia.
Aturan:
- Tanda pada koefisien memimpin hanya ditampilkan jika negatif.
Right: -x^2+3
Wrong: +x^2+3
- Komponen dengan koefisien 0 tidak dicetak (kecuali untuk kasus sudut di mana semua koefisien 0 *).
Right: x^5-x^2+3
Wrong: x^5+0x^4+0x^3-x^2+0x+3
- Koefisien
-1
dan+1
akan ditampilkan tanpa angka 1, kecuali jika itu adalah konstanta.
Right: x^5-x^2+1
Wrong: 1x^5-1x^2+1
- Eksponen hanya ditampilkan jika lebih besar dari 1 dan variabel hanya ditampilkan jika eksponen lebih besar dari 0.
Right: 3x^3-7x^2+2x+1
Wrong: 3x^3-7x^2+2x^1+1x^0
- * Kasus sudut: walaupun nilai nol biasanya menghasilkan tidak mencetak komponen itu, jika semua koefisien nol maka konstanta 0 harus dicetak.
Right: 0
Wrong: 0x+0
Wrong: (nothing)
- Ini adalah kode-golf sehingga pemenang akan menjadi program dengan byte paling sedikit.
Contoh Input dan Output
Input: Output:
[0] 0
[0,0] 0
[0,-1,35,0] -x^2+35x
[5,1,7,-9] 5x^3+x^2+7x-9
[100,0,0,-1] 100x^3-1
[931,21,-11,1] 931x^3+21x^2-11x+1
Saya berharap dapat melihat solusi Anda. Selamat bersenang-senang!
EDIT:
- Anda dapat mengelilingi operasi berdasarkan spasi jika Anda mau. Jadi
3x+5
dan3x + 5
keduanya baik-baik saja.3x+ 5
dan3x +5
tidak. - Jika Anda ingin menghasilkan karakter eksponen aktual (katakanlah di Tex) yang diizinkan karena lebih dekat dengan cara manusia menulis.
- Koefisien harus muncul tanpa desimal, misalnya
9x^2
benar,9.0x^2
tidak.
sumber
3x^2 + 4
versus3x^2+4
?1x
->x
tidak berubah21x^2
menjadi2x^2
.Jawaban:
Retina 0.8.2 , 56 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Masukkan semua kekuatan
x
, termasukx^1
tetapi tidakx^0
.Hapus semua kekuatan
x
dengan nol koefisien, tetapi bukan trailing0
(belum).Hapus pengganda dari
1
(tetapi bukan konstanta1
).Hapus
^1
darix^1
.Hapus konstanta 0 kecuali hanya itu yang tersisa.
Hapus spasi sebelum a
-
.Ubah spasi yang tersisa menjadi
+
s.sumber
JavaScript (ES6),
107106 byteCobalah online!
Bagaimana?
Output dibangun dengan menerapkan rumus berikut untuk setiap koefisien c dari array input a [] sambil melacak eksponen saat ini e .
Formula 1: tanda tambah
Jika koefisien benar-benar positif dan ini bukan istilah pertama dalam ekspresi output, kami menambahkan a
+
. Kalau tidak, kami tidak menambahkan apa pun.Formula 2: tanda minus dan koefisien
Jika eksponen adalah nol atau nilai absolut dari koefisien tersebut tidak sama dengan 1, kami menambahkan koefisien (yang mungkin termasuk terkemuka
-
). Kalau tidak, kami menambahkan a-
(jika koefisien negatif) atau tidak sama sekali.Formula 3: variabel dan eksponen
Jika eksponennya 0, kita tidak menambahkan apa pun. Jika eksponennya 1, kita tambahkan
x
. Jika tidak, kami menambahkanx^
diikuti oleh eksponen.sumber
Stax , 37 byte
Jalankan dan debug secara online
Ini versi yang belum dibongkar dan tidak disunat.
Jalankan yang ini
sumber
Python 3,
279277258251 byteMengambil input sebagai daftar string. Solusi ini belum sangat golf. Ini pada dasarnya bekerja dengan mengganti hal-hal yang sesuai dengan format output, yang sangat meningkatkan jumlah byte.
Cobalah secara Online!
Terima kasih khusus untuk ovs dan NK1406 .
sumber
if'0'!=i
danif'-1'==i
.Pari / GP , 41 byte
Cobalah online!
Jika
*
antara koefisien dan variabel diizinkan:Pari / GP , 3 byte
Cobalah online!
sumber
APL (Dyalog Classic) ,
114113109107106 byteCobalah online!
-4 byte terima kasih kepada @dzaima!
Ini pasti bisa diturunkan lebih lanjut. Ini membutuhkan
⎕IO←0
sumber
Pip , 78 byte
Mengambil koefisien sebagai argumen baris perintah. Cobalah online!
Menggunakan
ME
(pencacah peta) danJ
(bergabung) untuk menghasilkan sesuatu dari formulir0x^3+-1x^2+35x^1+0x^0
, dan kemudian sekelompok penggantian regex untuk mentransformasikannya ke dalam format yang tepat.sumber
APL (Dyalog Classic) ,
7976 byteCobalah online!
sumber
Python 3,
161162 byteMemperbaiki bug berkat ovs.
Diperluas:
sumber
C # , 237 byte
sumber
Bersih , 172 byte
Cobalah online!
sumber
Bahasa Wolfram / Mathematica, 39 byte
Cobalah online!
Ternyata ada built-in untuk masuk dalam urutan yang benar.
Solusi sebelumnya:
Bahasa Wolfram / Matematika, 93 byte
Setidaknya bagi saya, ini sangat lama untuk bahasa yang dirancang untuk manipulasi matematis. SepertinyaExpand@FromDigits[#,x]&
harus berfungsi, tetapi pemesanan default untuk polinomial adalah kebalikan dari apa yang ditanyakan, jadi beberapa penyelesaian tambahan diperlukan.Penjelasan
sumber
SringReplace
seharusnyaStringReplace
?Python3:
150146 byte(implementasi sebelumnya):
Anda dapat mencobanya secara online
Kudos to: @Benjamin
sumber
f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
Perl 5
-a
, 94 byteCobalah online!
sumber
Retina 0.8.2 , 113 byte
Cobalah online!
Saya yakin ada banyak golf di sini ...
sumber
Haskell ,
166163 byteCobalah online! Contoh penggunaan:
g [0,-1,35,0]
hasil"-x^2+35x"
.Solusi 166 byte sebelumnya, yang sedikit lebih mudah dibaca:
Cobalah online!
sumber
Ruby , 111 byte
Cobalah online!
Memecahkan ini di Ruby ternyata sedikit membuat frustrasi, terutama karena kenyataan bahwa tidak seperti kebanyakan bahasa, di Ruby (hampir) semuanya benar, termasuk 0-s dan string kosong, sehingga bahkan pemeriksaan sederhana untuk nol menjadi tidak ada di dekat sependek
x?
.Saya bermain dengan berbagai metode membangun string, dan akhirnya memilih campuran dari beberapa pendekatan:
+
dan-
tanda-tanda dihasilkan oleh memformat sintaks dengan tanda paksa:%+d
x^i
dipilih menggunakan pengindeksan operator roket[...][i<=>1]
sumber
Sekam ,
44 43 4140 byteCobalah online!
Ini terasa agak kikuk; Sekam tidak dioptimalkan untuk manipulasi string. Saya meminjam beberapa ide dari jawaban Stax .
Penjelasan
sumber
Perl 6 , 97 byte
Cobalah online!
Penjelasan:
$!
melacak eksponen saat ini.Tambahkan
+
sebelum koefisien positif, kecuali jika itu bukan nol pertama. Hubung$_&&
singkat memastikan bahwa variabel keadaan anonim$
hanya bertambah untuk koefisien bukan nol. The&
persimpangan ini runtuh ketika dipaksa untuk Bool dengan?
.Pengurangan
$!
. Koefisien memotong 1 atau -1 kecuali konstan.Istilah linear dan konstanta kasus khusus. Menggunakan
<< >>
konstruk proteksi penawaran adalah satu byte lebih pendek dari yang setara('','x')
atau2>$!??'x'x$!!!'x^'~$!
.Sembunyikan suku nol, tetapi selalu mengevaluasi ekspresi sebelumnya untuk
--$!
efek samping.Kembali
0
jika semua koefisien nol.sumber
Java 8,
202176174173 bytePenjelasan:
Cobalah online.
sumber
a->{String r="";int j=a.length;for(int u:a)r+=u==(j^j--)?"":"+"+u+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
(j^j--)
ke0*j--
.Python, 165 byte
sumber
PHP, 213 Bytes
Argumen baris perintah seperti yang diminta oleh OP (argumen tunggal dengan tanda kurung dan koma).
Cetak cantik dan beberapa penjelasan:
sumber
PowerShell, 295 byte
sumber