Tugas Anda adalah mengambil dua ekspresi polinomial integer variabel tunggal dan melipatgandakannya menjadi ekspansi kiri-ke-kanan utama-jangka-pertama yang tidak disederhanakan (AKA FOIL dalam kasus binomial). Jangan menggabungkan istilah suka atau menyusun ulang hasilnya. Untuk lebih eksplisit tentang ekspansi, gandakan istilah pertama dalam ekspresi pertama dengan setiap istilah dalam urutan kedua, secara berurutan, dan lanjutkan dalam ekspresi pertama hingga semua istilah dikalikan dengan semua istilah lainnya. Ekspresi akan diberikan dalam varian LaTeX yang disederhanakan.
Setiap ekspresi akan menjadi urutan istilah yang dipisahkan oleh +
(dengan tepat satu ruang di setiap sisi) Setiap istilah akan sesuai dengan ekspresi reguler berikut: (notasi PCRE)
-?\d+x\^\d+
Dalam bahasa Inggris yang sederhana, istilah ini adalah opsional memimpin -
diikuti oleh satu atau lebih digit diikuti oleh x
dan kekuatan bilangan bulat negatif (dengan ^
)
Contoh ekspresi penuh:
6x^3 + 1337x^2 + -4x^1 + 2x^0
Ketika dicolokkan ke LaTeX, Anda mendapatkan
Outputnya juga harus sesuai dengan format ini.
Karena tanda kurung tidak mengelilingi eksponen dalam format ini, LaTeX sebenarnya akan membuat eksponen multi-digit secara tidak benar. (mis. 4x^3 + -2x^14 + 54x^28 + -4x^5
merender sebagai ) Anda tidak perlu memperhitungkan hal ini dan Anda tidak boleh memasukkan tanda kurung ke dalam output Anda.
Contoh Kasus Uji
5x^4
3x^23
15x^27
6x^2 + 7x^1 + -2x^0
1x^2 + -2x^3
6x^4 + -12x^5 + 7x^3 + -14x^4 + -2x^2 + 4x^3
3x^1 + 5x^2 + 2x^4 + 3x^0
3x^0
9x^1 + 15x^2 + 6x^4 + 9x^0
4x^3 + -2x^14 + 54x^28 + -4x^5
-0x^7
0x^10 + 0x^21 + 0x^35 + 0x^12
4x^3 + -2x^4 + 0x^255 + -4x^5
-3x^4 + 2x^2
-12x^7 + 8x^5 + 6x^8 + -4x^6 + 0x^259 + 0x^257 + 12x^9 + -8x^7
Aturan dan Asumsi
- Anda dapat berasumsi bahwa semua input sesuai dengan format yang tepat ini. Perilaku untuk format lain tidak ditentukan untuk tujuan tantangan ini.
- Perlu dicatat bahwa setiap metode pengambilan dalam dua polinomial adalah valid, asalkan keduanya dibaca sebagai string yang sesuai dengan format di atas.
- Urutan polinomial penting karena urutan yang diharapkan dari ekspansi produk.
- Anda harus mendukung koefisien input antara dan dan memasukkan eksponen hingga .
- Koefisien keluaran antara dan dan eksponen hingga harus didukung.
- Anda dapat menganggap setiap input polinomial mengandung tidak lebih dari 16 istilah
- Karena itu, Anda harus (minimal) mendukung hingga 256 syarat dalam output
- Persyaratan dengan nol koefisien harus dibiarkan apa adanya, dengan eksponen digabungkan dengan benar
- Nol negatif diizinkan dalam input, tetapi tidak dapat dibedakan dari nol positif secara semantik. Selalu menghasilkan nol positif. Jangan hilangkan istilah nol.
Selamat Golf! Semoga berhasil!
Jawaban:
R ,
159153148 byteCobalah online!
Saya benar-benar ingin menggunakannya
outer
, jadi hampir pasti ada pendekatan yang lebih efisien.sumber
Haskell ,
131122 byteCobalah online!
f
mem-parsing polinomial dari string,!
mengalikan dua dari mereka dan memformat hasilnya.H.PWiz menyimpan 9 byte. Terima kasih!
Tidak disatukan
sumber
Ruby ,
102 10098 byteCobalah online!
Bagaimana?
Langkah pertama: dapatkan semua angka dari kedua polinomial:
scan
mengembalikan angka sebagai array pasangan string. Kemudian, lakukan produk cartesian dari 2 daftar. Sekarang kita memiliki semua angka di mana kita membutuhkannya, tetapi masih dalam urutan yang salah.Contoh: jika kita kalikan
3x^4
dengan-5x^2
, kita mendapatkan angka sebagai[["3","4"],["-5","2"]]
, ide pertama adalah untuk zip dan meratakan daftar ini, dan kemudian memasukkan angka ke dalam ekspresi yang akan dievaluasi sebagai[3*-5, 4+2]
. Sebenarnya, kita tidak perlu menyusun ulang angka, kita bisa melakukannya di dalam ekspresi dengan menggunakan variabel sementara: ekspresi menjadi[3*(z=4,-5),z+2]
.Setelah mengevaluasi ungkapan-ungkapan ini, kita mendapatkan koefisien dan eksponen, kita harus bergabung dengan mereka menggunakan
"x^"
, dan kemudian bergabung dengan mereka semua menggunakan"+"
.sumber
Haskell,
124121 byteCatatan: TIO kurang
Data.Lists
, jadi saya mengimporData.Lists.Split
danData.List
: Coba online!Edit: -3 byte terima kasih kepada @Lynn.
sumber
f!x=map f.splitOn x
dan kemudianz=read!"x^"!"+"
menyimpan byte; untuk baris terakhirdrop 3$do[u,v]<-z a;[p,q]<-z b;" + "++shows(u*p)"x^"++show(v+q)
menghemat dua lagi. 120 byteData.List
bukanData.Lists
, jadi +1 byte.Pyth - 39 byte
Cobalah online .
sumber
JavaScript (Babel Node) , 118 byte
Mengambil input sebagai
(a)(b)
.Cobalah online!
sumber
Python 2 , 193 byte
Cobalah online!
Catatan: Pertama kali melakukan tantangan kode golf, maaf jika upaya ini menyebalkan haha
sumber
re.finditer
mungkin bukan pendekatan terpendekRetina , 110 byte
Cobalah online! Penjelasan:
Awali setiap istilah dalam input pertama dengan
#
, salinan input kedua, dan spasi. Ini berarti bahwa semua istilah dalam salinan input kedua didahului oleh spasi dan tidak ada istilah dari input pertama.Cocokkan semua salinan persyaratan dalam input kedua dan istilah terkait dari input pertama. Gabungkan
-
tanda - tanda, gandakan koefisien, dan tambahkan indeks. Akhirnya, gabungkan semua hasil pergantian dengan string+
.Hapus sembarang pasang
-
dan konversikan-0
ke0
.sumber
SNOBOL4 (CSNOBOL4) ,
192176 byteCobalah online!
sumber
Perl 6 , 114 byte
Cobalah online!
sumber
Python 2 , 130 byte
Cobalah online!
sumber
C # (Visual C # Interactive Compiler) ,
192190 byteSintaks kueri tampaknya satu byte lebih pendek dari sintaks metode.
Cobalah online!
sumber
Jelly , 28 byte
Cobalah online!
Program lengkap. Mengambil dua polinomial sebagai daftar dua string.
Penjelasan (formulir diperluas)
Mengasingkan
)
sama denganµ€
.A tertinggal
”
tersirat dan dapat dihilangkan.Algoritma
Katakanlah kita memiliki input ini:
Prosedur pertama adalah Parsing, diterapkan pada masing-masing dari dua polinomial. Mari kita menangani yang pertama,
"6x^2 + 7x^1 + -2x^0"
:Langkah pertama adalah dengan memisahkan string
'+'
, sehingga memisahkan istilah. Ini menghasilkan:Langkah selanjutnya adalah membagi setiap string dengan
'x'
, untuk memisahkan koefisien dari eksponen. Hasilnya adalah ini:Saat ini, sepertinya ada banyak sampah di string ini, tetapi sampah itu sebenarnya tidak penting. Semua string ini akan dievaluasi sebagai tautan Jelly niladic. Secara sepele, spasi tidak penting, karena mereka tidak berada di antara angka-angka. Jadi kami dapat mengevaluasi di bawah dan masih mendapatkan hasil yang sama:
The0 XOR 2 = 2 . Jelas,0 XOR n = n . Semua eksponen bilangan bulat, jadi kami baik-baik saja. Karenanya, mengevaluasi ini sebagai ganti dari yang di atas tidak akan mengubah hasilnya:
^
s terlihat sedikit lebih mengganggu, tetapi mereka benar-benar tidak melakukan apa-apa baik! Ya,^
adalah atom XOR bitwise, namun rantai niladik bertindak seperti tautan monadik, kecuali bahwa tautan pertama benar-benar menjadi argumen, alih-alih mengambil argumen, jika itu niladik. Jika tidak, maka tautannya akan memiliki argumen0
. Eksponen memiliki^
s sebagai char pertama mereka, dan^
bukan niladic, jadi argumennya dianggap0
. Sisa string, yaitu angka, adalah argumen yang benar dari^
. Jadi, misalnya,^2
adalahKita mulai:
Langkah ini juga akan dikonversi
"-0"
menjadi0
.Karena kita mengurai kedua input, hasil setelah Parsing akan menjadi ini:
Parsing sudah selesai. Prosedur selanjutnya adalah Perkalian.
Kami pertama-tama mengambil produk Cartesian dari dua daftar ini:
Banyak pasangan dibuat, masing-masing dengan satu elemen dari daftar kiri dan satu dari kanan, secara berurutan. Ini juga merupakan urutan output yang diinginkan. Tantangan ini benar-benar meminta kami untuk menerapkan distribusi multiplikatif, karena kami diminta untuk tidak melanjutkan hasilnya setelah itu.
Pasangan dalam setiap pasangan mewakili istilah yang ingin kita gandakan, dengan elemen pertama adalah koefisien dan yang kedua adalah eksponen. Untuk melipatgandakan persyaratan, kami mengalikan koefisien dan menambahkan eksponen bersama-sama (a xcb xd= a b xcxd= a b ( xcxd) = ( A b ) xc + d ). Bagaimana kita melakukannya? Mari kita tangani pasangan kedua
[[6, 2], [-2, 3]]
,.Kami pertama-tama mengubah posisi pasangan:
Kami kemudian mengambil produk dari pasangan pertama, dan jumlah dari yang kedua:
Bagian kode yang relevan
PSƭ€
,, tidak benar-benar mengatur ulang penghitungnya untuk setiap pasangan istilah, tetapi, karena berpasangan, itu tidak perlu.Menangani semua pasangan istilah, kami memiliki:
Di sini, Penggandaan selesai, karena kita tidak harus menggabungkan istilah yang serupa. Prosedur terakhir adalah Prettyfying.
Kami pertama kali bergabung dengan setiap pasangan dengan
"x^"
:Kemudian kami bergabung dengan daftar dengan
" + "
:Perhatikan bagaimana kita masih memiliki angka dalam daftar, jadi itu bukan string. Namun, Jelly memiliki proses yang disebut "pengetatan", berjalan tepat di akhir pelaksanaan program untuk mencetak hasilnya. Untuk daftar kedalaman 1, itu benar-benar hanya mengkonversi setiap elemen ke representasi string dan menyatukan string, jadi kami mendapatkan hasil yang diinginkan:
sumber
JavaScript,
112110 byteSaya menemukan dua alternatif dengan panjang yang sama. Panggil dengan sintaks currying:
f(A)(B)
Tampilkan cuplikan kode
Tampilkan cuplikan kode
-2 byte ( Luis ): Hapus spasi di sekitar
split
pembatas.JavaScript, 112 byte
Menggunakan
String.prototype.matchAll
.Tampilkan cuplikan kode
sumber
split' + ' => split'+'
untuk menyimpan 2 bytejoin
.