Memasukkan:
Bilangan bulat.
Keluaran:
- Pertama-tama, konversi bilangan bulat ke Angka Romawi yang setara.
- Kemudian konversikan setiap huruf kapital Angka Romawi itu dengan nilai desimal ASCII / UNICODE mereka.
- Dan hasilkan jumlah itu.
Contoh:
1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input ^ output
Angka Romawi: Berikut ini adalah Penghitung Angka Romawi yang mungkin berguna.
Aturan tantangan:
- Aturan Angka Romawi standar diterapkan, jadi tidak ada bentuk alternatif suka
IIII
atauVIIII
bukanIV
danIX
. * - Garis Macron di atas Angka Romawi melewati 1.000 adalah
¯
(UNICODE no. 175). Jadi satu baris diperhitungkan sebagai+175
dan dua sebagai+350
. - Anda diizinkan menggunakan segala jenis input dan output, asalkan itu mewakili bilangan bulat.
- Kasus uji akan berada dalam kisaran
1 - 2,147,483,647
.
* Aturan Angka Romawi (kutipan dari Wikipedia):
Bilangan dibentuk dengan menggabungkan simbol-simbol dan menambahkan nilainya, demikian
II
juga dua (dua) danXIII
tiga belas (sepuluh dan tiga). Karena setiap angka memiliki nilai tetap dan bukan mewakili kelipatan sepuluh, seratus dan seterusnya, sesuai posisi, tidak perlu untuk "menjaga tempat" nol, seperti dalam angka seperti 207 atau 1066; angka-angka itu ditulis sebagaiCCVII
(dua ratus, lima dan dua) danMLXVI
(seribu, lima puluh, sepuluh, lima dan satu).Simbol ditempatkan dari kiri ke kanan dalam urutan nilai, dimulai dengan yang terbesar. Namun, dalam beberapa kasus tertentu, untuk menghindari empat karakter diulang secara berurutan (seperti
IIII
atauXXXX
), notasi subtraktif sering digunakan sebagai berikut:
I
ditempatkan sebelumV
atauX
menunjukkan satu kurang, jadi empat adalahIV
(satu kurang dari lima) dan sembilan adalahIX
(satu kurang dari sepuluh)X
ditempatkan sebelumL
atauC
menunjukkan sepuluh kurang, jadi empat puluh adalahXL
(sepuluh kurang dari lima puluh) dan sembilan puluh adalahXC
(sepuluh kurang dari seratus)C
ditempatkan sebelumD
atauM
menunjukkan seratus lebih sedikit, jadi empat ratus adalahCD
(seratus kurang dari lima ratus) dan sembilan ratus adalahCM
(seratus kurang dari seribu)
Misalnya,MCMIV
seribu sembilan ratus empat, 1904 (M
seribu,CM
adalah sembilan ratusIV
empat).Beberapa contoh penggunaan modern angka Romawi meliputi:
1954 sebagaiMCMLIV
; 1990 sebagaiMCMXC
; 2014 sebagaiMMXIV
SUMBER
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'. - Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
- Celah Default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, silakan tambahkan penjelasan jika perlu.
Kasus uji:
100 -> 67
1 -> 73
4 -> 159
22 -> 322
5000 -> 261
2016 -> 401
1000000000 -> 427
1991 -> 449
9999 -> 800
1111111111 -> 2344
2147483647 -> 5362
sumber
9999
->M(X)CMXCIX
->77+263+67+77+88+67+73+88
->800
dan2147483647
->((MMCXLV)MMCDLXXX)MMMDCXLVII
->427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73
->5362
. Jadi saya sudah mengoreksi yang kedua, tetapi yang9999
benar.2222222222
tidak dalam kisaran yang diberikan. Saya juga setuju5362
.Jawaban:
Mathematica,
181173166151 byteGolf
Tidak disatukan
RomanNumeral
Implementasi Mathematica memberikan (IX) CMXCIX untuk 9999, dan karenanya program mengembalikan 971 untuk angka itu.Seperti yang tertulis, angka romawi dari tipe ((...)) (...) ... mengembalikan daftar kode ASCII bersarang untuk angka romawi dengan panjang 4, ((...)) ... mengembalikan daftar panjang 3, (...) ... mengembalikan daftar panjang 2, dan ... mengembalikan daftar panjang 1. Baris terakhir mengubah aturan-aturan tersebut ke dalam jumlah makron yang tepat untuk setiap bagian dari daftar, tambahkan makron-makron itu, dan kemudian jumlah seluruh daftar bersarang untuk mengembalikan output.
sumber
Python 3,
281278273269 byteUpaya pertama saya di codegolf, ini dia. Mencoba melakukannya tanpa melihat pertanyaan terkait, jadi mungkin sangat buruk :)
8 byte lebih kecil, berkat Gábor Fekete
Tidak Disatukan:
sumber
return 0 if n==0 else
denganreturn 0if n<1else
f
dalamnya ketika nama fungsi adalahg
.n//9*10>=10*l
untukn//9>=l
menyimpan lebih banyak.Ruby, 188 byte
Adaptasi berdasarkan jawaban Ruby saya yang lama untuk konversi angka Romawi . Cobalah online!
sumber
Mathematica, 198 byte
Sayangnya, builtin tidak banyak membantu di sini, meskipun saya yakin ini bisa bermain golf lebih jauh.
Catatan: Evaluasi
9999 -> 971
sesuai di sini .sumber
Batch, 373 byte
Bekerja dengan menerjemahkan setiap digit nomor sesuai dengan tabel pencarian untuk nilai 1, 4, 5 dan 9. Penggunaan
M(V)
,M(X)
,(M(V))
dan(M(X))
. Jika Anda lebih suka(IV)
,(IX)
,((IV))
dan((IX))
kemudian menggunakancall:l 77 509 261 511
dancall:l 252 859 436 861
masing-masing.sumber
JavaScript (ES6), 183 byte
Catatan: tidak hanya lebih suka
(IV)
untukM(V)
, tetapi juga lebih suka(VI)
untuk(V)M
; sebenarnya itu hanya akan menggunakan M di awal nomor.sumber
Python, 263 byte
sumber
R, 115 byte
Jadi ... Saya memposting solusi saya karena saya menemukan pertanyaan yang cukup menarik. Saya melakukan yang terbaik dengan R 'kapasitas s untuk berurusan dengan angka romawi tanpa paket: Anda hanya dapat nomor masukan antara
1
dan3899
, sebagaias.roman
' s dokumentasi menjelaskan.Itu sebabnya saya sedikit curang dengan memberikan rentang antara
1
ke dalam loop:itu adalah panjang darioutput (). Bahkan, menurut situs web ini , angka romawi terpanjang adalah (14 karakter), yang sesuai dengan11
14
for
as.roman(3899)
MMMDCCCXCIX
MMDCCCLXXXVIII
2888
.Selain itu, Anda tidak dapat menghitung
length
output dari fungsi ini.Jika ada yang melihat solusi untuk mengatasi masalah di atas, jangan ragu untuk berkomentar.
sumber
Python 3, 315 byte
Versi tidak disatukan:
Penjelasan: Versi ini menggunakan pendekatan yang berbeda, menghitung jumlah angka romawi dalam angka tersebut.
[abs(((n-4)%5)-1)]
adalah jumlahI
s dalam angka romawi.[((n+10**g)//(10**g*5))%2for g in r(10)]
adalah jumlahV,L,D,(V),(L),(D),((V)),((L)),((D))
s dalam angka.[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
adalah angkaX,C,M,(X),(C),(M),((X)),((C)),((M))
s dalam angka.Itu kemudian mengalikan kejadian dengan nilai karakter dan mengembalikan jumlah itu.
sumber