Perl 69 byte
s;.;y/XVI60-9/CLXVIX/dfor$a[$_].="32e$&"%72726;gefor 1..100;print"@a"
Bekerja dengan formula ajaib. Ekspresi "32e$&"%72726
mengubah 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 012
bukan 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 XVI
ke CLX
pada 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-2
substitusi 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 print
statment 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 3
dalam transformasi digitnya. Jadi, seharusnya bisa digunakan $\=2+print
sebagai gantinya, dan gantikan hasilnya 3
dengan spasi:
s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;ge,$\=2+print for 1..100
Juga 67 byte, karena spasi yang diperlukan antara print
dan for
.
Sunting : Ini dapat ditingkatkan dengan satu byte, dengan memindahkan print
ke 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 ge
dan for
akan mengeluarkan peringatan penghentian, tetapi sebaliknya valid.
Tetapi, jika ada formula yang tidak menggunakan di 1
mana pun, $\=2+print
menjadi $\=print
penghematan 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 I
s. 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 0
dengan 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 0
dan 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 I
dan / atau V
dengan 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