Perl 69バイト
s;.;y/XVI60-9/CLXVIX/dfor$a[$_].="32e$&"%72726;gefor 1..100;print"@a"
魔法の式で動作します。式"32e$&"%72726
は、次の方法で各桁を変換します:
0⇒32、1⇒320、2⇒3200、3⇒32000、4⇒29096、5⇒56、6⇒560、7⇒5600、8⇒56000、9⇒50918
翻訳を適用した後y/016/IXV/
、我々は、この代わりに:
0⇒32、1⇒32 I、2⇒32 II、3⇒32 III、4⇒29 I 9 V、5⇒5 V、6⇒5 VI、7⇒5 VII、8⇒5 VIII、9⇒5 I 9 X 8
残りの数字(2-57-9
)は削除されます。この変換式使用して1つのバイトによって改善され得ることに注意012
の代わりを016
簡素化/XVI60-9/
します/XVI0-9/
。私はそれを見つけることができませんでしたが、多分あなたはより良い運を持っているでしょう。
この方法で1つの数字が変換されると、次の数字についてプロセスが繰り返され、結果が追加され、新しい数字の変換が行われると同時に前XVI
のCLX
が変換されます。
更新
検索では、短いものは何も見つかりませんでした。ただし、69バイトの代替ソリューションを見つけました。
s;.;y/XVI0-9/CLXIXV/dfor$a[$_].="57e$&"%474976;gefor 1..100;print"@a"
これはの0-2
置換を使用しますIXV
が、モジュロが1桁長くなります。
更新:66 65バイト
このバージョンは著しく異なっているので、おそらくそれについていくつかの言葉を言う必要があります。使用する式は実際には1バイト長くなります!
それ以上に式を短くすることができなかったので、私は自分が持っていたものをゴルフダウンすることにしました。私は昔の友達を思い出すまで長くはかからなかった$\
。ときprint
なステートメントが発行され、$\
自動的に出力の最後に追加されます。$a[$_]
2バイトの改善のために、厄介な構成を取り除くことができました。
s;.;y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726;ge,$\=!print$"for 1..100
はるかに優れていますが、$\=!print$"
それでも少し冗長に見えます。3
それから、桁変換のいずれにも番号が含まれていない代替の等しい長さの式を思い出しました。したがって、$\=2+print
代わりに使用して、結果3
をスペースに置き換えることができるはずです:
s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;ge,$\=2+print for 1..100
また、print
との間の必要な空白のために、67バイトfor
。
編集:これはprint
、先頭に移動することにより、1バイト改善することができます:
$\=2+print!s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;gefor 1..100
置換はの前に完全に評価する必要があるため、へprint
の割り当て$\
は最後に行われます。ge
との間の空白を削除するとfor
、非推奨の警告が発行されますが、それ以外は有効です。
使用しなかった式があった場合でも、1
どこでも、$\=2+print
となり$\=print
貯蓄の別の2バイト分のために。1バイト長くても、改善されます。
結局のところ、そのような式は存在しますが、元の式よりも1バイト長く、最終的なスコアは65バイトになります。
$\=print!s;.;y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366;gefor 1..100
方法論
このような式を見つけるにはどうすればよいかという質問がありました。一般に、データのセットを一般化するための魔法の公式を見つけることは確率の問題です。つまり、目的の結果に似たものを生成する可能性の高いフォームを選択する必要があります。
最初のいくつかのローマ数字を調べる:
0:
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
いくつかの規則性が見られます。具体的には、0〜3から5〜8まで、連続する各用語の長さが1桁ずつ増加します。我々は数字の桁からのマッピングを作成したい場合は、私たちは、表現したいでしょうまた、それぞれの連続した期間のために一桁の長さの増加を。論理的な選択であるK•10 D dは、対応する数字であり、そしてK任意の整数定数です。
これは0〜3で機能しますが、4はパターンを壊す必要があります。ここでできることは、モジュロのタックです:
k•10 d%m、ここでmはk•10の間です 3と k•10 4の間です。これにより、 0〜3の範囲はそのままになり、 4が含まれないように 4が変更されI
ます。モジュラー剰余 5( jと呼ぶ)が m / 1000未満になるように検索アルゴリズムをさらに制約する場合、これにより 5-8からの規則性も確保されます。結果は次のようになります。
0: k
1: k0
2: k00
3: k000
4: ????
5: j
6: j0
7: j00
8: j000
9: ????
あなたが見ることができるように、我々は交換した場合0
でI
、0-3と5-8は、すべて正しくマップされることが保証されます!ただし、4と9の値はブルートフォースにする必要があります。具体的には、4は1 0
と1をj
(この順序で)含む必要があり、9は1を含む必要があり0
、その後に他のどこにも現れない1つの数字が続きます。確かに、他の多くの式があり、偶然の一致によって望ましい結果が得られる可能性があります。それらのいくつかはさらに短いかもしれません。しかし、これほど成功する可能性のあるものはないと思います。
私はまたのために複数の代替品で実験I
および/またはV
いくつかの成功を収めて。しかし、悲しいかな、私がすでに持っていたものよりも短いものはありません。ここに私が見つけた最短のソリューションのリストがあります(1〜2バイト重いソリューションの数はリストするには多すぎます)。
y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726
y/XVI0-9/CLXIXV/dfor$\.="57e$&"%474976
y/XVI0-9/CLXIVXI/dfor$\.="49e$&"%87971
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%10606 #
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%15909 # These are all essentially the same
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%31818 #
y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535 # Doesn't contain 3 anywhere
y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366 # Doesn't contain 1 anywhere