R [oman | everse] Lehçe Gösterimi


11

Roma İmparatorluğu'nun asla düşmediği ve karanlık çağlara çöküşün asla gerçekleşmediği bir dünyada MDLXVII yılıdır. Pax Romana'nın uzun sürmesi nedeniyle imparatorluğun ekonomik istikrarı teknolojinin hızlı bir şekilde ilerlemesini sağladı.

Romalılar devrelerle uğraşmaya başladılar ve "eşittir" düğmesinin kullanılmasını gerektirmeyen ustaca bir hesap makinesi icat ettiler. Buna "Roma Polonyalı Gösterim" diyorlar

Bir hesaplama yapmak için önce işlenenlerini, ardından işlemi girerler.

Örneğin, 100 + 11 * 20 olurdu C XI XX * +.

bunlara ek olarak

Romalılar genellikle aynı anda birden fazla hesaplama yapmaları gerektiğini bulmuşlardır ve yöntemin "yığındaki" her değeri bir dizi dizi / liste / tuple benzeri yapıda döndürmesini tercih etmişlerdir. (örneğin X I + X I - CC II +geri dönecekti [11, 9, 202])


Zor olan, bu hesaplamaları yapabilen bir hesap makinesi programı geliştirmektir.

Açıklama : Çıkarma Gösterimi gereklidir. Antik Roma imparatorluğunda tanınan bir özellik olmadığını fark etmemiştim. Bu nedenle görev belirsizdi ve özür dilerim.

Minimum Yönergeler

  • Çıktınız Arapça Rakamlarla olacaktır.
  • Sadece Romen Rakamlarından 5000'e kadar dönüştürmeniz gerekir.
  • +, -, /, * işlemlerini (toplama, çıkarma, bölme ve çarpma) desteklemeniz gerekir.
  • Bölümün kayan nokta tabanlı veya tamsayı tabanlı olup olmadığı uygulamaya özgüdür. Her ikisi de bu meydan okuma için çalışır.
  • Çıktınızın 4 Milyar'a kadar sayıları desteklemesi gerekecektir.
  • Genel olarak en kısa cevap VE her dilde kazanır. Bu bir Kod Golf Mücadelesi ama çeşitliliği seviyorum.

Beraberlik durumunda, 5000'in üzerindeki romen rakamları için destek veya ek operasyonlar gibi faktörler , en erken gönderimin kazanacağı kabul edilecektir.


1
Her biri bir Roma numarasına veya bir operatöre sahip olan dizeler listesi olarak girdi alabilir miyiz?
user202729

giriş küçük harfle alınabilir mi yoksa büyük harf olmalı mı?
dzaima

1
@JesseDanielMitchell Not olarak ... kuralları değiştirmemeye ve mevcut cevapları geçersiz kılmaya çalışmayın . Ayrıca, (her zamanki gibi) ben konusu yayınla önermek Sandbox .
user202729

Yanıtlar:


6

Python 2 + roman , 118 bayt

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

gösteri

Kullanıldığı modül nedeniyle çevrimiçi olarak test edilemez, ancak bunu nasıl çalıştıracağını burada görebilirsiniz (STDIN'den girdi kabul eden tam bir program - tırnak işaretleri içeren bir ifade - ve çıktıyı bir liste şeklinde STDOUT'a yazdırma - , yığın). Biraz daha eski bir sürüm kullanır, çünkü sadece birkaç bayt için yeni bir GIF oluşturmak için uğraşmayacağım:

Bölüm GIF

Paketi yüklemek için Terminal / Komut Satırında aşağıdakileri çalıştırabilirsiniz:

pip install roman

2
pyTester/Py.pyಠ_ಠ
totallyhuman

@totallyhuman Sadece bunun için yaptığım sadece bir kukla proje ...
Bay Xcoder

6

Haskell , 217 bayt

Bruce Forte sayesinde -13 bayt. Ørjan Johansen sayesinde -73 bayt.

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

Çevrimiçi deneyin!

Manuel uygulama, yay!


2
Bunu biraz kestim (yeni Python'u yenmeye çok yakın ...) Çevrimiçi deneyin!
Ørjan Johansen

1
Python da kesildi. Ancak, çıkartıcı gösterimin desteklenmesi gerekmediği iddiası desteklenirse, burada da daha fazla tasarruf var.
Ørjan Johansen

1
Her durumda, başka bir 3 bayt ile l=1:4:5:9:map(10*)l.
ბიმო

Bir zamanlar Roma rakamlarını dönüştürmek için bulduğum kalan hileyi hatırladım, bu da çıkarma işlemine otomatik olarak bakıyor. Çevrimiçi deneyin!
Ørjan Johansen


2

JavaScript (Düğüm) + romalılar + stk-lang , 74 bayt

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

Büyük birleştiricilerin listesini döndürür.

infaz

Aşağıdakileri çalıştırın:

npm install romans
npm install stk-lang
node

Ardından işlevi yapıştırın. Misal:

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

Kaç kişi lambda'yı istem olarak kullanıyor?
Stan Strum

@StanStrum Hoşuma gitti ve cmder
Conor O'Brien

Bunu bilmiyordum. Sanırım hiç ayrılmadım $ve >. Dürüst olmak gerekirse, yine de beğendim
Stan Strum

2

Dyalog APL , 93 bayt

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

Çevrimiçi deneyin!

Roma yerleşik olmadan 116 bayt


Woah, daha önce bir golf modifiye atama görmedim
Zacharý

@ Zacharý, bir değişkeni dfns kapsamı dışında değiştirmenin tek yolu bu , burada kullanılması gerekiyordu.
dzaima

Cehaletimi affedin, ama değiştirilmiş ödev nedir?
Caird coinheringaahing

@cairdcoinheringaahing var fn←arr- buna eşdeğerdir var ← var fn arr. İşte, birden fazla yerde kullanılan a,←⍵ekler biri olma değişkenea
dzaima

1

Piton 3 , 280 206 bayt

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

Çevrimiçi deneyin!

Bu kez çıkarıcı gösterim desteği ile. Yöntem cana giriş noktasıdır; diğeri destek.

Günlüğü düzenle:

  • 74 aşağı Ørjan sayesinde

ifVe sonrasında girinti bloklarına ihtiyacınız yoktur else.
Ørjan Johansen

Aslında, bir zamanlar bulduğum hileyi size n+=v-n%v*2
sunmama

1
İki strkullanımı da birleştirebilirsiniz . Çevrimiçi deneyin!
Ørjan Johansen

0

JavaScipt (ES6), 152 151 bayt

User202729 sayesinde 1 bayt kaydedildi

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

Test senaryoları

Açıklama (daha az golf sahası)

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

Bunun 1e3da işe yaradığından ve bayt kaydettiğinden eminim .
user202729

0

Jöle , 82 bayt

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

Çevrimiçi deneyin!

Başlangıçta sohbette gönderildi .


Açıklama:

Jelly'in bir yığını olmadığından, yığını kayıt defterine koydum.

Program başlatıldığında, kayıt değeri ®olduğu 0gibi muamele edilir, [0]bu program amaçları için.


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

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

Çevrimiçi deneyin!

Hem sorunun hem de bu cevabın yorumlarında ortaya çıktığı ve muhtemelen oyların azalmasına yol açtığı için: bu sunum çıkarıcı gösterimi desteklemiyor. Gerekçe: Çıkarma gösterimi Roma İmparatorluğu'nda nadiren kullanıldı ve ancak daha sonra popüler hale getirildi (bkz. Çıkarma Gösterimi , paragraf 3, son cümle). Görev, 13. yüzyıl Avrupa'sı ile aynı kültürel değişimlere uğrayanlardan değil, programlanabilir entegre devreler geliştiren bir Roma İmparatorluğu olduğunu varsayar. Açıklama, çıkartıcı gösterimden bahsetmez ve örneklerin hiçbiri bunu kullanmaz.


Hm ... CIV(104) gibi sayıları desteklemiyorsunuz .
Ørjan Johansen

... orada mantığınızı bozamaz. : P
Ørjan Johansen

2
Agh, haklıydın. Olası belirsizliği düşünmemiştim, çıkarılan gösterimin Antik Roma imparatorluğunda ortak bir özellik olmadığının farkında değildim.
Jesse Daniel Mitchell

1
Aslında OP altında çıkarıcı gösterimi sormayı düşündüm (ve bir örnek eksikliğini fark ettim), ama dikkatim dağıldı. Gelecekteki zorluklarda tanım belirsizliklerini düşünüyorsanız, tereddüt etmeyin, sadece sormak (bir uyarı ile cevap vermek ve yorum göndermek için bir bağlantı yapmak gerekir). Şimdi bir karar var düzeltmeye çalışmalısın :)
Jonathan Allan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.