Tugas Anda adalah mengubah bilangan bulat positif yang diberikan dari angka Arab ke angka Romawi.
Segala sesuatunya menjadi sulit ketika Anda menghitung sampai 4000.
Orang Romawi melakukan ini dengan menambahkan garis di atas simbol untuk melipatgandakan simbol itu 1 000
. Namun, overline tidak dapat ditampilkan di ASCII. Juga, ada garis ganda untuk menggandakan simbol 1 000 000
, dan kemudian garis ganda tiga kali lipat dengan simbol 1 000 000 000
, dll ...
Oleh karena itu, saya memutuskan untuk menggunakan tanda kurung untuk mengganti overline.
Simbol dapat ditempatkan secara individual dalam tanda kurung. Misalnya, keduanya (VI)
dan (V)(I)
merupakan representasi valid dari 6 000
. (V)M
juga merupakan representasi valid dari 6000.
(I)
adalah cara yang valid untuk mewakili 1 000
.
Testcases
Input: 1
Output: I
Input: 2
Output: II
Input: 3
Output: III
Input: 4
Output: IV
Input: 15
Output: XV
Input: 40
Output: XL
Input: 60
Output: LX
Input: 67
Output: LXVII
Input: 400
Output: CD
Input: 666
Output: DCLXVI
Input: 3000
Output: MMM
Input: 3999
Output: MMMCMXCIX
Input: 4000
Output: M(V)
Input: 4999
Output: M(V)CMXCIX
Input: 6000
Output: (VI)
Input: 6000000
Output: ((VI))
Input: 6006000
Output: ((VI)VI)
Input: 6666666666
Output: (((VI)DCLXVI)DCLXVI)DCLXVI
Mencetak gol
Ini adalah kode-golf . Kode terpendek dalam byte menang.
sumber
(IV)
representasi 4000 dapat diterima?Jawaban:
Mathematica, 67 byte
Hindari semua masalah dengan
M
mengubah input ke basis 1000 dan mengonversi setiap digit secara terpisahRomanNumeral
. Lalu kami melipatnya dengan memasukkan(...)
dari kiri.Sayangnya, Mathematica mewakili angka nol
N
sehingga kita harus menyingkirkannya.sumber
RomanNumeral
bisa melakukannya?MMMM
untuk4000
, itu hanya mulai bekerja untuk spec di5000
(dan kemudian Anda mendapatkan masalah yang sama untuk4000000
dll). Bahkan kemudian, ia menggunakan overbars alih-alih tanda kurung. Jika Anda setuju dengan itu, Anda harus mengatakannya dalam spesifikasi tantangan.JavaScript (ES6), 136 byte
Untuk angka di bawah 4000, ulangi setiap "huruf" Romawi sebanyak mungkin, menggunakan daftar "huruf" Romawi dan nilai desimalnya. Kalau tidak, secara rekursif membangun jawaban dari divisi dan modulo dengan 1000. Untungnya
repeat
memotong jadi saya tidak harus melakukannya sendiri.sumber
Common Lisp, 108
Tidak disatukan
Tes
Dua tes memberikan output yang berbeda dari yang dari pertanyaan:
sumber
R, 134
Ini bukan pilihan terbaik, tapi saya pikir idenya harus mirip dengan ini.
sumber
Python, 188
194-6 byte dari menghilangkan spasi
Tantangan ini membawa saya kembali ke ketika saya pertama kali belajar memprogram ...
Mungkin bukan solusi terpendek, tapi saya senang bermain golf masalah ini.
Cobalah!
sumber
Ruby,
137134130 byteFungsi rekursif yang mengembalikan string. Saya mencoba bermain golf di penyandian angka sedikit lebih jika mungkin, tapi saya tidak yakin bagaimana.
Aduh, ini praktis merupakan port langsung jawaban ES6 @ Neil sekarang.
sumber
Ruby,
185 161144 byteLebih dari setahun setelah posting asli, saya pikir saya belajar sesuatu tentang golf.
Terima kasih, Nilai Tinta untuk komentar Anda yang berharga.
sumber
gsub
dapat mengambil string sebagai argumen pertama, menghapus kebutuhan substitusi ke dalam pola regex sejaks.gsub! x,y
dilakukan secara otomatis. Selain itu, Anda mungkin bisa mengabaikan penugasana
array Anda karena Anda hanya menggunakannya sekali, dan langsung memasukkannya ke dalameach_slice
panggilan."IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...
berfungsi jugar[x]
secara fungsional setara denganr.(x)
setiap kali lambdas yang terlibatr[x]
trik akan berguna untuk semua futer saya golf rekursif di ruby!TCL 134 byte
Cobalah di sini: https://rextester.com/BJC92885
sumber