Dua Simbol Matematika

8

pengantar

Empat operator matematika dasar (+, -, *, /) dapat dikurangi menjadi hanya dua, karena fakta bahwa:

x + y = x - (-y)
x * y = x / (1/y), y != 0
x * 0 = 0/x

Tantangan

Tantangannya adalah mengambil input sebagai "string" yang mengandung:

  • Angka
  • Variabel karakter tunggal ("x", "y")
  • Empat operator matematika dasar (+, -, *, /)
  • Kurung

dan output string yang dimanipulasi sehingga akan menghasilkan hasil matematika yang sama dengan input, tetapi hanya berisi simbol matematika '-' dan '/'

Spesifik

  • Input dapat dalam bentuk apa pun yang dapat diterima (file, STDIN, dll.) Dan dapat direpresentasikan sebagai string atau array karakter (tetapi bukan array array)
  • Output dapat dalam bentuk apa pun yang dapat diterima (file, STDIN, dll.) Dan dapat direpresentasikan sebagai string atau array karakter (tetapi bukan array array)
  • Anda harus mengenali dan mempertahankan tanda kurung yang seimbang
  • Celah standar tidak diijinkan
  • Ini adalah pilihan Anda jika Anda ingin mewakili x + ysebagai x - -yataux - (-y)
  • Anda harus menjaga urutan operasi
  • Anda tidak pernah harus menangani input yang tidak valid
  • Input dapat kosong atau satu nomor / variabel, dalam hal ini program harus menampilkan input
  • Catatan: Anda tidak harus menggunakan substitusi dalam pendahuluan, asalkan input = output, program Anda bisa berubah 2 * 2menjadi 8/2, jika Anda mau
  • Anda dapat berasumsi bahwa "0" adalah satu-satunya cara nol akan muncul dalam persamaan (Yaitu Anda tidak harus menangani 1 * (4 - 4))
  • Saran: untuk menguji program Anda, buka jenis situs web iniinput = output , di mana input adalah input, dan output adalah output, dan jika hasilnya "benar", program Anda berhasil menangani case tersebut ( contoh , contoh )

Uji Kasus

Di bawah ini adalah beberapa kasus uji, input sebagai string tunggal dan output sebagai string tunggal.

x + y
x - (-y)

x * y
x / (1/y)

x / y
x / y

x - y
x - y

1
1

5
5

-6
-6

+x
x

1 + (x * 4) - (512 * 3)
1 - (-(x / (1/4))) - (512 / (1/3))

1 - 3 / 4 + l / g
1 - 3/4 - (-(l / g))

5 * 0 / 2
0/5 / 2

(a + g) * 0
0/(a - (-g))

Mencetak gol

Ini , jadi jawaban tersingkat dalam byte menang. Ikatan diselesaikan dengan posting pertama.

Phoenix Sokrates
sumber
2
Omong-omong x / 1/y= x/ykarena pembagian tidak asosiatif. Saya tahu apa yang Anda pikirkan, tetapi bahkan WolframAlpha tidak mengakui bahwa Anda ingin ruang untuk mengubah urutan operasi .... jadi Anda mungkin harus memikirkan kembali ini atau tidak mengutipnya sebagai cara yang valid untuk memeriksa sesuatu.
Linus
1
@Linus: Ini juga tidak setara kapan y=0, tapi saya menduga tantangan secara implisit mengasumsikan itu n/d => d != 0.
Tim Čas
@ TimČas ahh! Tidak memikirkan itu. Saya akan memperbarui tantangan, hanya tahu itu harus ditangani dengan benar
Socratic Phoenix
Seperti berdiri, ada sangat sedikit yang menghentikan kita dari hanya mengevaluasi ekspresi dan mengembalikan hasilnya (mereka secara matematis sama, setelah semua). Saya akan merekomendasikan mengubah itu, kecuali jika Anda ingin vmenjadi solusi yang tepat di Pyth.
Steven H.
Tunggu, jadi jika ada variabel (seperti x dan y), bagaimana kita bisa membagi tanpa mengambil risiko pembagian dengan nol? 5 * (a - b)jika a = b. Dan apakah kita harus mendeteksi hal-hal seperti 5 * (a - a)? Bagaimana 5 * (4 - 4)dan 5 * (a / a - 1)atau 5 * (4 / 4 - 1)?
Adám

Jawaban:

4

Python 3, 267 byte

Terima kasih kepada @ ConorO'Brien

import re
q=re.sub
g=lambda m:'--'+m.group()[1:]
h=lambda m:'/(1/'+m.group()[1:]+')'
i=lambda m:'0/'+m.group()[:-2]
print(q(r'\*[^\(\)]+',h,q(r'[^\(\)]\*0',i,q(r'\+[^\(\)]+',g,q(r'\*\([^\)]+\)',h,q(r'\([^\)]+\)\*0',i,q(r'\+\([^\)]+\)',g,input().replace(' ',''))))))))

Ide itu!

Peluruhan Beta
sumber
Jujur, saya tidak tahu sihir gelap apa yang telah Anda pakai, tetapi +1 untuk FGITW
Socratic Phoenix
@SocraticPhoenix Haha, ilmu hitam disebut regex;)
Beta Decay
1

Dyalog APL , 42 byte

Ini mempertahankan urutan operasi APL. Perhatikan bahwa ÷xadalah1÷x

'\+' '×'R'--' '÷÷'('(.*)×0'R'0÷\1'~∘' ')

TryAPL online!

( pada hasil ...

~∘' ' hapus spasi

'(.*)×0'⎕R'0÷\1' ganti apa pun yang diikuti oleh "× 0" dengan "0 ÷" diikuti olehnya

) evaluasi...

'\+' '×'⎕R'--' '÷÷' ganti "+" dengan "-" dan "×" dengan "÷÷"

Untuk memverifikasi:

  1. Menetapkan random non-nol angka untuk x, y, l, g, dan a.

  2. Jalankan ekspresi asli.

  3. Jalankan ekspresi yang dimodifikasi.

  4. Bandingkan hasilnya.

Adm
sumber
0

SED 272 246 239 213

s,^\+,,;s,[^+*/()-]\+,(&),g;t;:;s,)[^)]*)\*(0,&,;tr;s,\((.*)\)\*(0),(0/\1),;ty;s,\*([^)]*(,&,;tr;s,\*\(([^)]*)\),/(1/\1),;ty;s,\+([^)]*(,&,;tr;s,\+\(([^)]*)\),-(-\1),;ty;p;q;:r;s,(\([^()]*\)),!\1@,;t;:y;y,!@,(),;b

Ambil input tanpa spasi (mis x+y*2.).
Ini adalah salah satu dari beberapa kasus di mana sebenarnya lebih pendek untuk melarikan diri (dan )untuk menangkap kelompok daripada menggunakan -r. Saya yakin ini bisa bermain golf lebih banyak, tapi saya senang untuk saat ini.

Tidak disatukan, dengan komentar:

s,^\+,, #remove leading +
s,[^+*/()-]\+,(&),g #suround numbers/variables in ()
t start #reset the test because the line above will always match

:start
#------------- deal with *0 ------------------
s,)[^)]*)\*(0,&, #remove inner matching ()
t replace
s,\((.*)\)\*(0),(0/\1),
t y
#------------- deal with generic * -----------
s,\*([^)]*(,&, #remove inner matching ()
t replace
s,\*\(([^)]*)\),/(1/\1),
t y
#------------- deal with + -------------------
s,\+([^)]*(,&, #remove inner matching ()
t replace
s,\+\(([^)]*)\),-(-\1),
t y

b end #all done, branch to the end

#------------- replace a set of () with !@ ---
#repeated application of this helps find the matching ( or )
:replace
s,(\([^()]*\)),!\1@,
t start

:y
y,!@,(),
b start

:end
Riley
sumber