曼哈顿数学


12

我定义以下运算符:

曼哈顿加法 a + M b(对于一位数字)是将b连接到a的结果。因此,a + M b = 10a + b。因此,通用运算符+ M的定义如下:

a + M b = 10a + b

曼哈顿减法 a – M b(对于一位数字)是从a中删除最后一个b的结果。因此,运算符– M的定义如下:

a – M b = a最后删除b

曼哈顿乘法M b是用b的b实例替换a中的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,而不是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

这是一个,因此以字节为单位的最短程序获胜。

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为了确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,可以将旧分数保留在标题中,方法是将它们打掉。例如:

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

如果您想在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

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

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

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


13
为什么要使用Unicode符号×÷不是ASCII */
ASCIIThenANSI,2015年

1
为什么232 ×M 23相等23232?它不等于等于23个副本,23后跟一个2吗?
senshin 2015年

1
@ASCIIThenANSI我可以看到您为什么这样问。选择是任意的。除非我的选择遇到一些紧迫的问题,否则我认为不会改变它。
Conor O'Brien

4
如果挑战不是 Unicode 有关的话,这会使没有良好Unicode支持的语言更加难以参与,这不是很有趣。
林恩(Lynn)

2
由于没有明确说明,这个问题尚未引起足够的重视。您为sngle数字编号定义加法,那么您的第一个示例具有2个数字编号。我放弃...
edc65

Answers:


5

Dyalog APL 104 81 79 93 75 字节

编辑:现在正确处理4342343 -M 3443423

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

背景

这将APL扩展到包括Manhattan运营商。APL术语中的运算符是功能(例如÷)的修饰符。运算符的一个示例是修改函数以交换其参数3 = 2 ÷⍨ 6。同样,M将基本算术函数修改为它们的曼哈顿亲戚。请注意,由于生成的语言是APL的扩展,因此保留了APL严格的从右到左优先级。

说明

总体结构是M←{⍎(5|⌊⍺⍺2)⊃……},它将函数(+or -×or ÷)应用于2,并使用结果选择要评估的字符串。字符串是:

-M为3: (('(.*)',b←⍕⍵)⎕R'\1'⊢a←⍕⍺)
 正则表达式删除最后一次出现b中(串代表右arg的。)一个(字符串代表左arg的。)

+ M为2: '10⊥⍺⍵'
 将参数评估为以10为基数的数字

×M的1: (b⎕R(⍵⍴'&')⊢a)
 替换出现的b个“&”号 b的(即,

÷M的0: '⍺×M⍣(⍺≠1)⍎⊃b'
⍎⊃b第一个数字
⍺×M⍣(⍺≠1)如果⍺≠1 b的适用⍺×M

从以上四个字符串中,选择数字:

(5|⌊⍺⍺2)该函数的下限的mod-5应用于2,即:
 3 = 5 | ⌊-2
 2 = 5 | ⌊+2
 1 = 5 | ⌊×2因为×2⇔sgn(2)⇔1
 0 = 5 | ⌊÷2因为÷2⇔1÷2⇔0.5

非常感谢我亲爱的朋友ngn令人赞叹的刨花。


1
这可以。它符合我的期望。
Conor O'Brien

太好了,我将编辑帖子。
2015年

@CᴏɴᴏʀO'Bʀɪᴇɴ我可能已经失去了花红,但是现在肯定是最短的了。
2013年

哎呀,忘了这个。
科纳·奥布莱恩

@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
Conor O'Brien

恭喜!
Conor O'Brien 2015年

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进行转换。

我很确定这可以继续进行下去,因此在接下来的几天中我将继续努力。


我看不到cf
RK。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.