目標:
数値を入力として受け取り、その数値の短縮ローマ数字を出力として返す関数を作成します。
ローマ数字記号:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
「速記ローマ数字」と言うときの意味の例として、1983年を表すローマ数字を見つけることを考えてみましょう。それは私が生まれた年だからです。1つのオプションは、これを通常の方法(10文字)で行うことです。
1983 = MCMLXXXIII =(1000-100 + 1000 + 50 + 30 + 3)
もう1つのオプションは、簡単な方法(6文字)で行うことです。
1983 = MXVIIM =(1000-(10 + 10)+ 1000 + 3)
これが何を意味するか知っていますか?!?!! ?? 私がローマ人だったら、生年月日を書くたびに4文字を節約できたでしょう!うおう!
しかし、興奮する前に、書くべき質問があります。したがって、おそらく、同じページにいるように、速記のローマ数字のルールを定義する必要があります。
ショートハンドローマ数字ルール:
- 考慮すべき文字がなくなるまで、シンボルを常に左から右に検討してください。
- 現在のシンボルの右側に、より高い値のシンボルがない場合:
- 現在のシンボルの値をこのローマ数字の積算合計に追加します。
- 検討しているシンボルの右側に、より高い値のシンボルがある場合:
- 現在のシンボルの右にある右端の最高値のシンボルを見つけます
- その記号までのすべての文字を1つのローマ数字と見なします
- これらの手順を使用して、そのローマ数字の値を計算します
- このローマ数字の積算合計からそのローマ数字の値を引きます。
- 検討したグループの次の記号に移動します
- 各ローマ数字には、少なくとも1つの記号が必要です。
- それでおしまい!これらのルールに従うものはすべて受け入れられます!
例:
IIIIV = (-(1+1+1+1)+5) = 1 //Don't ask me why you'd want to do this!
VVX = (-(5+5) + 10) = 0 //Who said you couldn't represent 0 with roman numerals?!!?
VVXM = (-(-(5+5) + 10) + 1000) = 1000 //Again...don't ask me why you'd want to do this!
MXIIXMI = (1000-(10-(1+1)+10)+1000+1) = 1983 //Ahhh...such a great year :)
質問ルール:
上記のルールを使用して、入力として単一の数値を受け取り、その数値のローマ数字を出力として返す関数を作成します。この関数のcodeGolfScoreを計算します。
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
ルール1の関数を使用して、-1000(そう、NEGATIVE 1000)と3000の間のローマ数字を生成します。次に、これらのローマ数字の文字の長さを合計して、totalCharacterCountを取得します。明確にするための擬似コードを次に示します。
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- 最も低いfinalScoreが勝ちます!
注:totalCharacterカウントは1万+以上になるため、文字長アルゴリズムが最優先されるはずです。コードゴルフのスコアは、複数のユーザーが互いに最適なアルゴリズムを見つけた場合のタイブレークです。
明日はMMXIIのお祝いをお楽しみください!!!
""
許可されていますか、それともVVX
同等のものを使用する必要がありますか?
IXV = -(-1 + 10) + 5 = -4
(右端の勝ち)、またはIXV = -1 + 10 + 5 = 14
(最高価値の勝ち)ですか?
DDDDM
略-1000
?