Perl 69 bayt
s;.;y/XVI60-9/CLXVIX/dfor$a[$_].="32e$&"%72726;gefor 1..100;print"@a"
Büyü formülü ile çalışır. İfade "32e$&"%72726, her basamağı şu şekilde dönüştürür:
0⇒32, 1⇒320, 2⇒3200, 3⇒32000, 4⇒29096, 5⇒56, 6⇒560, 7⇒5600, 8⇒56000, 9⇒50918
Çeviriyi uyguladıktan sonra y/016/IXV/, bunun yerine şu var:
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
Rakamların geri kalanı ( 2-57-9) kaldırıldı. Bu ifade edilen bir formül kullanılarak tek bir bayt geliştirilebileceğini Not 012yerine 016basitleştirilmesi, /XVI60-9/için /XVI0-9/. Bir tane bulamadım ama belki daha iyi şansın olur.
Bir hane bu şekilde dönüştürüldüğünde, işlem bir sonraki hane için tekrarlanır, sonucu ekler ve önceki XVIs'yi CLXaynı anda çevirir, yeni hane için çeviri gerçekleşir.
Güncelle
Kapsamlı arama daha kısa bir şey ortaya çıkarmadı. Bununla birlikte, alternatif bir 69 baytlık çözüm buldum:
s;.;y/XVI0-9/CLXIXV/dfor$a[$_].="57e$&"%474976;gefor 1..100;print"@a"
Bu , 0-2yerine geçer IXV, ancak bir rakam daha uzun olan bir modulo vardır.
Güncelleme: 66 65 bayt
Bu sürüm oldukça farklı, bu yüzden muhtemelen bu konuda birkaç kelime söylemeliyim. Kullandığı formül aslında bir bayt daha uzun!
Formülü olduğundan daha fazla kısaltamazsam, sahip olduğum golfü seçmeye karar verdim. Eski dostumu hatırlayana kadar uzun sürmedi $\. Bir printrapor verildiğinde $\çıktının sonuna otomatik olarak eklenir. $a[$_]İki byte'lık iyileştirme için garip yapıdan kurtulabildim :
s;.;y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726;ge,$\=!print$"for 1..100
Çok daha iyi, ama bu $\=!print$"hala biraz ayrıntılı görünüyordu. Daha sonra 3, rakam dönüşümlerinin hiçbirinde sayı içermeyen alternatif, eşit uzunlukta bir formül olduğunu hatırladım . Bu nedenle, bunun $\=2+printyerine kullanmak mümkün olmalı ve sonuçta 3bir boşluk bırakılmalıdır :
s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;ge,$\=2+print for 1..100
Ayrıca 67 byte, printve arasında gerekli boşluk nedeniyle for.
Düzenleme : Bu, öne doğru hareket ettirilerek bir bayt ile iyileştirilebilir print:
$\=2+print!s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;gefor 1..100
İkame tam olarak önce değerlendirmek zorunda olduğu için print, atama en $\son gerçekleşecek. Aradaki boşluğun kaldırılması geve forkullanımdan kaldırılması uyarısı verir, ancak aksi takdirde geçerlidir.
Bir kullanmıyordu bir formül olsaydı Ama 1hiçbir yerinde, $\=2+printolur $\=printtasarrufların başka iki bayt değerinde. Bir bayt daha uzun olsa bile, yine de bir gelişme olur.
Görünüşe göre, böyle bir formül var, ancak orijinalinden bir bayt daha uzun ve sonuçta 65 baytlık bir sonuçla sonuçlanıyor :
$\=print!s;.;y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366;gefor 1..100
metodoloji
Nasıl böyle bir formül bulma konusunda nasıl gidebileceği sorusu soruldu. Genel olarak, herhangi bir veri setini genelleştirmek için sihirli bir formül bulmak olasılık meselesidir. Yani, istenen sonuca benzer bir şey üretmek için mümkün olan bir formu seçmek istiyorsunuz.
İlk birkaç romen rakamını incelemek:
0:
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
Görülmesi gereken bazı düzenlilik var. Spesifik olarak, 0-3 arasında ve daha sonra yine 5-8 arasında , her ardışık terimin uzunluğu bir rakamla artar. Biz rakamlarıyla karakter arası bir eşleme yaratmak istedik, biz bir ifade var isteyeyim da birbirini izleyen her dönem için bir hane uzunluğunda arttırır. Mantıksal bir seçim k • 10 d'dir ; d , d , karşılık gelen hanedir ve k , herhangi bir tamsayı sabitidir.
Bu 0-3 için çalışır , ancak 4 desen kırmak gerekiyor. Burada yapabileceğimiz şey, bir modulo üzerine yapışmaktır:
k • 10 d % m , burada m k • 10 3 ve k • 10 4 arasında bir yerdedir . Bu, 0-3 aralığını el değmeden bırakacak ve 4 değerini dört Is içermeyecek şekilde değiştirecektir . Size bunun dışında modüler kalıntı bizim arama algoritması sınırlamak durumunda 5 , hadi diyoruz j az olduğu m / 1000 , bu da gelen düzenlilik yaşamanızı sağlayacaktır 5-8 sıra. Sonuç şöyle bir şeydir:
0: k
1: k0
2: k00
3: k000
4: ????
5: j
6: j0
7: j00
8: j000
9: ????
Gördüğünüz gibi, biz değiştirirseniz 0ile I, 0-3 ve 5-8 tüm doğru biçimde eşlenmesi garanti edilir! 4 ve 9 değerlerinin kaba olsa da zorlanması gerekir. Spesifik olarak, 4'ün bir 0ve bir j(bu sırada) içermesi gerekir ve 9'un bir içermesi gerekir 0, ardından başka bir yerde görünmeyen başka bir rakam gelir. Kuşkusuz, bir tesadüf eseri bir şans eseri arzu edilen sonucu üretebilecek bazı başka formüller vardır. Bazıları daha kısa bile olabilir. Fakat bunun kadar başarılı olabileceğini düşünmüyorum.
Ayrıca Ive / veya bir Vmiktar başarı ile yapılan birden fazla değişiklikle denedim. Ama ne yazık ki, sahip olduklarımdan daha kısa hiçbir şey. İşte bulduğum en kısa çözümlerin bir listesi (1-2 bayt daha ağır olan çözümlerin sayısı listelenemeyecek kadar çok):
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