マンハッタンの数学


12

次の演算子を定義します。

マンハッタンの加算 a + M b(1桁の数字の場合)は、bをaに連結した結果です。したがって、a + M b = 10a + bです。したがって、一般演算子+ Mは次のように定義されます。

a + M b = 10a + b

マンハッタン減算 a – M b(1桁の数字の場合)は、aから最後のbを削除した結果です。したがって、演算子– Mは、擬似コードで次のように定義されます。

a – M b = a最後のbを削除

マンハッタン乗算M bは、aのbのすべてのインスタンスをbのbインスタンスに置き換えた結果です。エルゴ、× Mは擬似コードで次のように定義されます。

M b = a-> s / b / <b bのコピー> / g

マンハッタン部門M bは、× Mで定義されます。

M b = bの最初の文字
a÷ M b = a× M(1÷ M b)

これらすべてを念頭に置いて、次の演算子(つまりa + b、not a b +または+ a b)を使用する中置式を評価するインタープリターを作成します

+    Addition
-    Subtraction
/    Division
*    Multiplication
*M   Manhattan Multiplication
/M   Manhattan Division
+M   Manhattan Addition
-M   Manhattan Subtraction

各マンハッタン演算子には、通常の演算子よりも高い優先順位があります。

テストケース:

> 5 +M 10 + 3
63      // 5*10 + 10 + 3 => 60 + 3
> 10 *M 2
10      // no 2s in 10
> 10 *M 1
10      // one 1 in 10 replaced once
> 23 *M 3
2333    // 23 has one 3, which is replaced with three 3s
> 23 *M 2
223     // 23 has one 2, which is replaced with two 2s
> 232 *M 2
22322   // 232 has two 2s, which are replaced with two 2s
> 232 *M 23
23...(23 times)...232   // ...
> 123 *M 2 * 3
3669    // 1223 * 3 => 3669
> 5 + 3 +M 2
37      // 5 + (3 +M 2) => 5 + 32 => 37
> 150 /M 3
150     // 150 ÷M 3 => 150 ×M 3 => 150
> 150 /M 53
1555550 // 150 ÷M 53 => 150 ×M 5 => 1555550
> 50 -M 0
5
> 500 -M 0
50
> 5234 -M 5
234
> 12 +M 633 *M 3
6333453 // = 12 +M 6333333 = 120 + 6333333 = 6333453

これはであるため、バイト単位の最短プログラムが優先されます。

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


13
なぜあなたは、Unicodeの記号を使用している×÷の代わりに、ASCII */
ASCIIThenANSI

1
なぜ232 ×M 23等しいの23232ですか?23コピーの23後にa が続くべきではない2でしょうか?
戦神

1
@ASCIIThenANSIあなたがそれを尋ねた理由がわかります。選択は任意です。私の選択に何らかの差し迫った問題がある場合を除き、私はそれを変更するとは思わない。
コナーオブライエン

4
ユニコードが適切にサポートされていない言語が参加することをarbitrarily意的に難しくします。これは、ユニコードに関する課題でない場合、あまり楽しくありません。
リン

2
明確に指定されていないため、この質問は十分に注目されていません。スグル数字の追加を定義すると、最初の例には2桁の数字が含まれます。私はあきらめます
...-edc65

回答:


5

Dyalog APL104 81 79 93 75 バイト

編集:4342343 -M 34 →を43423正しく処理するようになりました。

M←{⍎(5|⌊⍺⍺2)⊃'⍺×M⍣(⍺≠1)⍎⊃b'(b⎕R(⍵⍴'&')⊢a)'10⊥⍺⍵'(('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)}

バックグラウンド

これにより、APLがマンハッタン演算子を含むように拡張されます。APL用語の演算子は、関数の修飾子です(例:)÷。演算子の例として、関数を変更して引数を入れ替えます3 = 2 ÷⍨ 6。そう、M、基本的な算術関数をマンハッタンの親類に変更します。結果の言語はAPLの拡張であるため、APLの厳密な右から左への優先順位が残ることに注意してください。

説明

包括的な構造はM←{⍎(5|⌊⍺⍺2)⊃}で、関数(+または-or ×または÷)を2に適用し、結果を使用して評価する文字列を選択します。文字列は次のとおりです。

-M 3: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 正規表現削除の最後に出現するB(。。弦担当者右引数の)における(ストリング担当者の左引数の。)。

+ Mの場合2: '10⊥⍺⍵'
 引数を10進数として評価します

×Mの場合1: bの(b⎕R(⍵⍴'&')⊢a)
 出現箇所をb個のアンパサンドに置き換えます(つまり、

÷Mの場合0: bの'⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b最初の桁は、⍺≠1の場合、⍺×Mを適用します
⍺×M⍣(⍺≠1)

上記の4つの文字列から番号を選択します。

(5|⌊⍺⍺2)2に適用される関数のフロアのmod-5:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2×2⇔sgn(2)⇔1
 0 = 5 | ⌊÷2÷2⇔1÷2⇔0.5のため

素晴らしい削りくずについて、私の親愛なる友人ngnに感謝します。


1
これは結構です。それは私が望んでいたものに合います。
コナーオブライエン

それでは、投稿を編集します。
アダム

@CᴏɴᴏʀO'Bʀɪᴇɴ私はボーナスを失ったかもしれませんが、それは確かに最短です。
アダム

おっと、これを忘れてしまいました。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ忘れましたか?今日は編集したばかりで、受け入れられているものよりも短くしました。
アダム

12

Perl、100 99 98バイト

97バイトのコード+ 1バイトのコマンドライン

s/ |.*\K(\d)(\d*)-M\1|\+M/\2/g+s/(\d+)\*M(.)/$1=~s@$2@$&x$&@erg/e+s#/(M.)\d+#*\1#&&redo,$\=eval}{

使用例:

echo "123 *M 2 * 3 + 150 /M 53" | perl -p entry.pl

コードが短くなる場合は、*Mfor xMおよび/Mfor のみを使用する必要があり<div>Mます。
コナーオブライエン

賞金おめでとうございます!
コナーオブライエン

7

Python、644バイト

import operator as o,re
x,q,t,r,w='*/+-M';mm,md,ma,ms='*M /M +M -M'.split()
n=lambda x:x
a=lambda a,b:str(10*int(a)+int(b))
v=lambda a,b:a[::-1].replace(b,'',1)[::-1]
m=lambda a,b:a.replace(b,b*int(b))
d=lambda a,b:m(a,b[0])if a>0 else b[0]
def p(s):s=s.group();ss=s.split();l=s.split(ss[1]);h={mm:m,md:d,ma:a,ms:v,x:o.mul,q:o.div,t:o.add,r:o.sub}.get(ss[1],n);return str(h(*map(int if h in[o.mul,o.div,o.add,o.sub]else n,map(u,map(str.strip,l)))))
def u(s):z=r'\d+ (?:\{0}{2}|\{1}{2}) \d+';return re.sub(z.format(t,r,''),p,re.sub(z.format(t,r,w),p,re.sub(z.format(x,q,''),p,re.sub(z.format(x,q,w),p,re.sub(r'\((.*)\)',u,s)))))
print u(input())

STDINの入力を受け入れます(引用符で囲まれます)。正規表現を使用して、操作を照合および解析します。すべての作業は文字列に対して行われ、intへのキャストおよびintからのキャストは、通常の数学演算を行う場合にのみ使用されます。

これはさらにゴルフができると確信しているので、今後数日間はそれに取り組んでいきます。


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