Romen Rakamlı Çizgi Segmentleri


10

Girdi olarak 1..3999 aralığında bir tamsayıyı kabul eden ve bu tamsayıyı standart Romen rakamlarında ifade etmek için gereken satır segmentlerinin sayısını döndüren bir program veya işlev yazın (böylece XL değil, VM kullanacaksınız). Örnekler:

   1 -> 1
   4 -> 3
   5 -> 2
   9 -> 3
  10 -> 2
  40 -> 4
  50 -> 2
  90 -> 3
 100 -> 1
 400 -> 3
 500 -> 2
 900 -> 5
1000 -> 4

Roma sayı dönüştürme builtins edilir kullanılabilir, ancak tekrar tekrar yukarıdaki listeden büyük kalan sayı çıkarılarak onlarsız sorunu çözebilir. Örnek: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.

Bu , bu yüzden en kısa program kazanır.


Neden dört yerine 10 iki satır segmenti var? X yazarken, genellikle yalnızca iki satır yazarsınız, ancak satırların kesişmesi onu dört bölüm yapmaz mı?
Alex

@AlexA. Çizgi parçasının tanımı genellikle şuna benzer: "İki nokta arasındaki en kısa yolu izleyen nokta kümesi". X'i buna göre kesmek için herhangi bir neden yok gibi görünüyor, onu tanımlamak için sadece iki bitiş noktasına ihtiyacınız var. (Romalıların öncelikle öklid geometrileri üzerine yazdığını varsayarsak, sanırım)
FryAmTheEggman

@FryAmTheEggman Hm tamam. Bilmek güzel, teşekkürler.
Alex

Yanıtlar:


2

Pyth, 92 76 70 bayt

KsMc."/9hæ²z³Þ§ªW×Oû[Tnè,O¤"\/WQ=Q-Q=Nef!>TQ%2K aY@KhxKN;sY

Burada deneyin!

@FryAmTheEggman bana bazı bayt kurtardı bazı dize paketleme önerileri için teşekkürler!

Hala bu listeyi kodlamanın matematiksel bir yolu olup olmadığını merak ediyorum. Bir şey bulmaya çalışacağım.

açıklama

Bu, verilen algoritmayı kullanır. K, verilen listeyi sırayla numaralar ve uygun sayıda satır segmenti ile birlikte içerir. Bu liste 0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4, /her öğenin kodunun çözülmesi , açılması ve bir tamsayı ile eşleştirilmesi için paketlenmiş bir dizenin bölünmesiyle oluşturulur .

KsMc. "..." \ / WQ = QQ = Nef!> TQ% 2K aY @ KhxKN; sY # Q = giriş

   c. "..." \ / # dizeyi / üzerine böl
KsM # int için her sayıyı eşler ve K'ye atar
            WQ # ise Q! = 0
                     f% 2K # sadece K'nin her iki elemanını alır ve T ile filtreler
                      !> TQ # T <= Q
                  = Ne # Bunun son öğesini al ve N'ye ata
              = QQ # Q = Q - N
                                   xKN #, K'de N'nin ilk ortaya çıkışının endeksi
                                  h # çizgi segmentlerini istediğimiz için bu dizini artırır
                              aA @ K # bu segmentten çizgi segmentini al ve Y'ye ekle
                                      ; sY # döngüyü sonlandırır ve Y'deki tüm çizgi parçalarının toplamını yazdırır

3

C, 148129 karakter

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};f(c){while(d+=(c/n[x])*n[x+13],c%=n[x++]);return d;}

İlk kodum golf: ^). Soru bir işlevi kullanabileceğimi belirttiğinden, bazı karakterleri kırpmak için ana işlevi değiştirdim (en önemlisi: c yerine scanf parametresi olarak geç)

paketlenmemiş

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};
f(c){
  while(d+=(c/n[x])*n[x+13],
        c%=n[x++]);
  return d;
}

2

Mathematica, 80 72 bayt

Tr[Characters[#~IntegerString~"Roman"]/.{"I"|"C"->1,"M"->4,_String->2}]&

Sayıları Romen rakamlarına dönüştüren, her karakteri kendi segment sayısı ile değiştiren ve toplamı alan anonim işlev.


2

Retina, 128 bayt

. +
, $ *
1 {1000}
t'
1 {900}
td
1 {500}
d
1 {400}
t
1, {100}
'
1 {90}
t
1 {50}
d
1 {40}
t'
1 {10}
d
1 {9}
t
1 {5}
d
1 {4}
t
1
'
t
d'
d
''
'+
$ 0,0

Değiştirilecek bir şey kalmayıncaya kadar basit değiştirme. Sonra kesme işaretleri sayılır ve bu bizim çizgi segmentlerimizin sayısıdır.

Tekli giriş ve çıkışa izin verilirse, 115 bayttır (1234 olanı kim yazmak ister?).

Çevrimiçi deneyin!
Çevrimiçi deneyin! (tekli ES)


2

Python 3, 95 bayt

def f(a,b=0):
 for e in'᝴ᔝ஺ॣəȟĮô>9 ':e=ord(e);d=e//6;b+=a//d*(e%6);a%=d
 return b

Unicode dizesi kod noktalarından oluşur:

6004 5405 3002 2403 601 543 302 244 62 57 32 27 7

Bu dizgiyi bir bayt değişmezine e=ord(e);
çevirirseniz

Benim durumumda işe yaradığını sanmıyorum. Bir Unicode dizeye ihtiyacım var :( yani baytlar üzerinde değil, bu dizede kod noktaları üzerinde döngü.
Lynn

1
Ah anlıyorum. Dizenin onaltılık dökümünü almayı düşünür müsünüz? Telefonumda düzgün görüntülenmiyor.
Mart'ta xsot

1

Java, 152 bayt

Çünkü biliyorsunuz Java.

n->{int c=0;int[]r={999,4,899,5,499,2,399,3,99,1,89,3,49,2,39,4,9,2,8,3,4,2,3,3,0,1};for(int i=0;i<26;i+=2)while(n>r[i]){n-=r[i]+1;c+=r[i+1];}return c;}

Verilen algoritmanın basit gerçek uygulaması. Dizi dönüştürme bilgilerini paketler: dizinler bile romen rakamından daha azdır ve tek dizinler bu rakam için sayımdır.

Bu bir int/ alır ve döndüren bir lambda Integer. Buna IntUnaryOperatorveya UnaryOperator<Integer>.


1

JavaScript (ES6), 79 bayt

n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4

Dizeler, birimler, onlarca ve yüzlerce basamak için satır segmentlerinin sayısını temsil eder. (Binler, binlerce rakamın sadece dört katıdır.) Bu yöntem, soruda önerilen algoritma gibi diğer seçeneklerden daha kısa görünüyor.

Düzenleme: @ user81655 sayesinde 2 bayt kaydedildi.


Bu harika bir algoritma. n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
Yayınların

@ user81655 Oh, bu güzel: +s'yi s olarak değiştirmek öncüyü -kaldırmama izin veriyor +, ancak gruplama başka bir bayt kaydediyor.
Neil
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.