Mengevaluasi ekspresi omnifix yang diberikan.
Omnifix seperti notasi infiks matematika normal, tetapi dengan salinan tambahan dari setiap simbol yang mengelilingi argumen. Simbol luar menggantikan kurung, dan karenanya tidak perlu kurung tambahan.
Anda harus mendukung penambahan, pengurangan, perkalian, pembagian, dan bilangan real positif (yang negatif dapat ditulis -0-n-
) dalam rentang yang masuk akal untuk bahasa Anda.
Plus dan minus harus +
dan -
, tetapi Anda dapat menggunakan *
atau ×
untuk kali dan /
atau ÷
untuk membagi. Simbol wajar lainnya akan diizinkan berdasarkan permintaan.
Brownie menunjukkan penjelasan dan fitur tambahan (seperti operasi tambahan, angka negatif, string, dll.) Bahkan jika jawaban Anda tidak memiliki fitur ini, jangan ragu untuk menunjukkan bagaimana mungkin.
Harap berikan tautan untuk menguji solusi Anda jika memungkinkan.
Contohnya
Untuk kejelasan, penjelasan di bawah ini menggunakan minus tinggi ( ¯
) untuk menunjukkan angka negatif. Anda dapat mengembalikan angka negatif menggunakan format apa pun yang masuk akal.
-5-2-
→ 3
+2+×3×2×+
→ 8
( +2+×3×2×+
→ +2+6+
→ 8
)
-14--3-1--
→ 12
( -4--3-1--
→ -14-2-
→ 12
)
+2.1+×3.5×2.2×+
→ 9.8
( +2.1+×3.5×2.2×+
→ +2.1+7.7+
→ 9.8
)
×3×÷-0-6-÷2÷×
→ -9
( ×3×÷-0-6-÷2÷×
→ ×3×÷¯6÷2÷×
→ ×3ׯ3×
→ ¯9
)
÷4÷-3-÷1÷2÷-÷
→ 1.6
( ÷4÷-3-÷1÷2÷-÷
→ ÷4÷-3-0.5-÷
→ ÷4÷2.5÷
→ 1.6
)
The explanations below use high minus (`¯`) to indicate negative numbers.
Anda pasti menyukai APL.-
s dapat dikacaukan dengan-
s sedangkan¯
s tidak dapat dikacaukan dengan-
s.Jawaban:
C # (.NET Core) ,
198 197188 byteCobalah online!
Penggunaan
*
dan/
.Fungsi rekursif. Pertama mencoba mengurai string input sebagai a
float
. Jika gagal, ia menyebut dirinya secara berulang lewat sebagai argumen operan pertama dan kedua dan kemudian melakukan operasi yang dipilih pada hasil.sumber
IndefOf(f, 1)
bisaIndexOf(f,1)
float
s sebagai gantinya, gunakan kode char, ketika Anda memilikinya mungkin dapat mempersingkat dengan>
dan<
di beberapa tempat.i+1,s.Length-i-2
ke++i,s.Length+~i
.Python 3,
159158152144136135132 byteCobalah online!
Tidak mengizinkan angka negatif (meskipun
-0-5-
berfungsi tentu saja) dan memerlukan operator python.sumber
while~-(l[i]in'+-*/'):i+=1;a=1
dan*l,=input()
untuk 152 byteif a:l[i]='(';i=t(t(i+1));l[i-1]=')'
denganreturn-~i
untuk 135 byte: PRetina ,
290287286 byteCobalah online! Catatan: Hanya mampu integer aritmatika, sehingga beberapa kasus uji telah dihapus. Menerima dan mengembalikan angka negatif menggunakan
¯
awalan. Sunting: Disimpan34 byte berkat @Cowsquack. Penjelasan:Saya membutuhkan beberapa cara untuk menangani nol, jadi saya menggunakan
¦
awalan angka positif. Angka-angka tersebut kemudian dikonversi ke unary.Tetapi angka negatif hanya perlu
¯
awalan.Mengutip
+
menjadi jelek, jadi saya mengubah penambahan menjadi pengurangan.Jika nilai absolut dari LHS dari pengurangan kurang dari RHS, alihkan mereka dan meniadakan kedua sisi.
Juga jika LHS dari perkalian atau pembagian adalah negatif, meniadakan kedua belah pihak.
Juga jika LHS dari perkalian adalah nol, maka hasilnya adalah nol. Juga, dua minus menghasilkan nilai tambah.
Tapi minus dan plus (atau sebaliknya) menghasilkan minus.
Kurangi dua angka dari tanda yang sama. Lakukan ini berulang kali hingga tidak ada pengurangan yang tersisa.
Jika masih ada pengurangan, tanda-tandanya harus berbeda, jadi tambahkan jumlahnya. (Tetapi hanya lakukan ini sekali saja, karena ini dapat mengungkapkan pengurangan dua angka dari tanda yang sama lagi.)
Lakukan penggandaan dengan penambahan berulang.
Lakukan pembagian integer. Salah satu langkah di atas akan menyederhanakan ekspresi, jadi putar kembali hingga tidak ada operasi yang tersisa.
Konversi kembali ke desimal.
sumber
+`-(([¯¦])1*)(1*)-\2\3-
,[¯¦]
bisa menjadi¯|¦
([×÷])
;)PHP ,
116114109 byteTerima kasih kepada Martin Ender
Penggunaan
*
untuk perkalian dan/
untuk pembagian. Angka-angka negatif berhasil meskipun saya tidak berusaha keras untuk itu.Cobalah online!
Tidak Dijelaskan dan Dijelaskan
Saya juga akan menjelaskan regex karena agak ajaib:
Pertama, kami ingin mencocokkan salah satu dari empat operator:
*+/-
Kemudian, kita harus mencocokkan nomor
[\d.]+
atau ekspresi omnifix yang valid lainnya(?R)
.Kemudian, kami mencocokkan operator yang sama dengan yang ada di awal.
Lalu kami melakukan hal yang sama yang kami lakukan di grup 3: cocokkan angka atau ekspresi omnifix.
Akhirnya, cocokkan lagi dengan operator awal.
Apa pun yang cocok ini diganti dengan
($2)
. Ini mengambil bagian di dalam operator sekitarnya dan memasukkannya ke dalam tanda kurung, sehingga tampak seperti notasi infiks normal.sumber
QuadR ,
333227 byte-1 terima kasih kepada Sapi Dukun . Terima kasih kepada Erik the Outgolfer .
dengan argumen / bendera
≡
Cobalah online!
Ini setara dengan solusi Dyalog APL 40-byte:
Cobalah online!
Penjelasan
(teks tanda kurung mengacu pada Dyalog APL, bukan QuadR)
(
...){2}\2
pola berikut dua kali, dan seluruh pertandingan dua kali juga:(.)
karakter apapun[
...]+
diikuti oleh satu atau lebih dari set karakter berikut:\d
d igits,¯
dikurangi tinggi (tanda negatif)\.
periode(
⎕R
Adalah R eplaced dengan :)(
{
...}
hasil dari fungsi anonim berikut ini diterapkan ke namespace ⍵ :)⍵M
(⍵.Match
) Teks M atch¯1↓
menjatuhkan karakter terakhir (simbol+
-
×
atau÷
)1↓
menjatuhkan karakter pertama (simbol)⍎
mengeksekusi sebagai kode APL(
⍕
stringify)≡
(⍣≡
) ulangi penggantiannya sampai tidak ada lagi perubahan yang terjadisumber
⍕
⎕R
tidak dapat beroperasi pada data numerik. Terima kasih.Haskell , 132 karakter
(134 byte, karena
×
dan÷
mengambil dua byte di UTF-8)Cobalah online!
f
mem-parsing sebanyak mungkin input dan menghasilkan hasilnya serta string yang tersisa (yang kosong dalam kasus uji). Jika itu tidak sesuai aturan, lucuti string sisa yang tidak dapat dihapusHaskell , 139 karakter
sumber
Perl,
6453 byteTermasuk
+1
untuk-p
Secara tidak sengaja juga mengimplementasikan
,
(membuang argumen pertama) dan kadang-kadang.
(menambahkan argumen bersama)..
tidak berfungsi dengan sangat andal karena mengganggu titik desimal baik pada level parsing maupun pada level evaluasisumber
Java 8,
205200 bytePort jawaban C # dari @Charlie .
-5 byte terima kasih kepada @ceilingcat .
Cobalah online.
sumber