Latar Belakang
Tantangan ini terinspirasi oleh situs web ini , yang menerbitkan diagram berikut:
Diagram ini menunjukkan kepada kita bahwa ekspresi Angka Romawi terpanjang di bawah 250 adalah ekspresi 188, yang membutuhkan 9 angka untuk diekspresikan.
Tantangan
Simbol standar yang digunakan untuk mengekspresikan Angka paling Romawi adalah sebagai berikut: { I
, V
, X
, L
, C
, D
, M
}, di mana nilai-nilai numerik karakter yang M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
Dalam tantangan ini, tujuan Anda adalah, diberi bilangan bulat positif n , menghitung jumlah representasi Angka Romawi yang valid yang dapat dikomposisikan melalui n gabungan simbol-simbol standar.
Kemudian, program Anda harus menampilkan hasil perhitungan ini!
Input : Bilangan bulat positif n .
Output : Jumlah panjang angka romawi yang valid n .
Aturan untuk Ekspresi Angka Romawi
Angka Romawi pada awalnya hanya memiliki pasangan "aditif", artinya angka selalu ditulis dalam urutan menurun, dan jumlah nilai semua angka adalah nilai angka.
Kemudian, pasangan subtraktif, penggunaan menempatkan angka yang lebih kecil di depan yang lebih besar untuk mengurangi yang lebih kecil dari yang lebih besar, menjadi hal biasa untuk mempersingkat ekspresi Angka Romawi. Pasang subtraktif tidak dapat dirantai, seperti dalam ekspresi tidak valid berikut: IXL
.
Berikut ini adalah aturan modern untuk pasangan aditif dan subtraktif.
- Hanya satu I, X, dan C yang dapat digunakan sebagai angka utama dalam bagian dari pasangan yang mengurangi.
- Saya hanya bisa ditempatkan sebelum V atau X dalam pasangan subtraktif.
- X hanya dapat ditempatkan sebelum L atau C dalam pasangan subtraktif.
- C hanya dapat ditempatkan sebelum D atau M dalam pasangan subtraktif.
- Selain pasangan subtraktif, angka harus dalam urutan menurun (artinya jika Anda menjatuhkan angka terkemuka dari setiap pasangan subtraktif, maka angka akan berada dalam urutan menurun).
- M, C, dan X tidak dapat disamakan atau dilampaui oleh denominasi yang lebih kecil.
- D, L, dan V masing-masing hanya dapat muncul sekali.
- Hanya M yang dapat diulang 4 kali atau lebih.
Catatan selanjutnya
Kami tidak akan menggunakan notasi bar ; alih-alih, kami hanya akan menambahkan lebih banyak M untuk mengekspresikan angka apa pun.
Ini adalah satu - satunya aturan yang akan kami ikuti untuk angka romawi kami. Itu berarti bahwa ekspresi aneh, seperti
IVI
, juga akan dianggap valid dalam sistem kami.Juga ingat bahwa kami tidak menghitung jumlah angka yang memiliki panjang ekspresi n , karena beberapa angka memiliki banyak ekspresi. Sebagai gantinya, kami hanya menghitung jumlah ekspresi yang valid.
Uji Kasus
1
→ 7
2
→ 31
3
→ 105
Saya memeriksa di atas dengan tangan, jadi pastikan untuk memeriksa kembali kasus uji, dan menambahkan lebih banyak jika Anda bisa!
Kriteria Menang
Ini adalah tantangan kode-golf , jadi bersenang-senanglah! Saya hanya akan menerima solusi yang dapat menangani setidaknya input dari 1 hingga 9. Lagi adalah bonus!
Edit
Seperti yang diminta oleh komentator, temukan di bawah ini, atau di tautan pastebin ini, 105 kombo yang saya hitung untuk n = 3
III IVI IXI IXV IXX VII XII XIV XIX XVI XXI XXV XXX XLI XLV XLX XCI XCV XCX XCL XCC LII LIV LIX LVI LXI LXV CII CIV CIX CVI CXI CXV CXX CXL CXC CLI CLV CLX CLX CLI CLV CLI CLV CLI CLV CLI CLV CMI CMV CMX CML CMC CMD CMM DII DIV DIX DVI DXI DXV DXX DXXL DLL DLI DLV DLX DCI DCV DCL DCL DCL DCC MII MIV MIX MVI MXI MXI MXI MXI MXI MXI MXI MXI MXI MXI MCV MCX MCX MCB MCB MC MD MD MD MD MD MMX MML MMC MMD MMM
Edit 2:
Gunakan kode non-golf berikut ini , milik Jonathan Allan untuk memeriksa hasil Anda.
Edit 3:
Saya minta maaf atas semua kesalahan dalam tantangan ini. Saya akan memastikan untuk melakukan pekerjaan yang lebih baik lain kali!
sumber
Jawaban:
Retina , 111 byte
Cobalah online! Ini adalah penulisan ulang yang lengkap karena saya salah memahami aturan 1. yang berarti bahwa Anda hanya dapat menggunakan satu dari masing-masing subtraktif
I
,X
danC
. Penjelasan: Bagian pertama dari skrip memperluas input menjadi serangkaianCM
pasangan diikuti oleh pasangan subtraktif yang mungkin lainnya. Setiap pasangan adalah opsional, dan karakter pertama dari setiap pasangan juga opsional dalam pasangan tersebut. Tahap ketiga kemudian memperluas daftar pasangan menjadi daftar perintah Retina yang mengambil input dan membuat tiga salinan dengan opsi karakter kedua atau kedua dari pasangan, kemudian memotong dan menduplikasi hasil. Tahap akhir kemudian menambahkan kode untuk melakukan tugas akhir: pertama untuk memperluas input untuk mungkin menambahkan finalI
, lalu untuk memfilter hasil dengan panjang yang salah, lalu untuk menduplikasi hasil, dan akhirnya menghitung hasilnya. Script Retina yang dihasilkan kemudian dievaluasi.Catatan: Secara teori 15 byte dapat disimpan dari akhir baris ke-4 tetapi ini membuat skrip terlalu lambat untuk ditunjukkan pada TIO bahkan untuk
n=1
.sumber
Python 2 ,
177 168162 byteCobalah online!
Saya cukup baru, bantu saya bermain golf ini! Ini memeriksa angka romawi yang sebenarnya, regex perlu disesuaikan untuk memperhitungkan kasus aneh seperti
IVI
-9 byte berkat @Dead Possum!
-6 byte terima kasih kepada @ovs
sumber
^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
93
alih-alih105
JavaScript (ES7), 133 byte
Sunting : Diperbaiki untuk mencocokkan hasil yang dikembalikan oleh kode Jonathan Allan , yang diberikan sebagai implementasi referensi oleh OP.
Cobalah online!
Bagaimana?
Mulai sekarang, setiap digit akan ditafsirkan sebagai simbol angka Romawi:
2) Kami mengganti semua pasangan subtraktif valid bentuk
AB
denganB
:Contoh:
XLIXIV
menjadiLXV
XIIV
menjadiXIV
, meninggalkanI
yang akan membuat tes berikutnya gagalIC
tetap tidak berubah, yang juga membuat tidak validI
di tempat3) Kami memeriksa bahwa simbol yang tersisa berada dalam urutan yang benar dan tidak muncul lebih dari yang diizinkan:
sumber
C,
150123 byteSaya tidak cukup membaca deskripsi, jadi ini menghasilkan angka angka Romawi standar (di mana ekspresi seperti
IVI
tidak dihitung). Karena saya berusaha keras untuk itu, saya pikir saya akan tetap berbagi.Asli (150 byte):
sumber
F(X)
danfor(X=10;X--;)