Romen Rakamına Dönüştür!


13

Senin görevin verilen bir pozitif tamsayıyı Arap rakamından Roma rakamına dönüştürmektir.

4000'e düştüğünüzde işler zorlaşıyor.

Romalılar bunu, sembolü sembolle çarpmak için sembol üzerine bir çizgi ekleyerek yaptılar 1 000. Ancak, ASCII'de genel hatlar tam olarak görüntülenemez. Ayrıca, bir simgeyi çarpmak için çift üst çizgi 1 000 000ve ardından bir simgeyle çarpmak için üç üst çizgi vardır 1 000 000 000, vb.

Bu nedenle, üst çizgileri değiştirmek için parantez kullanmaya karar verdim .

Semboller ayrı ayrı parantez içine yerleştirilebilir. Örneğin, hem (VI)ve hem (V)(I)de geçerli temsilleridir 6 000. (V)M6000'in geçerli bir temsilidir.

(I)geçerli bir temsil yoludur 1 000.

testcases

Input: 1
Output: I
Input: 2
Output: II
Input: 3
Output: III
Input: 4
Output: IV
Input: 15
Output: XV
Input: 40
Output: XL
Input: 60
Output: LX
Input: 67
Output: LXVII
Input: 400
Output: CD
Input: 666
Output: DCLXVI
Input: 3000
Output: MMM
Input: 3999
Output: MMMCMXCIX
Input: 4000
Output: M(V)
Input: 4999
Output: M(V)CMXCIX
Input: 6000
Output: (VI)
Input: 6000000
Output: ((VI))
Input: 6006000
Output: ((VI)VI)
Input: 6666666666
Output: (((VI)DCLXVI)DCLXVI)DCLXVI

puanlama

Bu . Bayt kazanmak için en kısa kod.


1
Bunun neden yinelenmediği için gerekçe spesifikasyonu tıkar. IMO olmasaydı daha iyi olurdu.
Mego

Gerekçeyi nereye eklerim?
Leaky Nun

1
Dışarıda bırak. Birisi bunun yinelenip yinelenmediğini soruyorsa, tartışmayı yorumlarda veya sohbette yapın.
Mego

@Mego Bitti. :-)
Leaky Nun

Kabul (IV)edilebilir bir 4000 temsili midir?
Neil

Yanıtlar:


9

Mathematica, 67 bayt

Fold["("<>#<>")"<>#2&,RomanNumeral[#~IntegerDigits~1000]/."N"->""]&

MGirişi temel 1000'e dönüştürerek ve her bir basamağı ayrı ayrı dönüştürerek tüm sorunlardan kaçınır RomanNumeral. Sonra onları (...)soldan yerleştirerek katlarız .

Ne yazık ki, Mathematica sıfırları temsil ediyor, Nbu yüzden onlardan kurtulmamız gerekiyor.


1
darn mathematica ile yerleşik için her şey> :(
OldBunny2800

1
@ OldBunny2800 Yine de bu herhangi bir golf dilleri tarafından dayak olmasa şaşırırdım.
Martin Ender

@ OldBunny2800 Ve bunu elde etmek için gerçek paraya mal oluyor. Bu kötü.
Erik the Outgolfer

@ MartinBüttner Basitçe RomanNumeralyapabileceğini düşündüm ?
Sızan Rahibe

1
@KennyLau Bu çıktı MMMMiçin 4000, sadece spec için çalışmaya başlar 5000(ve sonra aynı sorunu 4000000vb için olsun ). O zaman bile, parantez yerine overbar kullanır. Eğer bu konuda iyiyseniz, bunu meydan okuma şartnamesinde söylemelisiniz.
Martin Ender

7

JavaScript (ES6), 136 bayt

f=n=>n<4e3?"M1000CM900D500CD400C100XC90L50XL40X10IX9V5IV4I1".replace(/(\D+)(\d+)/g,(_,r,d)=>r.repeat(n/d,n%=d)):`(${f(n/1e3)})`+f(n%1e3)

4000'in altındaki sayılar için, her Roma "harfini" Roma "harfleri" listesini ve ondalık değerlerini kullanarak mümkün olduğunca çok tekrarlayın. Aksi halde 1000 ile bölme ve modulo'dan gelen cevabı tekrar tekrar oluştururlar. Neyse ki repeatkısalır, bu yüzden kendim yapmak zorunda değilim.


3

Yaygın Lisp, 108

(defun p(n)(if(> n 0)(if(< n 4000)(format()"~@R"n)(format()"(~A)~@[~A~]"(p(floor n 1000))(p(mod n 1000))))))

Ungolfed

(defun p(n)
  (if (> n 0)
      (if (< n 4000)

          ;; Built-in Roman formatter (between 1 and 3999)
          (format () "~@R" n)

          ;; Divide N by 1000, as 1000*Q + R.
          ;; First print (p Q) in parentheses (recursively)
          ;; Then, if it is not NIL, the remainder R.
          (format () "(~A)~@[~A~]"
                  (p (floor n 1000))
                  (p (mod n 1000))))))

Testler

İki test sorudan farklı çıktılar verir:

(loop for (in out) in '((1 "I")
                        (2 "II")
                        (3 "III")
                        (4 "IV")
                        (15 "XV")
                        (40 "XL")
                        (60 "LX")
                        (67 "LXVII")
                        (400 "CD")
                        (666 "DCLXVI")
                        (3000 "MMM")
                        (3999 "MMMCMXCIX")
                        (4000 "M(V)")
                        (4999 "M(V)CMXCIX")
                        (6000 "(VI)")
                        (6000000 "((VI))")
                        (6006000 "((VI)VI)")
                        (6666666666 "(((VI)DCLXVI)DCLXVI)DCLXVI"))
   for computed = (p in)
   unless (string= out computed)
   collect (list in out computed))

=> ((4000 "M(V)" "(IV)")
    (4999 "M(V)CMXCIX" "(IV)CMXCIX"))

2

R, 134

m=1000;x=scan();while(x[1]>=m)x=c(floor(x[1]/m),x[1]%%m,x[-1]);cat(rep("(",length(x)),sep="");cat(as.character(as.roman(x)),sep=")")

Hemen hemen en iyi seçenek değil, ama fikrin buna oldukça benzer olması gerektiğini düşünüyorum.


1

Python, 188194

Bazı boşluklardan kurtulmak için -6 bayt

Bu zorluk beni programlamayı ilk öğrendiğim zamana getirdi ...

def f(x,s=zip("M CM D CD C XC L XL X IX V IV I".split(),[1e3,900,500,400,100,90,50,40,10,9,5,4,1])):
 r=""if x<4e3else"("+f(x/1e3)+")";x%=1e3
 for a,b in s:
    while x>=b:r+=a;x-=b
 return r

En kısa çözüm olmayabilir, ama bu problemi golf oynadım.

Denemek!


1

Yakut, 137 134 130 bayt

Dizeyi döndüren özyinelemeli işlev. Mümkünse sayısal kodlamaları biraz daha aşağı golf etmeye çalışıyorum, ama nasıl emin değilim.

Maalesef, şu anda @ Neil'in ES6 cevabının doğrudan bir limanı.

f=->x{(x<t=1e3)?"CM900D500CD400C100XC90L50XL40X10IX9V5IV4I1".gsub(/(\D+)(\d+)/){v=$2.to_i;s=x/v;x%=v;$1*s}:"(#{f[x/t]})#{f[x%t]}"}

1

Yakut, 185161144 bayt

r=->i{i>(t=1e3)? "(#{r[i/t]})"+r[i%t]:(s=?I*i;"IVXXLCCDM".scan(/(.)(.)(.)/){|x,y,z|{x*5=>y,x*4=>x+y,y*2=>z,y+x+y=>x+z}.map{|x,y|s.gsub!x,y}};s)}

Orijinal gönderiden bir yıl sonra, golf hakkında bir şeyler öğrendiğimi düşünüyorum.

Değerli yorumlarınız için teşekkür ederiz Mürekkep Değer.


gsubbir dizgiyi ilk argüman olarak alabilir ve ikame ihtiyacını bir regex modeline s.gsub! x,yotomatik olarak ayırdığı için kaldırabilir . Bunun dışında, adizinizin atamasını sadece bir kez kullandığınızdan vazgeçebilir ve doğrudan each_sliceçağrıya koyabilirsiniz .
Değer Mürekkebi

"IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...çok çalışıyor
Value Ink

Ayrıca r[x], r.(x)stabi lambdalar dahil olduğunda işlevsel olarak eşdeğerdir
Value Ink

@ValueInk teşekkür ederim. Bu r[x]hile yakut tüm futer özyinelemeli golf için yararlı olacak!
MegaTom

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.