2シンボル数学


8

前書き

次の事実により、4つの基本的な数学演算子(+、-、*、/)を2つに減らすことができます。

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

チャレンジ

課題は、以下を含む「文字列」として入力を受け取ることです。

  • 数字
  • 単一文字変数( "x"、 "y")
  • 4つの基本的な数学演算子(+、-、*、/)
  • 括弧

入力と同じ数学的な結果を生成するように操作された文字列を出力しますが、数学記号「-」と「/」のみを含みます

詳細

  • 入力は任意の受け入れ可能な形式(ファイル、STDINなど)にすることができ、文字列または文字配列(配列の配列ではない)として表すことができます。
  • 出力は、任意の受け入れ可能な形式(ファイル、STDINなど)にすることができ、文字列または文字配列(配列の配列ではない)として表すことができます。
  • 括弧を認識して維持する必要があります
  • 標準の抜け穴は許可されていません
  • またはx + yとして表現したい場合は、あなたの選択ですx - -yx - (-y)
  • 操作の順序を維持する必要があります
  • 無効な入力を処理する必要はありません
  • 入力は空でも、単一の数値/変数でもかまいません。その場合、プログラムは入力を出力する必要があります
  • 注:あなたはしていない限り、導入に置換を使用する必要がありinput = output、あなたのプログラムが変更される可能性2 * 28/2あなたが望んだ場合には、
  • 「0」が方程式にゼロが表示される唯一の方法であると想定できます(つまり、処理する必要はありません1 * (4 - 4))。
  • 提案:プログラムをテストするには、このWebサイトタイプにアクセスしてくださいinput = output。ここで、入力は入力、出力は出力です。結果が「true」の場合、プログラムはそのケースを正常に処理しました(

テストケース

以下はいくつかのテストケースで、単一の文字列として入力し、単一の文字列として出力します。

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

得点

これはなので、バイト単位の最短の回答が優先されます。ネクタイは最初のポストによって解決されます。


2
ちなみにx / 1/y= x/y分割は結合的ではないためです。私はあなたが何を考えているのか知っていますが、WolframAlphaでさえ、スペースで操作の順序を変更したいということを認識していません。
Linus

1
@Linus:の場合も同等ではありませんy=0が、チャレンジは暗黙的にそれを想定してn/d => d != 0いると思います。
TimČasSep

@TimČasahh!そのことを考えていませんでした。チャレンジを更新します。正しく処理する必要があることを知っているだけです
Socratic Phoenix

現状では、単純に式を評価して結果を返すことを妨げるものはほとんどありません(結局、それらは数学的には同等です)。vPythで適切なソリューションになりたいのでない限り、それを変更することをお勧めします。
Steven H.

待って、変数(xやyなど)がある場合、ゼロによる除算の危険を冒さずに除算するにはどうすればよいでしょうか。5 * (a - b)a = bの場合。そして、私たちは次のようなものを検出する必要があり5 * (a - a)ますか?どの程度5 * (4 - 4)5 * (a / a - 1)5 * (4 / 4 - 1)
アダム

回答:


4

Python 3、267バイト

@ 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(' ',''))))))))

イデオネ!


正直なところ、あなたがどんなダークマジックを採用したかはわかりませんが、FGITWの+1
Socratic Phoenix

@SocraticPhoenixハハダークマジックは正規表現と呼ばれます;)
Beta Decay

1

Dyalog APL、42 バイト

これにより、APLの操作順序が維持されます。注÷xです1÷x

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

TryAPLオンライン!

( の結果に...

~∘' ' スペースを削除する

'(.*)×0'⎕R'0÷\1' 「×0」が後に続くものをすべて「0 followed」に置き換えます

) 評価...

'\+' '×'⎕R'--' '÷÷' 「+」を「-」に、「×」を「÷÷」に置き換えます

検証します:

  1. 割り当てランダムゼロ以外の数字にxylg、とa

  2. 元の式を実行します。

  3. 変更された式を実行します。

  4. 結果を比較します。


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

スペースなしで入力してください(例:)x+y*2
これは、を使用する代わりに、エスケープグループ()キャプチャグループの方が実際には短い数少ないケースの1つです-r。これはもっとゴルフできると確信していますが、今のところ満足しています。

コメントなしのゴルフ場:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.