ローマにいるとき、ローマ人のように数えますか?


20

バックグラウンド

この課題は、次の図を公開しているこの Webサイトから着想を得ています。

ここに画像の説明を入力してください

この図は、250未満のローマ数字の最長表現が188であり、表現するのに9つの数字が必要であることを示しています。

チャレンジ

ほとんどのローマ数字を表現するために使用される標準的な記号は以下の通りである:{ IVXLCDM}、文字の数値である場合M= 1000 D= 500 C= 100 L= 50、X= 10、V= 5、I= 1。

この課題の目標は、正の整数nが与えられた場合n個の標準シンボルを連結して構成できる有効なローマ数字表現の数を計算することです。

次に、プログラムはこの計算の結果を出力する必要があります!

入力:正の整数n

出力:長さnの有効なローマ数字表現の

ローマ数字表現の規則

ローマ数字はもともと「加算」ペアのみでした。つまり、数字は常に降順で書き込まれ、すべての数字の値の合計は数字の値でした。

後に、減算ペアリング、より大きな数字の前に小さな数字を配置して、大きな数字から小さな数字を減算する使用が、ローマ数字の表現を短縮するために一般的になりました。次の無効な式のように、減算ペアは連鎖できませんIXL

以下は、加算と減算のペアリングに関する現代のルールです。

  1. 1つのI、X、およびCのみが減算ペアの一部の先頭の数字として使用できます。
  2. 減算ペアのVまたはXの前にのみ配置できます。
  3. Xは、減算ペアのLまたはCの前にのみ配置できます。
  4. Cは、減算ペアのDまたはMの前にのみ配置できます。
  5. 減算ペア以外の数字は降順でなければなりません(つまり、各減算ペアの先頭の数字をドロップすると、数字は降順になります)。
  6. M、C、およびXは、より小さい額種で同等または超過することはできません。
  7. D、L、およびVはそれぞれ1回だけ表示できます。
  8. Mのみを4回以上繰り返すことができます。

さらなる注記

  • バー表記は使用しません。むしろ、Mを追加して任意の数を表現します。

  • これらは、ローマ数字について従う唯一の規則です。つまり、などの奇数の式IVIもシステムで有効と見なされます。

  • また、一部の数値には複数の式があるため、長さnの式を持つ数値の数はカウントしないことに注意してください。代わりに、有効な式の数のみをカウントしています。

テストケース

17

231

3105

上記を手動で確認したので、テストケースを再確認し、可能であれば追加してください。

受賞基準

これは挑戦なので、楽しんでください!少なくとも1〜9の入力を処理できるソリューションのみを受け入れます。それ以上はボーナスです!

編集

コメンターの要求に応じて、以下を見つけるか、このペーストビンリンクで、n = 3 としてカウントした105のコンボ

III IVI IXI IXV IXX VII XII XIV XIX XVI XXI XXV XXX XLI XLV XLX XCI XCV XCX XCL XCC LII LIV LIX LVI LXI LXV LXX CII CIV CIX CVI CXI CXV CXX CXL CXC CLI CLV CDX CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CDC CMI CMV CMX CML CMC CMD CMM DII DIV DIX DVI DXI DXV DXX DXL DXC DLI DLV DLX DCI DCV DCX DCL DCC MII MIV MIX MVI MXI MXV MXX MXL MXC MLI MLV MLX MCI MCV MCX MCL MCC MCD MCM MDC MML MDC MDL MMV MMX MML MMC MMD MMM

編集2:

結果を確認するには、ジョナサンアランの厚意により、次のゴルフ以外のコードを使用します。

編集3:

このチャレンジのすべてのエラーについておIび申し上げます。次回はもっと良い仕事をするようにします!


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
メゴ

回答:


3

網膜、111バイト

~(`.+
*$(CM)CDXCXCXCXLIXIXIXIVII
.(.)
.+¶$$&$¶$$&$1$¶$$&$&¶L`.{0,$+}\b¶D`¶
¶$
¶.+¶$$&$¶$$&I¶L`[A-Z]{$+}\b¶D`¶.+

オンラインでお試しください!私はあなたが唯一のサブトラクティブの各使用できることを意味するために1を支配誤解として、これは完全に書き直されIXそしてをC。説明:スクリプトの最初の部分は、入力をCMペアの文字列に展開し、その後に他の可能な減算ペアが続きます。各ペアはオプションであり、各ペアの最初の文字もペア内でオプションです。3番目の段階では、ペアのリストをRetinaコマンドのリストに展開し、入力を取得して、ペアの2番目または両方の文字のオプションを使用して3つのコピーを作成し、結果をトリミングおよび重複排除します。最後の段階では、最終タスクを実行するためのコードを追加します。最初に入力を展開して、最終的にI、次に間違った長さの結果を除外し、結果を重複排除し、最後に結果をカウントします。次に、結果のRetinaスクリプトが評価されます。

注:理論上、4行目の最後から15バイトを節約できますが、これにより、スクリプトが非常に遅くなり、TIOでもTIOでデモンストレーションできませんn=1


@JonathanAllan Ah、その後、同じ先行数字を持つ複数の減算ペアを含めることになりますが、これは間違っています。
ニール

2
@JonathanAllanまったく同じバイトカウントのために偶然にも新しい書き直し!
ニール

5

Pythonの2177の168 162バイト

import re,itertools as q
f=lambda n:sum(None!=re.match("^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$",(''.join(m)))for m in q.product('MDCLXVI',repeat=n))

オンラインでお試しください!

私はかなり新しいです、これをゴルフするのを手伝ってください!これは実際のローマ数字をチェックします。次のような奇妙なケースを考慮して正規表現を調整する必要があります。IVI

@Dead Possumのおかげで-9バイト

@ovsのおかげで-6バイト


ええ、この例ではn = 3のケースは間違っていると思います。私はもともと93を取得していた^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
イーストンボルネマイヤー


1
@JonathanAllan私は約2日間、これらのルールが理にかなっていることを確認しようとしてMath stackexchangeを尋ねました。私は十分ではなかったと思う:(
ドンサウザンド

1
@RushabhMehtaこれは非常にうまくフォーマットされたチャレンジであり、プログラムするのも楽しいです。それはあなたの挑戦です、あなたが適切と思うようにそれを指定してください。それは他の意味で実行可能であり、さらに難しい
イーストンボルネマイヤー

1
これは3の正しい答えを与えていないようです。93代わりに105
ジョーキング

3

JavaScript(ES7)、133バイト

編集ジョナサンアランのコードによって返された結果と一致するように修正されました。これは、OPによって参照実装として提供されました。


n=>[...Array(m=k=7**n)].reduce(s=>s+/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test((--k+m).toString(7).replace(/0[62]|2[34]|4[51]/g,s=>s[1])),0)

オンラインでお試しください!

どうやって?

N1

[...Array(m = k = 7 ** n)].reduce(s => … (--k + m).toString(7) …, 0)

これ以降、各数字はローマ数字記号として解釈されます。

01M2バツ3L4C5D6V

2)私たちは、フォームのすべての有効なサブトラクティブ・ペア置き換えるABとしB

.replace(/0[62]|2[34]|4[51]/g, s => s[1]))  // in the code
.replace(/I[VX]|X[LC]|C[DM]/g, s => s[1]))  // with Roman symbols

例:

  • XLIXIV になる LXV
  • XIIVになりXIVI次のテストが失敗することになる
  • IC変更されないままで、無効なI場所も残されます

3)残りのシンボルが正しい順序であり、許可されているよりも多く表示されないことを確認します。

/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test(…)  // in the code
/^M*D?C{0,3}L?X{0,3}V?I{0,3}$/.test(…)  // with Roman symbols

聖なる牛、私はこれが非難解な言語で200バイト未満で行われるとは思っていませんでした!これがどのように機能するかを説明しますか?
ドンサウザンド

しかし、これはTIOの* n *> 4では機能しないことに気づきました。これはやや不幸です。
ドン・サウザンド・

@RushabhMehtaより高い値をテストするために、非再帰バージョンを追加しました。ゴルフを終えたら説明を追加します。
アーナルド

0

C、150 123バイト

説明を十分に詳しく読んでいなかったため、標準的なローマ数字の数が生成されます(式IVIはカウントされません)。私はそれにいくらかの努力をしたので、とにかく共有すると思いました。

#define F(X) for(X=10;X--;)
x[]={0,1,2,3,2,1,2,3,4,2};f(i,o,a,b,c){for(i++;i--;)F(a)F(b)F(c)o+=i==x[a]+x[b]+x[c];return o;}

オリジナル(150バイト):

#define F(X) for(X=10;X--;)
i,o,a,b,c,x[]={0,1,2,3,2,1,2,3,4,2};main(){scanf("%i",&i);for(i++;i--;)F(a)F(b)F(c)o+=i==x[a]+x[b]+x[c];printf("%i\n",o);}

1
有効な投稿のみを投稿できます。
Okx

@CurtisBechtelあなたはここで解決策を維持することができますが、挑戦のルールを満たすためにそれを修正しようとします。
ドンサウザンド

1
私はあなたが間にスペースを削除することができると思うF(X)for(X=10;X--;)
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.