整数は時間を行き来します


17

入力:

整数。

出力:

  1. 最初に整数を同等のローマ数字に変換します。
  2. 次に、そのローマ数字の各大文字をASCII / UNICODE 10進数値に変換します。
  3. そして、それらの合計を出力します。

例:

1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input                                ^ output

ローマ数字:これは、おそらく便利なローマ数字コンバータです。
ここに画像の説明を入力してください

チャレンジルール:

  • 標準のローマ数字の規則が適用されるため、and 。*のような、IIIIまたはVIIII代わりの代替形式はありません。IVIX
  • 1,000を超えるローマ数字の上のマクロン線は¯(UNICODE nr。175)です。したがって、1行は+175としてカウントされ、2 行はとしてカウントされ+350ます。
  • 整数を表す限り、あらゆる種類の入力および出力タイプを使用できます。
  • テストケースはの範囲にあり1 - 2,147,483,647ます。

*ローマ数字の規則(Wikipediaからの引用):

番号は、シンボルを組み合わせて値を加算することで形成されるためII、2(2つ)とXIII13(10と3つ)になります。各数字は10、100などの倍数を表すのではなく、位置に応じて固定値を持っているため、207や1066のような数字のようにゼロを「配置維持」する必要はありません。それらの数字は、CCVII(200、5、2)とMLXVI(1000、50、10、5、1)と書かれています。

シンボルは、値の大きい順に左から右に配置されます。ただし、いくつかの特定のケースでは、4文字が連続して繰り返されるのを防ぐために(IIIIまたはなどXXXX)、減算表記法が次のように使用されることがよくあります。

  • I1つ前に配置されるVX、1つ少ないことを示すため、4つはIV(5つ未満)、9つはIX(1つ未満)
  • X10の前LまたはC10未満を示すため、40はXL(50未満10)、90はXC(100未満10)です。
  • C前に配置DまたはM400であるので、より少ない百示すCD(数百未満500)と九百であるCM(数百未満千以上)
    例えば、MCMIV1904 1904である(M千あるCMれます九百IV四です)。

ローマ数字の近代的な使用のいくつかの例としては、
1954年のようにMCMLIV、1990としてMCMXC; SOURCEとして2014MMXIV

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターを持つ関数/メソッド、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

100          ->   67
1            ->   73
4            ->   159
22           ->   322
5000         ->   261
2016         ->   401
1000000000   ->   427
1991         ->   449
9999         ->   800
1111111111   ->   2344
2147483647   ->   5362


1
@martin 9999- > M(X)CMXCIX- > 77+263+67+77+88+67+73+88- > 8002147483647- > ((MMCXLV)MMCDLXXX)MMMDCXLVII- > 427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73- > 5362。だから私は2番目を修正しましたが、それ9999は正しかったです。
ケビンCruijssen 16

1
テストケース2222222222が指定された範囲内にありません。また、私も同意し5362ます。
ニール

1
タイトルは、Stack Overflow Cの質問のように聞こえます。
user6245072

3
タイトルの「4番目」という単語はしゃれですか?そうでない場合は、「forth」にする必要があります。
モンティハーダー

回答:


4

Mathematicaの、181の 173 166 151バイト

ゴルフ

(q=Select[ToCharacterCode@#,64<#<99&]&/@StringSplit[RomanNumeral[#],"_"];p=PadLeft;l=Length;Total[p[q,4]+p[{350,350*Mod[l@q,2],175,0}[[-l@q;;]],4],2])&

非ゴルフ

(
q = Select[
     ToCharacterCode@#,
     64<#<99&
    ]&/@StringSplit[RomanNumeral@#,"_"];
p=PadLeft;
l=Length;
Total[
   p[q,4]+
   p[{350,350*Mod[l@q,2],175,0}[[-l@q;;]],4]
   ,2]
)&

MathematicaのRomanNumeral実装は9999に対して(IX)CMXCIXを与えるため、プログラムはその数に対して971を返します。

書かれているように、タイプ((...))(...)...のローマ数字は、長さ4((...))...のローマ数字のASCIIコードのネストされたリストを返します。は、長さ3のリストを返します(...)...は長さ2のリストを返し、...は長さ1のリストを返します。最後の行は、これらのルールを、リスト、それらのマクロンを追加し、ネストされたリスト全体を合計して出力を返します。


1
PPCGへようこそ!
-betseg

@betsegありがとう!これは楽しい最初の問題でした。
ヒグストンレインバード

10

Pythonの3、281の 278 273 269バイト

codegolfでの私の最初の試み、ここに行きます。リンクされた質問を見ずにそれをしようとしたので、おそらくひどいです:)

def f(n):d=len(str(n))-1;l=10**d;return 0if n<1else(n<l*4and[73,88,67,77,263,242,252,438,417,427][d]+f(n-l))or(l<=n//9and[161,155,144,340,505,494,690,855,844][d]+f(n-9*l))or(n<l*5and[159,164,135,338,514,485,688,864,835][d]+f(n-4*l))or[86,76,68][d%3]+(d//3*175)+f(n-5*l)

GáborFeketeのおかげで8バイト小さく

ゴルフをしていない:

def f(n):
d = len(str(n)) - 1 # number of digits minus one
l = 10 ** d         # largest power of 10 that is not larger than parameter
if n == 0:
    return 0
elif n < 4 * l: # starts with X, C, M, ...
    return [
        ord('I'),
        ord('X'),
        ord('C'),
        ord('M'),
        ord('X') + 175, 
        ord('C') + 175, 
        ord('M') + 175, 
        ord('X') + 350, 
        ord('C') + 350, 
        ord('M') + 350
    ][d] + f(n - l)
elif n // 9 * 10 >= 10 * l: # starts with IX, XC, ...
    return [
        ord('I') + ord('X'), 
        ord('X') + ord('C'), 
        ord('C') + ord('M'),
        ord('M') + ord('X') + 175,
        ord('X') + ord('C') + 350,
        ord('C') + ord('M') + 350,
        ord('M') + ord('X') + 525,
        ord('X') + ord('C') + 700,
        ord('C') + ord('M') + 700
    ][d] + f(n - 9*l)
elif n < 5 * l: # starts with IV, XL, CD, ... 
    return [
        ord('I') + ord('V'),
        ord('X') + ord('L'),
        ord('C') + ord('D'),
        ord('M') + ord('V') + 175,
        ord('X') + ord('L') + 350,
        ord('C') + ord('D') + 350,
        ord('M') + ord('V') + 525,
        ord('X') + ord('L') + 700,
        ord('C') + ord('D') + 700
    ][d] + f(n - 4 * l)
else: # starts with V, L, D, ...
    return [
        ord('V'), 
        ord('L'), 
        ord('D'),
        ord('V') + 175, 
        ord('L') + 175, 
        ord('D') + 175,
        ord('V') + 350, 
        ord('L') + 350, 
        ord('D') + 350
    ][d] + f(n - 5 * l)

することができます置き換えることにより、いくつかのバイトのゴルフreturn 0 if n==0 elsereturn 0if n<1else
ガーボルFekete

f関数の名前がの場合、ゴルフバージョンにはが呼び出されgます。
ガボールフェケテ

に変更n//9*10>=10*ln//9>=lてさらに保存します。
ガボールフェケテ

関数名を修正し、正しくゴルフしたかどうかを確認するために変更し、元に戻すのを忘れました。
jDomantas


3

Mathematica、198バイト

Tr[Tr@Flatten[ToCharacterCode/@#]+Length@#*Tr@#2&@@#&/@Partition[Join[SplitBy[Select[Characters@#/."\&"->1,MemberQ[Join["A"~CharacterRange~"Z",{1}],#]&],LetterQ]/. 1->175,{{0}}],2]]&@RomanNumeral@#&

残念なことに、ビルトインはここではあまり役に立ちませんが、これはもっともっとゴルフできると確信しています。

注:ここで評価9999 -> 971ます


2

バッチ、373バイト

@echo off
set/an=%1,t=0,p=1
call:l 73 159 86 161
call:l 88 164 76 155
call:l 67 135 68 144
call:l 77 338 261 340
call:l 263 514 251 505
call:l 242 485 243 494
call:l 252 688 436 690
call:l 438 864 426 855
call:l 417 835 418 844
call:l 427 0 0 0
echo %t%
exit/b
:l
set/ad=n/p%%10,p*=10,c=d+7^>^>4,d-=9*c,t+=%4*c,c=d+3^>^>3,d-=5*c,t+=%3*c+%2*(d^>^>2)+%1*(d^&3)

値1,4,5および9で使用する場合は、ルックアップテーブルに従って番号の各桁を変換することによって動作しM(V)M(X)(M(V))および(M(X))。ご希望の場合は(IV)(IX)((IV))そして((IX))その後、使用call:l 77 509 261 511してcall:l 252 859 436 861それぞれ。


1

JavaScript(ES6)、183バイト

f=(n,a=0)=>n<4e3?[256077,230544,128068,102535,25667,23195,12876,10404,2648,2465,1366,1183,329].map((e,i)=>(d=e>>8,c=n/d|0,n-=c*d,r+=c*(e%256+a*-~(i&1))),r=0)|r:f(n/1e3,a+175)+f(n%1e3)

注:好むばかり(IV)M(V)、だけでなく、好み(VI)(V)M。実際には、番号の先頭でのみMを使用します。


1

Python、263バイト

def g(m):x=0;r=[73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427,0,0];return sum([b%5%4*r[i+(i*1)]+((b==9)*(r[i+(i*1)]+r[(i+1)*2]))+((b==4)*(r[i+(i*1)]+r[i+1+(i*1)]))+((b in [5,6,7,8])*r[i+1+(i*1)])for i,b in enumerate(map(int,str(m)[::-1]))])

PPCGへようこそ、最初の回答です。

1

R、115バイト

だから...私は質問を非常に興味深いと思うので、ソリューションを投稿しています。私はと私の最善を尽くしたR "パッケージなしローマ数字に対処するための能力を:あなただけの入力数字の間にすることができます1し、3899として、as.romanドキュメントは説明しています。

そのため、ループ内で1toの範囲を指定することで少しcheしました。これは、output()の長さです。 実際、このWebサイトによると、最長のローマ数字は(14文字)で、これはに対応します。11 14foras.roman(3899)MMMDCCCXCIX
MMDCCCLXXXVIII2888

さらに、lengthこの関数の出力を計算することはできません。

a=scan();v=0;for(i in 1:14){v=c(v,as.numeric(charToRaw(substring(as.character(as.roman(a)),1:14,1:14)[i])))};sum(v)

上記の問題に対処するための解決策を誰かが見つけたら、気軽にコメントしてください。


0

Python 3、315バイト

def p(n=int(input()),r=range):return sum([f*g for f,g in zip([abs(((n-4)%5)-1)]+[t for T in zip([((n+10**g)//(10**g*5))%2for g in r(10)],[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)])for t in T],[73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427])])

ゴルフされていないバージョン:

def p(n=int(input()),r=range):
    return sum([f*g for f,g in zip(
        [abs(((n-4)%5)-1)]+
        [t for T in zip(
            [((n+10**g)//(10**g*5))%2for g in r(10)],
            [(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
        )for t in T],
        [73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427])])

説明: このバージョンは異なるアプローチを使用し、数字の中のローマ数字の出現をカウントします。

[abs(((n-4)%5)-1)]Iローマ数字のs の数です。

[((n+10**g)//(10**g*5))%2for g in r(10)]数値のV,L,D,(V),(L),(D),((V)),((L)),((D))sの数です。

[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]数の中のX,C,M,(X),(C),(M),((X)),((C)),((M))sの数です。

次に、オカレンスに文字の値を乗算し、その合計を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.