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 我,2⇒32 II,3⇒32 III,4⇒29 我 9 V,5⇒5 V,6⇒5 VI,7⇒5 VII,8⇒5 VIII,9⇒5 我 9 X 8
其余的数字(2-57-9
)将被删除。请注意,可以使用转换012
而不是016
简化/XVI60-9/
为的公式将其提高一个字节/XVI0-9/
。我找不到一个,但也许您会走运。
一旦以这种方式转换了一个数字,则对下一个数字重复该过程,将结果附加,然后将前一个XVI
s CLX
转换为新数字的转换。
更新
穷举搜索没有发现更短的内容。但是,我确实找到了替代的69字节解决方案:
s;.;y/XVI0-9/CLXIXV/dfor$a[$_].="57e$&"%474976;gefor 1..100;print"@a"
这个用0-2
代替IXV
,但模数长一位。
更新:66 65字节
这个版本明显不同,所以我可能应该说几句话。它使用的公式实际上长了一个字节!
由于无法再缩短公式,我决定打高尔夫球。不久,我就想起了我的老朋友$\
。当print
发出statment,$\
被自动附加到输出的结尾。我能够摆脱笨拙的$a[$_]
构造,从而改进了两个字节:
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
移到最前面,可以提高一个字节:
$\=2+print!s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;gefor 1..100
由于替换需要在之前进行完全评估print
,因此对的分配$\
仍将最后进行。卸下之间的空白ge
,并for
会发出弃用警告。否则,是有效的。
但是,如果有一个不在1
任何地方使用的公式,$\=2+print
则$\=print
可以节省另外两个字节。即使它增加了一个字节,它仍然是一个改进。
事实证明,确实存在这样的公式,但是它比原始公式长了一个字节,最终得分为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,每个连续项的长度增加一个数字。如果我们想创建一个从数字到数字的映射,我们希望有一个表达式,对于每个连续项,其长度也增加一位。逻辑选择是k•10 d,其中d是相应的数字,而k是任何整数常数。
这适用于0-3,但4需要打破模式。我们在这里可以做的是求模数:
k•10 d%m,其中m在k•10 3和k•10 4之间。这将使范围0-3保持不变,并修改4使其不包含四个I
s。如果我们进一步限制搜索算法,使得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需要包含一个0
和一个j
(按此顺序),而9需要包含一个和0
,后跟一个在其他任何地方都没有出现的数字。当然,还有许多其他公式,巧合的话可能会产生预期的结果。其中一些甚至可能更短。但是我认为没有什么比这成功的可能性更大。
我还尝试了多种替代方法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