全方位電卓を作成する


16

インスピレーション。 逆。

指定されたオムニフィックス式を評価します。

Omnifixは通常の数学の挿入記法に似ていますが、引数を囲む各記号のコピーが追加されています。外側のシンボルは括弧の代わりになるため、追加の括弧は必要ありません。

加算、減算、乗算、除算、および正の実数(負の数を書き込むことができます-0-n-)を、言語の妥当な範囲内でサポートする必要があります。

プラスとマイナスでなければならない+-、しかし、あなたは使用することができます*または×回および/または÷除算のために。リクエストに応じて、その他の妥当な記号を使用できます。

ブラウニーは、説明と追加機能(追加の演算、負の数、文字列など)を指摘します。回答にこれらの機能がない場合でも、それがどのようにできるかをお気軽に示してください。

可能であれば、ソリューションをテストするためのリンクを提供してください。

明確にするために、以下の説明では高いマイナス(¯)を使用して負の数を示しています。適切な形式を使用して負の数を返すことができます。

-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


1
The explanations below use high minus (`¯`) to indicate negative numbers.あなたは間違いなくAPLが大好きです。
エリックアウトゴルファー

@EriktheOutgolferより良い提案がありますか?また、TI-BASICは高いマイナスを使用します。
アダム

-sと-sを混同する¯ことはできませんが、s とsを混同することができるため、実際にはそうではありません-
エリックアウトゴルファー

ああ、実数の要件に気付いただけです。私の290バイトの整数演算Retinaソリューションにはこれ
Neil

@Neil答えとして投稿してみませんか?
アダム

回答:


4

C#(.NET Core)198 197 188バイト

float O(string s){try{return float.Parse(s);}catch{var f=s[0];int i=s.IndexOf(f,1);float a=O(s.Substring(1,i-1)),b=O(s.Substring(i+1,s.Length-i-2));return f<43?a*b:f<44?a+b:f<46?a-b:a/b;}}

オンラインでお試しください!

とを使用*/ます。

再帰関数。最初に、入力文字列をとして解析しようとしますfloat。失敗した場合は、第1および第2オペランドを引数として再帰的に渡して自分自身を呼び出し、結果に対して選択した操作を実行します。

  • Mr. Xcoderのおかげで1バイト節約!
  • TheLethalCoderのおかげで9バイト節約されました!

IndefOf(f, 1)することができますIndexOf(f,1)
ミスターXcoder

1
使用して、floatあなたがそれらはおそらくそれらを短くすることができていたときに、文字コードを使用し、代わりだ><場所のカップルで。
TheLethalCoder

あなたはゴルフに変化バイトできるi+1,s.Length-i-2までを++i,s.Length+~i
ケビンクルーッセン

4

Python 3、159 158 152 144 136 135 132バイト

def t(i,a=1):
 while'-'<l[i]!='/':i+=1;a=0
 if a:l[i]='(';i=t(t(i+1));l[i-1]=')'
 return-~i
*l,=input()
t(0)
print(eval(''.join(l)))

オンラインでお試しください!

負の数は許可されません(-0-5-もちろん動作しますが)、Python演算子が必要です。


TIOリンクを追加できますか?
アダム

1
while~-(l[i]in'+-*/'):i+=1;a=1および*l,=input()152バイト
フェリペナルディバティスタ

1
すべてのテストケース:リンク
フェリペナルディバティスタ


1
if a:l[i]='(';i=t(t(i+1));l[i-1]=')'return-~i135バイトのために:P
フェリペ・ナルディバティスタ

3

網膜290の 287 286バイト

\d+
¦$&$*
¯¦
¯
{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-
-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-
(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3
צ×[¯¦]1*×|¯¯¦?
¦
¯¦|¦¯
¯
+`-((¯|¦)1*)(1*)-\2\3-
$1
-([¯¦]1*)-[¯¦](1*)-
$1$2
צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+
}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*
((¯)|¦)(1*)
$2$.3

オンラインでお試しください!注:整数演算のみが可能なため、一部のテストケースは削除されています。¯接頭辞を使用して負の数を受け入れ、返します。編集:@Cowsquackのおかげで3 4バイトを保存しました。説明:

\d+
¦$&$*

ゼロを処理する何らかの方法が必要だったので¦、正の数値プレフィックスとして使用します。次に、数値は単項に変換されます。

¯¦
¯

ただし、負数には¯接頭辞のみが必要です。

{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-

+sを引用するとくなるため、加算を減算に変換します。

-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-

減算のLHSの絶対値がRHSより小さい場合、それらを切り替えて、両側を無効にします。

(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3

また、乗算または除算のLHSが負の場合、両側を否定します。

צ×[¯¦]1*×|¯¯¦?
¦

また、乗算のLHSがゼロの場合、結果はゼロになります。また、2つのマイナスはプラスになります。

¯¦|¦¯
¯

ただし、マイナスとプラス(またはその逆)はマイナスになります。

+`-((¯|¦)1*)(1*)-\2\3-
$1

同じ符号の2つの数字を減算します。そのような減算がなくなるまでこれを繰り返します。

-([¯¦]1*)-[¯¦](1*)-
$1$2

まだ減算がある場合、符号は異なる必要があるため、数字を加算します。(ただし、これは同じ記号の2つの数字の減算を再び明らかにする可能性があるため、一度だけ実行してください。)

צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+

繰り返し加算で乗算を実行します。

}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*

整数除算を実行します。上記のステップの1つは式を単純化するため、操作がなくなるまでループバックします。

((¯)|¦)(1*)
$2$.3

10進数に戻します。


うわー、それは-叙事詩です。PPCGで最大のRetina投稿ですか?ただし、通常、QuadRソリューションとRetinaソリューションは互いによく似ています。ひらめくことができますか?
アダム

この行+`-(([¯¦])1*)(1*)-\2\3-[¯¦]は、次のようになります¯|¦
Kritixi Lithos

@Cowsquackは実際に3回発生します、ありがとう!
ニール

あなたが逃したものがあります([×÷]);)
Kritixi Lithos

1
@Cowsquack別のものを見つけない方がいいです。さもないと、4を消さなければなりません...-
ニール

2

PHP116の 114 109バイト

-5 Martin Enderに感謝

for($s=$argv[$o=1];$o!=$s;)$s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);eval("echo$s;");

*乗算および除算に使用し/ます。負の数は、私がそれを実現するための具体的な試みをしていなかったにもかかわらず機能します。

オンラインでお試しください!

非ゴルフと説明

for($s=$argv[$o=1];   # Initialize with $s = input and $o = 1;
    $o!=$s;)          # While $o != $s
    # Set $o to $s and set $s to be $s after this regex replacement:
    $s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);
    # i.e., continue to do this replacement until the result is the same on two consecutive
    # steps (no replacement was made)
# Once $o == $s (i.e. no more replacement can be made), eval the result and print
eval("echo$s;"); 

正規表現についても少し説明しますので、説明します。

([*+/-])(([\d.]+|(?R))\1(?3))\1


([*+/-])

まず、4つの演算子のいずれかと一致させたいと思います。 *+/-

([\d.]+|(?R))

次に、数字[\d.]+または別の有効なオムニフィックス式のいずれかと一致する必要があります(?R)

\1

次に、先頭にあった同じ演算子に一致します。

(?3)

次に、グループ3で行ったのと同じことを行います:数値またはオムニフィックス式に一致します。

\1

最後に、最初の演算子を再度照合します。

これに一致するものはすべてに置き換えられ($2)ます。これは、周囲の演算子の内側の部分を取り、括弧の中に入れます。したがって、通常の挿入記法のように見えます。


2

QuadR33 32 27バイト

-1 Cows Quackに感謝します。-5 アウトゴルファーのエリックに感謝します。

((.)[\d¯\.]+){2}\2
⍎¯11↓⍵M

引数/フラグ付き

オンラインでお試しください!

これは、40バイトのDyalog APLソリューションと同等です。

'((.)[\d¯\.]+){2}\2'R{⍕⍎1↓¯1↓⍵.Match}⍣≡

オンラインでお試しください!

説明

(括弧で囲まれたテキストは、QuadRではなくDyalog APLを指します)

(... ){2}\2 二回以下のパターン、そしてあまりにも二回全体のマッチ:
  (.) 任意の文字
  [... ]+ 以下の文字のセットの1つまたはそれ以上続く:
   \dD igits、
   ¯ 高いマイナス(負符号)
   \. の期間

⎕R れるRはでeplaced :)

{} 名前空間に適用された次の匿名関数の結果⍵:)

⍵M (⍵.Match)のテキストMの ATCHは、
¯1↓ 最後の文字(記号ドロップ+ - ×又は÷)の
1↓ 最初の文字(記号)をドロップ
 APLコードとして実行します
 (  文字列化)

 (⍣≡)変更がそれ以上起こらなくなるまで交換を繰り返す


私はあなたがドロップすることができると思う
KritixiのLithos

@Cowsquack QuadRについては正しい。⎕R数値データを操作できません。ありがとう。
アダム


1

Haskell、132文字

(134バイトため×及び÷UTF-8で2つのバイトを取ります)

f y|(n@(_:_),r)<-span(`elem`['.'..'9'])y=(read n,r)
f(c:d)|(l,_:s)<-f d,(m,_:r)<-f s=(o[c]l m,r)
o"+"=(+)
o"-"=(-)
o"×"=(*)
o"÷"=(/)

オンラインでお試しください!

f可能な限り多くの入力を解析し、結果と残りの文字列(テストケースでは空です)を生成します。ルールに準拠していない場合は、解析不能な残りの文字列を

Haskell、139文字

...
g=fst.f

0

Perl、64 53バイト

含める+1ために-p

perl -pe 's%([*-/])(([\d.]+|(?0))\1(?3))\1%($2)%&&redo;$_=eval' <<< "/4/-3-/1/2/-/"

誤って実装,(最初の引数を破棄)することもあり.ます(引数を一緒に追加することもあります)。.ただし、解析レベルと評価レベルの両方で小数点に干渉するため、非常に信頼性の高い動作はしません。


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