R [oman | everse]波兰语表示法


11

这是MDLXVII年,在这个世界中,罗马帝国从未沦陷,也从未发生过陷入黑暗时代的崩溃。由于罗马帝国时期的延长,帝国的经济稳定使技术得以快速发展。

罗马人已经开始涉足电路,并发明了一种不需要使用“等于”按钮的巧妙计算器。他们称其为“罗马波兰语符号”

为了进行计算,它们首先输入其操作数,然后输入运算。

例如,100 + 11 * 20将是C XI XX * +

另外

罗马人发现他们经常需要同时进行多个计算,因此更喜欢该方法以某种类似于数组/列表/元组的结构“在堆栈上”返回每个值。(例如,X I + X I - CC II +将返回[11,9,202])


挑战在于开发一种能够进行这些计算的计算器程序。

澄清:减法符号是必需的。我没有意识到这在古罗马帝国中并不是公认的特征。因此任务不明确,我对此表示歉意。

最低准则

  • 您的输出将使用阿拉伯数字。
  • 您只需将罗马数字转换为5000。
  • 您将需要支持+,-,/,*操作(加,减,除和乘)。
  • 除法是基于浮点还是基于整数是特定于实现的。两者都可以应对这一挑战。
  • 您的输出将需要支持多达40亿个数字。
  • 总的来说,答案最短,并且每种语言都取胜。这是一场Code Golf挑战赛,但我很喜欢这种变化。

如果出现平局,支持罗马数字大于5000或进行其他操作之类的因素将被认为是最早提交的申请。


1
我们可以将输入作为一个字符串列表,每个字符串都有一个罗马数字或一个运算符吗?
user202729 '17

输入可以小写,还是必须大写?
dzaima

1
@JesseDanielMitchell作为注释,请尝试 ... 不要更改规则并使现有答案无效。另外,(通常)我建议在Sandbox中发布。
user202729'1

Answers:


6

Python 2 + 罗马语,118字节

from roman import*
s=[]
for i in input().split():s+=[eval(s.pop(-2)+i+s.pop())if i in"+-/*"else`fromRoman(i)`]
print s

演示版

由于使用了模块,因此无法在线对其进行测试,但是您可以在此处查看如何运行此命令(完整的程序接受来自STDIN的输入-带引号的表达式-并将输出以列表的形式打印到STDOUT ,堆栈)。使用稍旧的版本,因为我不会只为几个字节创建新的GIF:

演示GIF

要安装该软件包,可以在终端/命令行中运行以下命令:

pip install roman

2
pyTester/Py.pyಠ_ಠ–完全人类的
2017年

@totallyhuman这只是我为此而做的一个虚拟项目……
Xcoder先生17/12/30

6

Haskell,217个字节

-13个字节,感谢Bruce Forte。-73个字节,感谢ØrjanJohansen。

foldl(!)[].words
s@ ~(x:y:z)!n=last$(a n:s):[y`f`x:z|(f,c)<-zip[(+),(-),(*),(/)]"+-*/",n==[c]]
a s=last$0:[n+a(drop(length x)s)|(n,x)<-zip l$words"I IV V IX X XL L XC C CD D CM M",x<=s,x++"Y">s]
l=[1,4,5,9]++map(10*)l

在线尝试!

手动执行,是的!


2
我削减了一点(以至于击败了新的Python……)在线尝试!
与Orjan约翰森

1
Python也被砍掉了。但是如果坚持不需要减法表示法的论点,那么这里也有更多的节省。
与Orjan约翰森

1
在任何情况下,都要再减去3个字节l=1:4:5:9:map(10*)l
ბიმო

我还记得我曾经发现的一种转换罗马数字的技巧,它可以自动进行减法运算。在线尝试!
与Orjan约翰森


2

JavaScript(节点)+ 罗马书 + stk-lang,74个字节

s=>(R=require)("stk-lang")(s.replace(/\w+/g,R("romans").deromanize)).stack

返回bigintegers的列表。

执行

运行以下命令:

npm install romans
npm install stk-lang
node

然后粘贴功能。例:

C:\Users\conorob\Programming\golf-new\roman
λ npm install romans
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN Programming No description
npm WARN Programming No repository field.
npm WARN Programming No README data
npm WARN Programming No license field.

+ romans@1.0.0
added 1 package in 0.801s

C:\Users\conorob\Programming\golf-new\roman
λ npm install stk-lang
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN Programming No description
npm WARN Programming No repository field.
npm WARN Programming No README data
npm WARN Programming No license field.

+ stk-lang@1.0.0
added 1 package in 0.847s

C:\Users\conorob\Programming\golf-new\roman
λ node
> s=>(R=require)("stk-lang")(s.replace(/\w+/g,R("romans").deromanize)).stack
[Function]
> f=_
[Function]
> f("X I + X I - CC II +").map(e => e.toString())
[ '11', '9', '202' ]
> f("C XI XX * +").map(e => e.toString())
[ '320' ]
> f("MMMM M I - +").map(e => e.toString())
[ '4999' ]

有多少人使用lambda作为提示?
Stan Strum,

@StanStrum我喜欢它,它是像终端默认cmder
康纳尔奥布莱恩

不知道 猜猜我从来没有偏离$>。老实说,我还是喜欢
Stan Strum,

2

Dyalog APL,93字节

CY'dfns'
a←⍬⋄{0::{a,←⍵}roman⍵⋄f←⍎'+-÷×'⌷⍨'+-/*'⍳⍵⋄rf2aa↓⍨←¯2a,←r}¨{1↓¨⍵⊂⍨⍵∊' '}' ',⍞⋄a

在线尝试!

116字节,不内置罗马字


哇,从没见过高尔夫球修改分配前
扎卡里

@Zacharý是我知道在dfns范围之外修改变量的唯一方法,因此必须在这里使用它。
dzaima

原谅我的无知,但是修改后的作业是什么?
Caird coinheringaahing

@cairdcoinheringaahing- var fn←arr等效于var ← var fn arr。在这里,它在多个地方使用,a,←⍵是附加到变量的地方a
dzaima

1

Python 3中280个 206字节

N=dict(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)
def d(s):
	n=0
	for v in map(N.get,s):n+=v-n%v*2
	return n
def c(w):
	s=[]
	for t in w.split():s+=[str(d(t)if t[0]in N else eval(s.pop(-2)+t+s.pop()))]
	return s

在线尝试!

这次使用减法表示法支持。方法c是主要切入点;另一个是支持。

编辑日志:


if和之后不需要缩进块else
与Orjan约翰森

其实,让我为您提供这一招我一旦发现:n+=v-n%v*2
与Orjan约翰森

1
您也可以将两种str用途结合起来。在线尝试!
与Orjan约翰森

0

javascipt的(ES6),152个 151字节

感谢user202729,节省了1个字节

p=>p.split` `.map(c=>s.push(eval("+-/*".indexOf(c)+1?(T=s.pop(),s.pop())+c+T:c.replace(/./g,c=>"+"+{I:1,V:5,X:10,L:50,C:100,D:500,M:1e3}[c]))),s=[])&&s

测试用例

说明(不打高尔夫球)

V={I:1,V:5,X:10,L:50,C:100,D:500,M:1e3}     // Values of the roman numerals
p=>(
 s=[],                                      // Initialize the stack
 p.split` `.map(c=>                         // For every part in the input:
  "+-/*".indexOf(c)+1?                      //   If the input is an operator:
   s.push(eval((T=s.pop(),s.pop())+c+T))    //     Evaluate the operator on the top of the stack
  :                                         //   Else (if it is a roman numeral):
   s.push(eval(c.replace(/./g,c=>"+"+V[c])))//     Push the sum of the characters' values
 ),s)                                       // return the stack

我很确定这1e3也可以工作并保存一些字节。
user202729 '17

0

果冻,82字节

ị“+-×÷”;”/v®ṫ-¤®ṖṖ¤;©
4Ḷ⁵*p1,5P€
“IVXLCDM”iЀị¢µIN‘Ṡæ.µ®;©
Ḳµ“+-*/”W€i⁸Ñ⁸Ǥ¹?µ€ṛ®Ḋ

在线尝试!

最初张贴在聊天中


说明:

由于Jelly没有堆栈,因此将堆栈放入寄存器中。

当程序启动时,寄存器值®0,这将被视为[0]对本方案的目的。


ị“+-×÷”;”/v®ṫ-¤®ṖṖ¤;©       Link 1: Given an operator index (an
                            integer in range 1..4), apply it.

ị“+-×÷”                     Index to the string "+-×÷"
       ;”/                  Concatenate with the character "/",
                            which is Jelly splat operator.
          v   ¤             Evaluate with parameter...
           ®                  the register's
            ṫ                 tail
             -                from -1. (2 last items)
               ®  ¤;        Concatenate with the register value,
                ṖṖ            pop twice.
                    ©       Store the result to register.

4Ḷ⁵*p1,5P€          Link 2: Niladic, generate [1,5,10,50,...]
4Ḷ                  Lowered range of 4, gives [0,1,2,3].
  ⁵*                Raise to power of 10. Value = 1,10,100,1000.
    p1,5            Calculate Cartesian product with [1,5].
                      Value = [1,1],[1,5],[10,1],[10,5],...
        P€          Calculate product of each item.

Alternatively, ×þ1,5F would also work instead of p1,5P€.

“IVXLCDM”iЀị¢µIN‘Ṡæ.µ®;©   Link 3: Given roman number, push it
                            to the stack (register).
         i                  Find index of ...
          Ѐ                  each character ...
“IVXLCDM”                     in "IVXLCDM".
            ị¢              Index to last link. (link 2)
              µ             With that value, (consider LIX ->
                            [50,1,10] for example)
               I             
Ḳµ“+-*/”W€i⁸Ñ⁸Ǥ¹?µ€ṛ®Ḋ

[TODO complete explanation]


-1

Python 3中216个 187字节

from operator import*
N=dict(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)
def f(w):
	s=[]
	for t in w.split():s+=[str(sum(map(N.get,t)))if t[0]in N else str(eval(s.pop(-2)+t+s.pop()))]
	return s

在线尝试!

因为它同时出现在问题和答案的注释中,并且可能导致投票否决:此提交不支持减法表示法。原理:减法符号在罗马帝国很少使用,后来才普及(见减法符号第3段,最后一句)。该任务假定罗马帝国开发了可编程集成电路,而不是经历了与13世纪欧洲相同的文化变革的罗马帝国。该描述未提及减法表示法,并且所有示例均未使用它。


嗯...您不支持数字CIV(104)。
与Orjan约翰森

...不能在那儿错你的逻辑。:P
与Orjan约翰森

2
啊,你是对的。我没有考虑过可能的歧义,我不知道减法符号在古罗马帝国中并不是普遍的特征。
杰西·丹尼尔·米切尔

1
实际上,我确实考虑过在OP下询问减法表示法(并注意到缺少示例),但是却分心了。如果您想到未来挑战中的定义不明确之处,请不要犹豫,只是问问(如果要发布,请提供警告和评论链接)。现在有一项裁决,您应该尝试解决它:)
Jonathan Allan
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.