Masalah
Saya punya program baru HEBAT yang akan mengubah cara kita berpikir tentang matematika dalam komputasi, mengambil serangkaian fungsi aljabar dan melakukan hal-hal LUAR BIASA bersama mereka! Satu-satunya masalah, adalah bahwa saya hanya dapat menguraikan aljabar tertentu, jika tidak alam semesta terlipat menjadi dirinya sendiri, yang buruk. Untungnya, saya hanya perlu beberapa operasi dasar dalam input program baru yang menakjubkan ini, tetapi saya masih membutuhkannya diperluas!
Aturan
Sebuah jawaban harus dapat menyederhanakan ungkapan berikut
2+2
harus dikurangi menjadi4
(5+x)+6
harus dikurangi menjadix+11
(x+2)^2
harus dikurangi menjadix^2+4*x+4
(x-5)*(3+7*x)
harus dikurangi menjadi7*x^2-32*x-15
5*x+9*x
harus dikurangi menjadi14*x
(2*x^2)*x^3
harus dikurangi menjadi2*x^5
Jawaban harus sepenuhnya dapat menghapus tanda kurung, yang menyiratkan bahwa semua distribusi harus dilakukan.
Jawaban harus dapat menangani semua operator dan token standar berikut:
+
(Fungsi tambahan)-
(Fungsi pengurangan)*
(Fungsi multiplikasi)(
(Tanda kurung kiri, digunakan untuk menunjukkan grup))
(Tanda kurung kanan, digunakan untuk menunjukkan akhir dari grup yang dimulai terakhir)x
(Variabel standar)[0-9]+
(angka non negatif asli)
Jawaban harus mampu setidaknya mengkuadratkan, menggunakan notasi expr ^ 2, termasuk (expr) ^ 2 secara rekursif, karena (expr) sendiri merupakan ekspresi;)
Suatu solusi harus dalam notasi infix standar, tidak ada yang omong kosong RPN!
Tidak ada fungsi perpustakaan seperti Mathematica
Simplify
untuk melakukan ini untuk Anda.Solusi harus merupakan fungsi yang mengambil argumen tunggal dan mengembalikan versi yang diperluas
Karena ini adalah kode-golf, jawaban dengan pukulan paling sedikit (kunci) menang, 1 minggu dari OP.
Catatan
Tidak ada ruang di dunia matematika ini, tentu saja! Hanya tanda kurung.
Jadi tidak ada divisi yang diperlukan untuk menyelamatkan dari anjak piutang
Pesanan operasi standar berlaku.
Saya sadar bahwa sebagian dari apa yang saya minta adalah penyederhanaan (misalnya 2+2=4
) di mana bagian lain sebenarnya sebaliknya, seperti memperluas (x+1)^2
untuk menjadi x^2+2x+1
. Ini disengaja. :)
-25 guratan untuk solusi yang dapat melakukan (expr) ^ n bukan hanya (expr) ^ 2
-15 guratan untuk solusi yang dapat mengevaluasi perkalian disandingkan, seperti 4x+5x
== 9x
, atau 4(x+1)
=4x+4
-5 guratan untuk solusi yang dapat menangani banyak variabel (variabel yang tepat satu karakter alfabet huruf kecil)
-5 guratan untuk solusi yang dapat menghilangkan 0's terkemuka ( 007
hanya 7
[Tidak hari ini, Bond!] [Ya ampun sekarang aku merasa seperti sedang menulis Lisp])
Jawaban:
J - 350 char - 25 = 325 poin
Maafkan aku, Roger Hui, karena aku telah berdosa.
Monstrositas di atas mendefinisikan sejumlah variabel, di mana variabel tersebut
f
adalah fungsi yang memenuhi kendala dalam pertanyaan di atas. Saya mengklaim bonus "expr ^ n" untuk 25 poin.Inilah golf yang sedang beraksi di J REPL.
Inilah inti dari apa yang terjadi.
'()'...@([-.~;@]<@(p^:(1<#));.1~1,0=2*/\[:+/\(*0,}:@)1 _1 0{~i.)&;:
- Secara rekursif memecah ekspresi berdasarkan pada subekspresi yang di-kurung, dan mengevaluasinya (...
bit, untuk dijelaskan di bawah) saat mereka siap.;:
melakukan tokenizing.(([^:(''-:])". ::])&.>)
- Evaluasi atom. Jika atom numerik, itu berubah menjadi angka skalar. Jika atom adalah operator, dibiarkan apa adanya. Jika atom adalah variabelx
, itu berubah menjadi vektor0 1
. (Itu sebabnya kami mendefinisikanx=:0 1
di awal.) Secara umum kami menyimpan polinomiala*x^n + b*x^(n-1) + ... + c*x + d
sebagain+1
daftar -itemd c ... b a
.e=:2 :'(<@; ::({:u/&.>{.)/.~i.@#([->+>:){.@i.&(<,v))^:_'
- Konjungsi yang aneh ini membutuhkan kata kerja di sebelah kiri dan karakter di sebelah kanan. Ia menemukan instance pertama dari karakter itu dalam tokenized, paren-less input, dan mengevaluasinya dengan argumen di sekitarnya, dan mengulangi sampai tidak ada lagi karakter yang ditemukan. Dengan demikian, kami secara iteratif menyederhanakan ekspresi, dengan urutan operasi dikendalikan oleh urutan aplikasie
.rplc
adalah fungsi perpustakaan standar untuk penggantian substring. Kami dapat menyimpan tiga karakter lagi jika diizinkan menempatkan istilah tingkat terendah terlebih dahulu, bukan yang tertinggi, dengan menghapus@|.
.Jujur saya tidak yakin apakah saya bisa memeras lebih banyak karakter dari golf ini. Saya tidak bisa memikirkan pendekatan lain yang tidak membutuhkan jumlah overengineering yang serupa, tetapi itu tidak berarti tidak ada satu pun. Either way, saya cukup yakin saya sudah memeras semua karakter yang jelas dari versi ini.
sumber
-
token hanya dicatat sebagai fungsi pengurangan. :)(2*x+3)^(2+3)*2^3
harus memberi256x^5+1920x^4+5760x^3+8640x^2+6480x+1944
atau saya kehilangan sesuatu?JavaScript (EcmaScript 6) 698 (748-50 bonus)
725 780 1951Untuk golf. Tapi saya bangga itu berhasil.(Sunting: perbaikan bug, masalah dengan tanda kurung dan minus)
(Sunting2: golf lebih, diperbaiki bug dalam output)
(Sunting3: golf sekali lagi, terakhir kali saya berjanji)
Komentar
Pada dasarnya, fungsi X adalah kalkulator infiks yang beroperasi pada polinomial literal.
Setiap polinomial disimpan sebagai objek js, kuncinya adalah istilah (x ^ 3y ^ 2) dan nilainya adalah koefisien numerik. Fungsi A, M dan E adalah menambah, mengalikan dan eksponen.
Kode Golf
(Mungkin tidak bisa golf lagi ...) Catatan: tidak termasuk baris baru ditambahkan untuk keterbacaan (ehm ...)
Tes di konsol FireFox
Keluaran
Bonus
Kode Tidak Terkunci
sumber
for(i1,i2,i3; c1,c2; s1,s2,s3)
. Saya baru saja titik koma di colde golf untuk menutup pernyataan di dalam untuk (fungsi O). Kenapa koma? dua benang sari harus dikelompokkan dengan {} sementara dua atau lebih ekspresi dapat didaftar secara sederhana.Mathematica: 56 - 25 - 15 - 5 - 5 = 6
Tentu saja tidak ada fungsi perpustakaan sebagai
Expand
atauDistribute
, hanya penggantian pola. Mathematica melakukan hampir segalanya untuk kita (hax!), Yang tersisa hanyalah aturan untuk distribusi dan perluasan daya. Oleh karena itu, satu-satunya contoh non-sepele adalah(x-5)*(3+7*x)
dan(x+2)^2
.Contohnya
sumber