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 012
yerine 016
basitleş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 XVI
s'yi CLX
aynı 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-2
yerine 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 print
rapor 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+print
yerine kullanmak mümkün olmalı ve sonuçta 3
bir 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, print
ve 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ı ge
ve for
kullanımdan kaldırılması uyarısı verir, ancak aksi takdirde geçerlidir.
Bir kullanmıyordu bir formül olsaydı Ama 1
hiçbir yerinde, $\=2+print
olur $\=print
tasarrufları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 I
s 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 0
ile 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 0
ve 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 I
ve / veya bir V
miktar 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