Anda diberi string yang disusun dengan karakter 0123456789+*()
. Anda dapat mengasumsikan bahwa string selalu merupakan ekspresi matematika yang valid.
Tugas Anda adalah menghapus tanda kurung yang tidak perlu, dengan anggapan multiplikasi memiliki prioritas lebih tinggi daripada penambahan.
Tanda kurung harus dihapus hanya ketika mereka tidak diperlukan secara struktural :
- karena penggandaan prioritas lebih tinggi:
3+(4*5)
=>3+4*5
- karena multiplikasi atau penambahan asosiatif:
3*(4*5)
=>3*4*5
- ketika mereka redundan di sekitar ekspresi:
3*((4+5))
=>3*(4+5)
Kurung harus disimpan ketika dapat disederhanakan karena nilai angka tertentu:
1*(2+3)
seharusnya tidak disederhanakan1*2+3
0*(1+0)
seharusnya tidak disederhanakan0*1+0
Contoh:
(4*12)+11 ==> 4*12+11
(1+2)*3 ==> (1+2)*3
3*(4*5) ==> 3*4*5
((((523)))) ==> 523
(1+1) ==> 1+1
1*(2*(3+4)*5)*6 ==> 1*2*(3+4)*5*6
1*(2+3) ==> 1*(2+3)
0*(1+0) ==> 0*(1+0)
(((2+92+82)*46*70*(24*62)+(94+25))+6) ==> (2+92+82)*46*70*24*62+94+25+6
1*(2*(3+4)*5)*6
harus menjadi testcase yang menarik (yang saat ini gagal untuk solusi saya).(2+2)*1
Jawaban:
Mathematica,
1059791 byte-6 byte terima kasih kepada Roman !
Mengganti
+
dan*
dengan~~
(StringExpression
) dan**
(NonCommutativeMultiply
) masing-masing, mengevaluasinya, mengencangkannya, dan mengganti kembali operator.sumber
StringExpression
alih-alihDot
, dan menghapus" "->""
klausa:a=StringReplace;ToString@ToExpression@a[#,{"*"->"**","+"->"~~"}]~a~{" ** "->"*","~~"->"+"}&
JavaScript (ES6) 163
178Edit 15 byte yang disimpan thx @IsmaelMiguel
Kurang golf
Uji
sumber
y.indexOf('+')
alih-alihy.indexOf`+`[...]
? ([...] ditambahkan untuk menghindari pemformatan) Apakah itu mengganggu dengan cara itu?a=>eval(`for(b=s=[]${_=';a!=b;a=b.replace(/'}\\(([^()]*)\\)(?=(.?))/,(x,y,z,p)=>~y.indexOf('+')<0?-s.push(b[p-1]=='*'|z=='*'?x:y):y))b=a;for(b=0${_}-\\d+/,x=>s[~x]))b=a`)
for(b=
,=='*'
dan bit berulang lainnya. Juga, tidak~y.indexOf('+')<0
sama dengan~y.indexOf('+')
? Karena satu-satunya nilai yangindexOf()
mengembalikan yang mengevaluasi ke nilai falsy adalah-1
,<0
nampaknya berlebihan. Atau, jika saya salah, Anda bisa melakukannyay.indexOf('+')>1
<0
ini omong kosong yang tersisa dari versi yang tidak diserang dan harus dihapus. 2: berpikir lagi,for
dapat direvisi untuk dimasukkan dalam bagian yang diulang. Terima kasih lagiImplementasi Python3 + PEG dalam Python , 271 byte
Beberapa waktu yang lalu saya membuat implementasi PEG dengan Python . Saya kira saya bisa menggunakannya di sini.
Mengurai ekspresi menjadi pohon, dan hanya menyimpan tanda kurung jika anak adalah tambahan, dan orang tua adalah perkalian.
sumber
Perl, 132 byte
129 sumber byte + 3 untuk
-p
bendera:Menggunakan:
sumber
Rubi,
140130 byteSumber 127 byte + 3 untuk
-p
bendera:Dan ungolfed:
sumber
0 while
sintaks?expr while cond
setara denganwhile cond; expr; end
. Di sini, saya hanya ingin melakukancond
berulang kali dan tidak benar-benar memiliki loop body. Biasanya orang akan menulis ini sebagaiwhile cond; end
atau mungkinloop{ break unless cond }
tetapi0 while cond
byte lebih sedikit. Mereka0
tidak melakukan apa-apa; itu hanya ada di sana karena bentuk pendek dari loop sementara membutuhkan tubuh.Retina, 155 byte
Cobalah online!
Verifikasi semua testcans sekaligus.
Penjelasan
Yang utama adalah kode ini:
Regex ini dapat cocok dengan string apa pun di mana tanda kurung seimbang, misalnya
1+(2+(3))+4
atau2+3
.Untuk memudahkan penjelasan, biarkan regex ini
B
.Juga, mari kita gunakan
<
dan>
bukan untuk kurung, sertap
danm
untuk\+
dan\*
.Kode tersebut menjadi:
Dua baris pertama cocok untuk tanda kurung yang hanya terdiri dari perkalian, misalnya
(1*2*3)
atau genap(1*(2+3)*4)
. Mereka digantikan oleh konten mereka di dalam.Dua baris terakhir cocok untuk tanda kurung yang tidak didahului dan yang tidak diikuti oleh perkalian. Mereka digantikan oleh konten mereka di dalam.
Awal
{`
berarti "ganti sampai idempoten", yang berarti bahwa penggantian dilakukan sampai mereka tidak lagi cocok atau mereka diganti dengan diri mereka sendiri.Dalam hal ini, penggantian dilakukan hingga tidak cocok lagi.
sumber
1*(2*(3+4)*5)*6
.(1*(2+3)+4)*5
Python 3,
274269359337336 byteMetode ini pada dasarnya menghapus setiap pasangan kurung dan memeriksa untuk melihat apakah masih mengevaluasi sama.
Uji Harness
Pembaruan
re
libl
) lambdasumber
1*(2+3)
, karena OP mengatakan untuk tidak menyederhanakan kasus nomor khusus. Jawaban yang bagus; ini memiliki saya upvote.PHP, 358 byte
Bukan panjang yang mengesankan, itulah yang saya dapatkan untuk mengambil pendekatan yang kurang optimal (dan menggunakan bahasa yang kurang optimal).
Lepaskan sepasang tanda kurung, lalu hasilkan ekspresi yang dihasilkan. Jika hasilnya sama dengan aslinya, ia menambahkannya ke peta ekspresi dan pengulangan yang valid sampai tidak ada ekspresi baru yang ditemukan. Kemudian cetak ekspresi valid terpendek.
Terobosan ketika hasil dari ekspresi menjadi besar dan dilemparkan ke notasi eksponen ganda muncul.
sumber
Prolog (SWI) ,
122118 byteCobalah online!
Mendefinisikan predikat
//2
yang menghilangkan tanda kurung dari nilai string argumen pertama dan menghasilkan string melalui argumen kedua. Jika input bisa dalam istilah Prolog, ini hanya akan menjadi8177 byte yang ditentukan+/2
tanpa harus berurusan dengan verboseterm_string/2
, tetapi banyak tanda kurung yang tidak perlu sama sekali tidak ada untuk memulai dengan cara itu sehingga akan cukup dekat dengan kecurangan, karena semua yang+/2
dilakukan adalah menangani asosiatif.Saya mencoba menggunakan
=../2
untuk semua itu, tetapi keluar jauh lebih lama, karena operator tiga byte yang bekerja dengan daftar tidak persis singkat:Prolog (SWI) , 124 byte
Cobalah online!
sumber