概述
稍微添加到处理罗马数字的复杂性..。古罗马人设计了一个使用拉丁字母的数字系统,这一系统很好地为他们服务,而且现代文明仍在使用,尽管程度要小得多。在使用这些数字的时候,罗马人必须学会使用和操纵这些数字,这样才能在许多应用中发挥很大作用。例如,如果一个人拥有35头牛,他卖掉了27头牛,他怎么会知道新的总数,而不是把它们全部计算在内呢?(好的,用算盘.)如果罗马人能做到这一点,我们当然也能搞清楚。
目标
编写最短的算法/函数/程序,将两个罗马数字相减并输出结果,而不将输入的字符串表示转换为数字。
规则/约束
由于历史/中世纪前格式的不一致,我将概述一些非标准(按现代用法)的正字法规则。作为示例,请参阅下面的值指南。
NULL或空字符串的形式返回。VIIII == 9但是IX != 9是无效的/不允许的。我确实有一个解决这个问题的方法,这个问题已经被打败了,但是我会推迟几天的发布,看看有没有其他的答案。
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,000XII - VIII = IIII (12 - 8 = 4)
MCCXXII - MCCXXII = '' (2,222 - 2,222 = 0)
XXIIII - XXXXII = -XVIII (24 - 42 = -18)如果需要进一步澄清,请询问。
发布于 2012-05-29 14:31:15
使用相同的想法--但比附加版本要长得多:
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}它是一个作为函数的实现。获取两个字符串,并在从第一个字符串中减去第二个字符串时返回结果。示例:
puts f["XII", "VIII"] # -> IIII
puts f["MCCXXII", "MCCXXII"] # ->
puts f["XXIIII", "XXXXII"] # -> -XVIII发布于 2012-05-30 16:39:18
:;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实现。预期输入将采用以下格式,没有空格
XXIIII-XXXXII它正确地输出负值,并将零打印为空字符串。
仍然试图在不使用扩展regexp的情况下将代码略去一点。
发布于 2012-05-30 17:55:50
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 Functionhttps://codegolf.stackexchange.com/questions/6061
复制相似问题