R [oman | everse] 폴란드어 표기법


11

로마 제국이 결코 타락하지 않은 세계에서 MDLXVII의 해이며, 암흑 시대로의 붕괴는 결코 일어나지 않았습니다. Pax Romana의 연장 된 기간으로 인해, 제국의 경제 안정성으로 인해 기술이 빠른 속도로 발전 할 수있었습니다.

로마인들은 회로를 다루기 시작했으며 "같음"버튼을 사용할 필요가없는 독창적 인 계산기를 발명했습니다. 그들은 "로마 폴란드어 표기법"이라고 부릅니다.

계산하려면 먼저 피연산자를 입력 한 다음 연산을 입력하십시오.

예를 들어 100 + 11 * 20은입니다 C XI XX * +.

또한

로마인들은 종종 동시에 여러 번 계산해야한다는 것을 발견했으며, 어떤 방법으로 배열 / 목록 / 튜플과 같은 구조로 "스택에서"모든 값을 반환하는 방법을 선호합니다. (예 : X I + X I - CC II +[11, 9, 202] 반환)


문제는 이러한 계산을 수행 할 수있는 계산기 프로그램을 개발하는 것입니다.

설명 : 빼기 표기법이 필요합니다. 나는 그것이 고대 로마 제국의 특징으로 인식되지 않았다는 것을 깨닫지 못했습니다. 그러므로 그 과제는 모호했고, 나는 사과한다.

최소 지침

  • 출력은 아라비아 숫자로 표시됩니다.
  • 로마 숫자에서 5000까지만 변환하면됩니다.
  • +,-, /, * 연산 (더하기, 빼기, 나누기 및 곱하기)을 지원해야합니다.
  • 나누기가 부동 소수점 기반인지 정수 기반인지는 구현에 따라 다릅니다. 이 도전을 위해 일합니다.
  • 출력은 최대 40 억 개의 숫자를 지원해야합니다.
  • 전체적으로 가장 짧은 대답은 각 언어에서 승리합니다. 이것은 Code Golf Challenge이지만 다양성을 좋아합니다.

동점 인 경우 5000 이상의 로마 숫자 지원 또는 추가 작업과 같은 요소 는 가장 빠른 제출이 이길 것으로 간주 됩니다.


1
문자열 목록으로 입력 할 수 있습니까? 각각 로마 숫자 나 연산자가 있습니까?
user202729

입력을 소문자로 입력 할 수 있습니까 아니면 대문자 여야합니까?
dzaima

1
@JesseDanielMitchell 참고로 ... 규칙을 변경하거나 기존 답변을 무효화하지 마십시오 . 또한 (평소대로) Sandbox에 게시하는 것이 좋습니다 .
user202729 년

답변:


6

파이썬 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ಠ_ಠ
완전히 인간적인

@totallyhuman 그것은 단지 이것을 위해 만든 더미 프로젝트 일뿐입니다.
Mr. Xcoder

6

하스켈 , 217 바이트

Bruce Forte 덕분에 -13 바이트 Ørjan Johansen 덕분에 -73 바이트

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
나는 그것을 조금 줄였습니다 (그래서 새로운 파이썬을 때리는 것에 가깝습니다 ...) 온라인으로보십시오!
Ørjan Johansen 님이

1
파이썬도 줄었습니다. 그러나 뺄셈 표기법이지지 될 필요가 없다는 그의 주장이지지된다면, 여기에서도 더 많은 비용이 절약됩니다.
Ørjan Johansen

1
어쨌든으로 다른 3 바이트를 끕니다 l=1:4:5:9:map(10*)l.
ბიმო

로마 숫자를 변환하기 위해 찾은 나머지 트릭을 기억했습니다.이 숫자는 자동으로 빼기를 처리합니다. 온라인으로 사용해보십시오!
Ørjan Johansen 님이


2

JavaScript (노드) + romans + 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' ]

람다를 프롬프트로 사용하는 사람은 몇 명입니까?
Stan Strum

이 같은 I를 @StanStrum, 그것은 같은 단말기의 기본이다 cmder
코너 오브라이언

몰랐어요 나는에서 이탈 한 적이 추측 $하고 >. 솔직히, 나는 그것을 좋아합니다
Stan Strum

2

Dyalog APL , 93 바이트

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

온라인으로 사용해보십시오!

로마자가 내장되지 않은 116 바이트


Woah, 전에 골프에서 수정 된 임무를 본 적이 없다
Zacharý

이 때문에 재커리 @ 그것은 내가 그 dfns 범위의 변수를 수정 알고있는 유일한 방법 이 있었다 여기에 사용되는.
dzaima

내 무지를 용서하지만 수정 된 과제는 무엇입니까?
caird coinheringaahing

@cairdcoinheringaahing- var fn←arr와 동일합니다 var ← var fn arr. 여기서는 여러 장소에서 사용되며 변수에 a,←⍵추가되는 장소a
dzaima

1

파이썬 3 , 280206 바이트

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.
Ørjan Johansen

사실, 내가 찾은이 속임수를 알려 드리겠습니다 :n+=v-n%v*2
Ørjan Johansen

1
두 가지 str용도를 결합 할 수도 있습니다 . 온라인으로 사용해보십시오!
Ørjan Johansen

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

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

파이썬 (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) 와 같은 숫자를 지원하지 않습니다 .
Ørjan Johansen '12

... 논리가 잘못 될 수는 없습니다. : P
Ørjan Johansen '

2
아, 네 말이 맞아 나는 가능한 모호성에 대해 생각하지 않았고, 뺄셈 표기법이 고대 로마 제국의 일반적인 특징이 아니라는 것을 알지 못했습니다.
Jesse Daniel Mitchell

1
나는 실제로 OP 아래에서 빼기 표기법에 대해 묻는 것을 고려했지만 (예제가 부족함을 알았습니다) 산만 해졌습니다. 미래의 도전 과제에서 모호한 점이 있다고 생각한다면 망설이지 말고 물어보십시오 (게시하고 답글을 게시하려면 게시해야합니다). 이제 판결은 당신이 그것을 고치려고 시도해야합니다 :)
Jonathan Allan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.