Perl 69 byte
s;.;y/XVI60-9/CLXVIX/dfor$a[$_].="32e$&"%72726;gefor 1..100;print"@a"
Bekerja dengan formula ajaib. Ekspresi "32e$&"%72726mengubah setiap digit dengan cara berikut:
0⇒32, 1⇒320, 2⇒3200, 3⇒32000, 4⇒29096, 5⇒56, 6⇒560, 7⇒5600, 8⇒56000, 9⇒50918
Setelah menerapkan terjemahan y/016/IXV/, kami memiliki ini sebagai gantinya:
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
Sisa digit ( 2-57-9) dihapus. Perhatikan bahwa ini dapat ditingkatkan dengan satu byte dengan menggunakan formula yang diterjemahkan 012bukan 016, menyederhanakan /XVI60-9/untuk /XVI0-9/. Saya tidak dapat menemukan satu, tapi mungkin Anda akan lebih beruntung.
Setelah satu digit ditransformasi dengan cara ini, proses berulang untuk digit berikutnya, menambahkan hasilnya, dan menerjemahkan sebelumnya XVIke CLXpada saat yang sama terjemahan untuk digit baru terjadi.
Perbarui
Pencarian lengkap tidak mengungkapkan apa pun yang lebih pendek. Namun, saya menemukan solusi 69 byte alternatif:
s;.;y/XVI0-9/CLXIXV/dfor$a[$_].="57e$&"%474976;gefor 1..100;print"@a"
Yang ini menggunakan 0-2substitusi untuk IXV, tetapi memiliki modulo yang satu digit lebih panjang.
Pembaruan: 66 65 byte
Versi ini sangat berbeda, jadi saya mungkin harus mengatakan beberapa kata tentang itu. Rumus yang digunakannya sebenarnya satu byte lebih panjang!
Karena tidak dapat mempersingkat formula, saya memutuskan untuk mengurangi apa yang saya miliki. Tidak lama sampai saya ingat teman lama saya $\. Ketika printstatment dikeluarkan, $\secara otomatis ditambahkan ke akhir output. Saya dapat menyingkirkan $a[$_]konstruksi canggung untuk peningkatan dua byte:
s;.;y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726;ge,$\=!print$"for 1..100
Jauh lebih baik, tapi itu $\=!print$"masih tampak agak bertele-tele. Saya kemudian ingat formula panjang alternatif yang sama yang saya temukan yang tidak mengandung angka 3dalam transformasi digitnya. Jadi, seharusnya bisa digunakan $\=2+printsebagai gantinya, dan gantikan hasilnya 3dengan spasi:
s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;ge,$\=2+print for 1..100
Juga 67 byte, karena spasi yang diperlukan antara printdan for.
Sunting : Ini dapat ditingkatkan dengan satu byte, dengan memindahkan printke depan:
$\=2+print!s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;gefor 1..100
Karena substitusi perlu dievaluasi sepenuhnya sebelum print, penugasan ke $\masih akan terjadi terakhir. Menghapus spasi putih di antara gedan forakan mengeluarkan peringatan penghentian, tetapi sebaliknya valid.
Tetapi, jika ada formula yang tidak menggunakan di 1mana pun, $\=2+printmenjadi $\=printpenghematan dua byte lagi. Bahkan jika itu satu byte lebih lama, itu masih akan menjadi perbaikan.
Ternyata, formula seperti itu memang ada, tetapi satu byte lebih panjang dari aslinya, menghasilkan skor akhir 65 byte :
$\=print!s;.;y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366;gefor 1..100
Metodologi
Pertanyaannya adalah bagaimana orang bisa menemukan formula seperti itu. Secara umum, menemukan formula ajaib untuk menggeneralisasi set data apa pun adalah masalah probabilitas. Artinya, Anda ingin memilih bentuk yang mungkin menghasilkan sesuatu yang mirip dengan hasil yang diinginkan.
Mengeluarkan beberapa angka romawi pertama:
0:
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
ada beberapa keteraturan untuk dilihat. Khususnya, dari 0-3 dan sekali lagi dari 5-8 , setiap istilah berturut-turut bertambah panjangnya dengan satu angka. Jika kami ingin membuat pemetaan dari angka ke angka, kami ingin memiliki ekspresi yang juga bertambah panjang satu digit untuk setiap istilah berturut-turut. Pilihan logis adalah k • 10 d di mana d adalah digit yang sesuai, dan k adalah konstanta bilangan bulat apa pun.
Ini berfungsi untuk 0-3 , tetapi 4 perlu memutus pola. Apa yang bisa kita lakukan di sini adalah menempel pada modulo:
k • 10 d % m , di mana m berada di antara k • 10 3 dan k • 10 4 . Ini akan membuat rentang 0-3 tidak tersentuh, dan memodifikasi 4 sehingga tidak akan mengandung empat Is. Jika kami juga membatasi algoritma pencarian kami sehingga residu modular 5 , sebut saja j , kurang dari m / 1000 , ini akan memastikan bahwa kami juga memiliki keteraturan dari 5-8 juga. Hasilnya kira-kira seperti ini:
0: k
1: k0
2: k00
3: k000
4: ????
5: j
6: j0
7: j00
8: j000
9: ????
Seperti yang Anda lihat, jika kita ganti 0dengan I, 0-3 dan 5-8 semuanya dijamin akan dipetakan dengan benar! Nilai untuk 4 dan 9 perlu dipaksakan dengan kasar. Secara khusus, 4 harus mengandung satu 0dan satu j(dalam urutan itu), dan 9 perlu mengandung satu 0, diikuti oleh satu digit lain yang tidak muncul di tempat lain. Tentu saja, ada sejumlah formula lain, yang oleh beberapa kebetulan kebetulan dapat menghasilkan hasil yang diinginkan. Beberapa dari mereka bahkan mungkin lebih pendek. Tapi saya tidak berpikir ada yang mungkin berhasil seperti ini.
Saya juga bereksperimen dengan beberapa penggantian untuk Idan / atau Vdengan beberapa keberhasilan. Namun sayang, tidak ada yang lebih pendek dari apa yang sudah saya miliki. Berikut adalah daftar solusi terpendek yang saya temukan (jumlah solusi 1-2 byte lebih berat terlalu banyak untuk dicantumkan):
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