Tulis program atau fungsi yang menerima bilangan bulat dalam kisaran 1..3999 sebagai input dan mengembalikan jumlah segmen garis yang diperlukan untuk menyatakan bilangan bulat itu dalam angka Romawi standar (sehingga Anda akan menggunakan XL tetapi bukan VM). Contoh:
1 -> 1
4 -> 3
5 -> 2
9 -> 3
10 -> 2
40 -> 4
50 -> 2
90 -> 3
100 -> 1
400 -> 3
500 -> 2
900 -> 5
1000 -> 4
Builtin jumlah konversi Romawi yang diizinkan, tetapi Anda dapat memecahkan masalah tanpa mereka dengan berulang kali mengurangi jumlah terbesar yang tersisa dari daftar di atas. Contoh: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.
Ini adalah kode-golf , jadi program terpendek menang.
Jawaban:
Pyth,
927670 byteCoba di sini!
Terima kasih kepada @FryAmTheEggman untuk beberapa saran pengemasan string yang menyelamatkan saya beberapa byte!
Saya masih bertanya-tanya apakah ada cara matematis untuk menyandikan daftar ini. Akan mencoba mencari sesuatu.
Penjelasan
Ini menggunakan algoritma yang diberikan.
K
berisi daftar yang diberikan dengan angka dan jumlah segmen garis yang berurutan secara bergantian. Daftar ini dibangun dengan memecah string yang dikemas, yang diterjemahkan ke0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4
, pada/
dan memetakan setiap elemen ke integer.sumber
C,
148129 karakterGolf kode pertama saya: ^). Karena pertanyaan menyatakan saya dapat menggunakan fungsi, saya telah mengubah main ke fungsi untuk memangkas beberapa karakter (yang paling penting: lulus c sebagai parameter daripada scanf)
dibongkar
sumber
Mathematica,
8072 byteFungsi anonim yang hanya mengubah angka menjadi angka Romawi, mengganti setiap karakter dengan jumlah segmennya, dan mengambil totalnya.
sumber
Retina, 128 byte
Pengganti sederhana sampai tidak ada yang tersisa untuk diganti. Kemudian apostrof dihitung dan itu adalah jumlah segmen garis kami.
Jika input dan output dalam unary diizinkan, itu 115 byte (meskipun siapa yang ingin mengetikkan 1234?).
Cobalah online!
Cobalah online! (IO unary)
sumber
Python 3, 95 byte
String Unicode terdiri dari poin kode:
sumber
e=ord(e);
Java, 152 byte
Karena, Anda tahu, Jawa.
Implementasi literal sederhana dari algoritma yang diberikan. Array mengemas informasi transformasi: bahkan indeks satu kurang dari angka romawi dan indeks ganjil adalah jumlah untuk angka itu.
Ini adalah lambda yang mengambil dan mengembalikan
int
/Integer
. Ini termasukIntUnaryOperator
atauUnaryOperator<Integer>
.sumber
JavaScript (ES6), 79 byte
String mewakili jumlah segmen garis untuk unit, puluhan dan ratusan digit. (Ribuan hanya empat kali ribuan digit.) Metode ini tampaknya lebih pendek daripada opsi lain seperti algoritma yang disarankan dalam pertanyaan.
Sunting: Disimpan 2 byte berkat @ user81655.
sumber
n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
+
s ke-
s memungkinkan saya untuk menghapus yang memimpin+
, tetapi kemudian pengelompokan menyimpan byte lain.