首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减法,老式的方法

减法,老式的方法
EN

Code Golf用户
提问于 2012-05-29 11:52:03
回答 6查看 991关注 0票数 5

概述

稍微添加到处理罗马数字的复杂性..。古罗马人设计了一个使用拉丁字母的数字系统,这一系统很好地为他们服务,而且现代文明仍在使用,尽管程度要小得多。在使用这些数字的时候,罗马人必须学会使用和操纵这些数字,这样才能在许多应用中发挥很大作用。例如,如果一个人拥有35头牛,他卖掉了27头牛,他怎么会知道新的总数,而不是把它们全部计算在内呢?(好的,用算盘.)如果罗马人能做到这一点,我们当然也能搞清楚。

目标

编写最短的算法/函数/程序,将两个罗马数字相减并输出结果,而不将输入的字符串表示转换为数字。

规则/约束

由于历史/中世纪前格式的不一致,我将概述一些非标准(按现代用法)的正字法规则。作为示例,请参阅下面的值指南。

  • 由于我们是在减法,负数是允许的。由于0在罗马系统中没有表示,所以应该以NULL或空字符串的形式返回。
  • 字母I、X、C和M可以连续重复四次,但不再重复。D,L,V永远不能重复。
  • 罗马表示法中的另一个字母的右边的字母与其左边的字母具有相同或较小的价值。
    • 换句话说,VIIII == 9但是IX != 9是无效的/不允许的。

  • 所有输入值都将是2,000 (MM)或更少;不需要对大于M的数字表示。
  • 根据上述规则,所有输入值都将是有效的罗马数字。
  • 作为解决方案的一部分,不得将任何数字转换为十进制、二进制或任何其他数字系统(欢迎使用这种方法验证结果)。
  • 这是密码高尔夫,所以最短的代码获胜。

我确实有一个解决这个问题的方法,这个问题已经被打败了,但是我会推迟几天的发布,看看有没有其他的答案。

值指南

代码语言:javascript
复制
Symbol        Value
I             1
II            2
III           3
IIII          4
V             5
VIIII         9
X             10
XIIII         14
XXXXIIII      44
L             50
LXXXXVIIII    99
C             100
D             500
M             1,000

示例

代码语言:javascript
复制
XII - VIII = IIII (12 - 8 = 4)
MCCXXII - MCCXXII = '' (2,222 - 2,222 = 0)
XXIIII - XXXXII = -XVIII (24 - 42 = -18)

如果需要进一步澄清,请询问。

EN

回答 6

Code Golf用户

发布于 2012-05-29 14:31:15

Ruby,112个字符

使用相同的想法--但比附加版本要长得多:

代码语言:javascript
复制
f=->a,b{r=0;v=5;n="IVXLCDM".gsub(/./){|g|r+=a.count(g)-b.count(g);t=r%v;r/=v;v^=7;g*t}.reverse;r<0?"-"+f[b,a]:n}

它是一个作为函数的实现。获取两个字符串,并在从第一个字符串中减去第二个字符串时返回结果。示例:

代码语言:javascript
复制
puts f["XII", "VIII"]          # -> IIII
puts f["MCCXXII", "MCCXXII"]   # -> 
puts f["XXIIII", "XXXXII"]     # -> -XVIII
票数 3
EN

Code Golf用户

发布于 2012-05-30 16:39:18

Sed,146个字符

代码语言:javascript
复制
:;s/M/DD/;s/D/CCCCC/;s/C/LL/;s/L/XXXXX/;s/X/VV/;s/V/IIIII/;t;s/\(I\+\)-\1/-/;:a;s/IIIII/V/;s/VV/X/;s/XXXXX/L/;s/LL/C/;s/CCCCC/D/;s/DD/M/;ta;s/-$//

这是一个纯sed实现。预期输入将采用以下格式,没有空格

代码语言:javascript
复制
XXIIII-XXXXII

它正确地输出负值,并将零打印为空字符串。

仍然试图在不使用扩展regexp的情况下将代码略去一点。

票数 1
EN

Code Golf用户

发布于 2012-05-30 17:55:50

VBA - 396

代码语言:javascript
复制
Function s(f,c)
a=Split("I,V,X,L,C,D,M",",")
For i=6 To 0 Step -1
x=Replace(f,a(i),""):y=Replace(c,a(i),""):m=Len(f)-Len(x):n=Len(c)-Len(y)
If b=0 Then b=IIf(m>=n,IIf(m=n,0,1),2)
Next
q=f:p=c
If b=1 Then:p=f:q=c
For i=0 To 6
x=Replace(p,a(i),"")
y=Replace(q,a(i),"")
t=(Len(p)-Len(x)-u)-(Len(q)-Len(y))
r=IIf(i Mod 2,2,5)
u=IIf(t<0,1,0)
t=IIf(t<0,t+r,t)
s=String(t,a(i)) & s
Next
If b=2 Then s="-" & s
End Function
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/6061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档