R [oman | everse] Ký hiệu Ba Lan


11

Đó là năm MDLXVII trong một thế giới mà Đế chế La Mã không bao giờ sụp đổ, và sự sụp đổ vào thời kỳ đen tối không bao giờ xảy ra. Do thời gian kéo dài của Pax Romana, sự ổn định kinh tế của đế chế cho phép công nghệ phát triển với tốc độ nhanh chóng.

Người La Mã đã bắt đầu học hỏi về mạch điện và đã phát minh ra một máy tính khéo léo không yêu cầu sử dụng nút "bằng". Họ gọi nó là "Ký hiệu Ba Lan La Mã"

Để thực hiện tính toán, họ nhập toán hạng của họ trước, sau đó là thao tác.

Ví dụ: 100 + 11 * 20 sẽ là C XI XX * +.

Ngoài ra

Người La Mã đã phát hiện ra rằng họ thường cần thực hiện nhiều phép tính cùng một lúc và muốn phương thức trả về mọi giá trị "trên ngăn xếp" trong một loại cấu trúc giống như mảng / danh sách / tuple. (ví dụ: X I + X I - CC II +sẽ trả lại [11, 9, 202])


Thách thức là phát triển một chương trình máy tính có khả năng thực hiện các tính toán này.

Làm rõ : Cần có ký hiệu trừ. Tôi đã không nhận ra nó không được công nhận tính năng trong đế chế La Mã cổ đại. Do đó, nhiệm vụ này rất mơ hồ và tôi xin lỗi.

Nguyên tắc tối thiểu

  • Đầu ra của bạn sẽ ở dạng số Ả Rập.
  • Bạn chỉ cần chuyển đổi từ Chữ số La Mã lên tới 5000.
  • Bạn sẽ cần hỗ trợ các phép toán +, -, /, * (cộng, trừ, chia và nhân).
  • Việc phân chia là dựa trên dấu phẩy động hay dựa trên số nguyên là cụ thể. Hoặc là làm việc cho thách thức này.
  • Đầu ra của bạn sẽ cần hỗ trợ số lượng lên tới 4 tỷ.
  • Câu trả lời ngắn nhất tổng thể, VÀ trong mỗi ngôn ngữ chiến thắng. Đây là một thử thách Code Code nhưng tôi yêu sự đa dạng.

Trong trường hợp hòa, các yếu tố như hỗ trợ cho các chữ số La Mã trên 5000 hoặc các hoạt động bổ sung sẽ được coi là lần gửi sớm nhất sẽ giành chiến thắng.


1
Chúng ta có thể lấy đầu vào làm danh sách các chuỗi, mỗi chuỗi có một số La Mã hoặc toán tử không?
dùng202729

đầu vào có thể được viết bằng chữ thường hay nó phải là chữ hoa?
dzaima

1
@JesseDanielMitchell Như một lưu ý ... cố gắng không thay đổi quy tắc và làm mất hiệu lực các câu trả lời hiện có . Ngoài ra, (như thường lệ) tôi đề nghị đăng bài trong Sandbox .
dùng202729

Câu trả lời:


6

Python 2 + roman , 118 byte

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

Bản giới thiệu

Nó không thể được kiểm tra trực tuyến vì mô-đun mà nó sử dụng, nhưng bạn có thể xem cách chạy nó ở đây (một chương trình đầy đủ chấp nhận đầu vào từ STDIN - một biểu thức có dấu ngoặc kép - và in đầu ra thành STDOUT - dưới dạng danh sách , ngăn xếp). Sử dụng phiên bản cũ hơn một chút, vì tôi sẽ không bận tâm tạo GIF mới chỉ với một vài byte:

Bản thử nghiệm GIF

Để cài đặt gói, bạn có thể chạy như sau trong Terminal / Command Line:

pip install roman

2
pyTester/Py.pyಠ_ಠ
totallyhuman

@totallyhuman Đó chỉ là một dự án giả mà tôi đã thực hiện chỉ vì điều này ...
Ông Xcoder

6

Haskell , 217 byte

-13 byte nhờ Bruce Forte. -73 byte nhờ rjan Johansen.

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

Hãy thử trực tuyến!

Hướng dẫn thực hiện, yay!


2
Tôi đã cắt nó xuống một chút (rất gần với việc đánh bại Python mới ...) Hãy thử trực tuyến!
Ørjan Johansen

1
Con Python cũng bị cắt giảm. Nhưng nếu lập luận của anh ta rằng ký hiệu trừ không cần được hỗ trợ được giữ nguyên, thì cũng có nhiều khoản tiết kiệm hơn ở đây.
Ørjan Johansen

1
Trong mọi trường hợp, 3 byte khác tắt với l=1:4:5:9:map(10*)l.
31/12/17

Tôi nhớ một mẹo còn lại mà tôi từng tìm thấy để chuyển đổi các chữ số La Mã, nó tự động xử lý phép trừ. Hãy thử trực tuyến!
Ørjan Johansen


2

JavaScript (Nút) + romans + stk-lang , 74 byte

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

Trả về một danh sách các bigintegers.

Chấp hành

Chạy như sau:

npm install romans
npm install stk-lang
node

Sau đó dán chức năng. Thí dụ:

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' ]

Có bao nhiêu người sử dụng lambda như lời nhắc?
Stan Strum

@StanStrum Tôi thích nó và nó là mặc định cho các thiết bị đầu cuối như cmder
Conor O'Brien

Không biết điều đó. Đoán tôi chưa bao giờ đi chệch khỏi $>. Thành thật mà nói, tôi thích nó mặc dù
Stan Strum

2

APL Dyalog , 93 byte

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

Hãy thử trực tuyến!

116 byte không tích hợp sẵn roman


Woah, chưa bao giờ thấy nhiệm vụ được sửa đổi trong một golf trước đây
Zacharý

@ Zacharý đó là cách duy nhất tôi biết để sửa đổi một biến ra khỏi phạm vi dfns của nó, vì vậy nó phải được sử dụng ở đây.
dzaima

Tha thứ cho sự thiếu hiểu biết của tôi, nhưng bài tập được sửa đổi là gì?
caird coinheringaahing

@cairdcoinheringaahing var fn←arr- nó tương đương với var ← var fn arr. Ở đây, nó được sử dụng ở nhiều nơi, a,←⍵là một trong đó gắn vào biếna
dzaima

1

Python 3 , 280 206 byte

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

Hãy thử trực tuyến!

Lần này với sự hỗ trợ ký hiệu trừ. Phương thức clà điểm vào chính; khác là hỗ trợ.

Chỉnh sửa nhật ký:


Bạn không cần các khối thụt sau ifelse.
Ørjan Johansen

Trên thực tế, hãy để tôi cung cấp cho bạn thủ thuật này mà tôi đã từng tìm thấy:n+=v-n%v*2
Ørjan Johansen

1
Bạn cũng có thể kết hợp hai cách strsử dụng. Hãy thử trực tuyến!
Ørjan Johansen

0

JavaScipt (ES6), 152 151 byte

Đã lưu 1 byte nhờ người dùng202729

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

Các trường hợp thử nghiệm

Giải thích (ít chơi gôn)

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

Tôi khá chắc chắn rằng nó 1e3cũng hoạt động và lưu một số byte.
dùng202729

0

Thạch , 82 byte

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

Hãy thử trực tuyến!

Ban đầu được đăng trong trò chuyện .


Giải trình:

Vì Jelly không có stack, nên tôi đặt stack vào thanh ghi.

Khi chương trình bắt đầu, giá trị đăng ký ®0, được xử lý như [0]cho các mục đích của chương trình này.


ị“+-×÷”;”/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 byte

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

Hãy thử trực tuyến!

Bởi vì nó xuất hiện trong các ý kiến ​​của cả câu hỏi và câu trả lời này và có khả năng dẫn đến việc bỏ phiếu: bài nộp này không hỗ trợ ký hiệu trừ. Đặt vấn đề: Ký hiệu trừ thường hiếm khi được sử dụng trong Đế chế La Mã và chỉ được phổ biến sau đó (xem Ký hiệu trừ , đoạn 3, câu cuối). Nhiệm vụ giả định một Đế chế La Mã đã phát triển các mạch tích hợp có thể lập trình, không phải là một trong những trải qua những thay đổi văn hóa giống như châu Âu thế kỷ 13. Mô tả không đề cập đến ký hiệu trừ và không có ví dụ nào sử dụng nó.


Hừm ... bạn không hỗ trợ các số như CIV(104).
Ørjan Johansen

... không thể lỗi logic của bạn ở đó. : P
Ørjan Johansen

2
Agh, bạn đã đúng. Tôi đã không nghĩ về sự mơ hồ có thể xảy ra, tôi không biết ký hiệu trừ là một đặc điểm chung trong đế chế La Mã cổ đại.
Jesse Daniel Mitchell

1
Tôi đã thực sự xem xét việc hỏi về ký hiệu trừ trong OP (và nhận thấy thiếu một ví dụ), nhưng đã bị phân tâm. Nếu bạn nghĩ về sự mơ hồ định nghĩa trong các thách thức trong tương lai, đừng ngần ngại, chỉ cần hỏi (trả lời với một lời cảnh báo và một liên kết đến nhận xét của bạn nên làm nếu bạn muốn đăng). Bây giờ phán quyết là trong bạn nên cố gắng sửa nó :)
Jonathan Allan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.