Toán biểu tượng


8

Giới thiệu

Bốn toán tử toán học cơ bản (+, -, *, /) có thể được giảm xuống chỉ còn hai, do thực tế là:

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

Thử thách

Thách thức là lấy đầu vào dưới dạng "chuỗi" chứa:

  • Số
  • Các biến ký tự đơn ("x", "y")
  • Bốn toán tử toán học cơ bản (+, -, *, /)
  • Dấu ngoặc

và đưa ra một chuỗi được thao tác để nó tạo ra kết quả toán học giống như đầu vào, nhưng chỉ chứa các ký hiệu toán học '-' và '/'

Cụ thể

  • Đầu vào có thể ở bất kỳ dạng nào được chấp nhận (tệp, STDIN, v.v.) và có thể được biểu diễn dưới dạng một chuỗi hoặc chuỗi ký tự (nhưng không phải là một mảng của mảng)
  • Đầu ra có thể ở bất kỳ dạng nào được chấp nhận (tệp, STDIN, v.v.) và có thể được biểu diễn dưới dạng một chuỗi hoặc chuỗi ký tự (nhưng không phải là một mảng của mảng)
  • Bạn phải nhận ra và duy trì dấu ngoặc đơn cân bằng
  • Các sơ hở tiêu chuẩn không được phép
  • Đó là lựa chọn của bạn nếu bạn muốn đại diện x + ynhư x - -yhoặcx - (-y)
  • Bạn phải duy trì thứ tự hoạt động
  • Bạn không bao giờ phải xử lý đầu vào không hợp lệ
  • Đầu vào có thể trống hoặc một số / biến đơn, trong trường hợp đó, chương trình sẽ xuất đầu vào
  • Lưu ý: Bạn không phải sử dụng các thay thế trong phần giới thiệu, miễn là input = outputchương trình của bạn có thể thay đổi 2 * 2thành 8/2, nếu bạn muốn
  • Bạn có thể giả sử rằng "0" là cách duy nhất số 0 xuất hiện trong phương trình (Tức là bạn không phải xử lý 1 * (4 - 4))
  • Gợi ý: để kiểm tra chương trình của bạn, hãy đến trang web này gõ vào input = output, nơi đầu vào là đầu vào, và đầu ra là sản phẩm, và nếu kết quả là "true" chương trình của bạn xử lý trường hợp đó thành công ( ví dụ , ví dụ )

Các trường hợp thử nghiệm

Dưới đây là một số trường hợp thử nghiệm, đầu vào dưới dạng một chuỗi và đầu ra dưới dạng một chuỗi.

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))

Chấm điểm

Đó là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng. Ties được giải quyết bằng bài đầu tiên.


2
Nhân tiện x / 1/y= x/yvì phân chia không liên kết. Tôi biết bạn đang nghĩ gì, nhưng ngay cả WolframAlpha cũng không nhận ra rằng bạn muốn không gian thay đổi thứ tự hoạt động .... vì vậy bạn có thể nên suy nghĩ lại về điều này hoặc không trích dẫn đó là một cách hợp lệ để kiểm tra mọi thứ.
Linus

1
@Linus: Nó cũng không tương đương khi nào y=0, nhưng tôi đoán thử thách này mặc nhiên thừa nhận điều đó n/d => d != 0.
Tim as

@ Timas ahh! Không nghĩ về điều đó. Tôi sẽ cập nhật thử thách, chỉ cần biết rằng nó sẽ phải được xử lý đúng cách
Socratic Phoenix

Như hiện tại, có rất ít ngăn chúng ta đơn giản đánh giá biểu thức và trả về kết quả (xét cho cùng, về mặt toán học, xét cho cùng). Tôi khuyên bạn nên thay đổi điều đó, trừ khi bạn muốn vtrở thành một giải pháp thích hợp trong Pyth.
Steven H.

Đợi đã, vậy nếu có các biến (như x và y), làm thế nào chúng ta có thể chia mà không gặp rủi ro chia cho 0? 5 * (a - b)nếu a = b. Và chúng ta có phải phát hiện những thứ như thế 5 * (a - a)nào? Làm thế nào về 5 * (4 - 4)5 * (a / a - 1)hay 5 * (4 / 4 - 1)?
Adám

Câu trả lời:


4

Python 3, 267 byte

Cảm ơn @ 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(' ',''))))))))

Nghĩa là nó!


Thành thật mà nói, tôi không biết ma thuật bóng tối nào bạn đã sử dụng, nhưng +1 cho FGITW
Socratic Phoenix

@SocPhoenix Haha ma thuật bóng tối được gọi là regex;)
Beta Decay

1

APL Dyalog , 42 byte

Điều này duy trì thứ tự hoạt động của APL. Lưu ý rằng ÷x1÷x

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

Dùng thử trực tuyến!

( về kết quả của ...

~∘' ' loại bỏ không gian

'(.*)×0'⎕R'0÷\1' thay thế bất cứ thứ gì theo sau "× 0" bằng "0" theo sau nó

) đánh giá...

'\+' '×'⎕R'--' '÷÷' thay thế "+" bằng "-" và "×" bằng ""

Để xác minh:

  1. Gán ngẫu nhiên khác không số để x, y, l, g, và a.

  2. Thực hiện các biểu thức ban đầu.

  3. Thực hiện các biểu thức sửa đổi.

  4. So sánh kết quả.


0

SED 272 246 239 213 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

Lấy đầu vào không có khoảng trắng (ví dụ x+y*2).
Đây là một trong số ít trường hợp thực sự ngắn hơn khi chỉ thoát ()cho các nhóm bắt thay vì sử dụng -r. Tôi chắc chắn rằng điều này có thể được chơi golf nhiều hơn, nhưng bây giờ tôi rất vui.

Ungolfed, với ý kiến:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.