Gambaran Umum
Bangsa Romawi kuno merancang sistem angka menggunakan huruf Latin, yang melayani mereka dengan baik, dan yang masih digunakan oleh peradaban modern, meskipun pada tingkat yang jauh lebih kecil. Pada saat penggunaannya, orang Romawi harus belajar menggunakan dan memanipulasi angka-angka ini agar banyak digunakan untuk banyak aplikasi. Misalnya, jika seseorang memiliki 35 ekor sapi, dan ia memperoleh 27 ekor lagi, bagaimana ia bisa mengetahui jumlah total yang baru selain menghitung semuanya? ( Ok, itu dan menggunakan sempoa ... ) Jika orang-orang Romawi bisa melakukannya, tentunya kita juga bisa mengetahuinya.
Tujuan
Tulis algoritma / fungsi / program terpendek yang akan menambahkan dua angka Romawi bersama-sama dan menghasilkan hasilnya tanpa mengubah representasi string dari salah satu input menjadi angka.
Aturan / Kendala
Karena inkonsistensi historis / pra-abad pertengahan dalam format, saya akan menguraikan beberapa aturan non-standar (per penggunaan modern) untuk ortografi. Lihat panduan nilai di bawah ini sebagai contoh.
- Huruf I, X, C, dan M dapat diulang hingga empat kali berturut-turut, tetapi tidak lebih. D, L, dan V tidak pernah bisa diulang.
- Surat yang berada tepat di sebelah kanan surat lain dalam representasi Romawi akan memiliki nilai yang sama atau lebih rendah daripada di sebelah kirinya.
- Dengan kata lain,
VIIII == 9
tetapiIX != 9
dan tidak valid / tidak diizinkan.
- Dengan kata lain,
- Semua nilai input akan 2.000 (MM) atau kurang; tidak diperlukan representasi untuk angka yang lebih besar dari M.
- Semua nilai input akan menjadi angka Romawi yang valid, sesuai dengan aturan di atas.
- Anda tidak boleh mengonversi angka apa pun menjadi desimal, biner, atau sistem angka lainnya sebagai bagian dari solusi Anda (Anda boleh menggunakan metode seperti itu untuk MEMERVERIFIKASI hasil Anda).
- Ini kode golf, jadi kode terpendek menang.
Panduan Nilai
Symbol Value
I 1
II 2
III 3
IIII 4
V 5
VIIII 9
X 10
XIIII 14
XXXXIIII 44
L 50
LXXXXVIIII 99
C 100
D 500
M 1,000
Contohnya
XII + VIII = XX (12 + 8 = 20)
MCCXXII + MCCXXII = MMCCCCXXXXIIII (1,222 + 1,222 = 2,444)
XXIIII + XXXXII = LXVI (24 + 42 = 66)
Jika diperlukan klarifikasi lebih lanjut, silakan tanyakan.
sumber
Jawaban:
APL (
5956)Input pada satu baris (yaitu
XII + XII
, meskipun+
tidak perlu).Sunting: perubahan shift ke rotate untuk menyimpan tiga karakter - itu hanya masalah ketika jawaban ≥ 5000, yang seharusnya tidak pernah terjadi karena pertanyaan mengatakan nilai input akan selalu ≤ 2000. Satu-satunya efeknya sekarang "meluap" pada 5000, memberikan 5000 = 1, 5001 = 2, dll.
(Saya tidak benar-benar berpikir orang Romawi melakukannya dengan cara ini ... APL lebih merupakan sesuatu untuk orang Mesir Kuno saya pikir :))
Penjelasan:
⍞
: dapatkan input pengguna(N←'MDCLXVI')∘=¨
: store 'MDCLXVI' di N. Return, untuk setiap karakter string input, vektor dengan 1 di tempat karakter sesuai dengan salah satu dari 'MDCLXVI', dan 0 sebaliknya.⊃+/
: Jumlahkan vektor dan de-encapsulate. Kami sekarang memiliki vektor dengan informasi tentang berapa banyak setiap angka Romawi yang kita miliki. Yaitu, jika inputnya adalahXXII XIIII
, kita sekarang memiliki:{
...:
...⋄
...}
adalah fungsi dengan konstruksi if-else.D←7⍴5 2
:D
adalah vektor5 2 5 2 5 2 5
. Ini adalah berapa banyak angka Romawi yang tidak diizinkan. Yaitu jika Anda memiliki 5I
s, itu terlalu banyak, dan jika Anda memiliki 2V
s itu juga terlalu banyak. Vektor ini juga merupakan faktor penggandaan untuk setiap angka Romawi, yaitu aV
bernilai 5I
detik danX
bernilai 2V
detik.∨/K←⍵≥D
:K
adalah vektor di mana ada 1 jika kita memiliki terlalu banyak angka Romawi dari jenis tertentu.∨/
ATAU vektor ini bersama-sama.K×D
: Kalikan K dengan D. Vektor ini memiliki nol di mana kita tidak memiliki terlalu banyak angka Romawi, dan jumlah angka Romawi di mana kita melakukannya.⍵+(1⌽K)
: Putar K ke kiri sebanyak 1, dan tambahkan ke input. Untuk setiap angka Romawi yang kita miliki terlalu banyak, ini akan menambah satu dari yang berikutnya lebih tinggi.⍵+(1⌽K)-K×D
: Kurangi ini dari vektor lainnya. Efeknya adalah, misalnya jika Anda memiliki 6I
s, itu akan menambah satuV
dan menghapus 4I
s.∇
: Perulangan.⋄⍵
: Tetapi jikaK
semuanya nol, maka ⍵ mewakili angka Romawi yang valid, jadi kembalilah ⍵.N⍴⍨¨
: Untuk setiap elemen dari vektor yang dihasilkan, buat banyak angka Romawi yang sesuai.,/
: Gabungkan vektor-vektor ini bersama-sama untuk menghilangkan spasi jelek di output.sumber
Python, 100
Mengambil satu string dari input (mis.
VIII + XII
AtauVIII + XII =
).sumber
Perl, 132 karakter
Deklarasikan fungsi
s
yang mengambil sejumlah argumen dan menjumlahkannya. Cukup mudah: menambahkan input, mengurangi segalanya menjadiI
s dan kemudian segera mengembalikan angka Romawi. (Semoga ini tidak dihitung dengan menggunakan sistem angka unary!)sumber
Ruby,
8582 karakterVersi ini mengambil input pada STDIN sebagai string tunggal (misalnya
XXIIII + XXXXII
) dan mencetak output ke STDOUT.Yang kedua adalah implementasi sebagai fungsi. Mengambil dua (atau lebih) string dan mengembalikan nilai yang dijumlahkan. Pemakaian:
sumber
GNU Sed, 131 karakter
sumber
Python, 174 karakter
Algoritma yang sangat sederhana - hitung setiap digit, loop untuk menangani overflow ke yang berikutnya, cetak.
Membaca dari input standar. Sesuatu seperti itu
XVI + CXX
akan berfungsi (mengabaikan apa pun kecuali angka, sehingga+
tidak benar-benar diperlukan).sumber
Scala 150
doa:
Versi ungolfed:
sumber
JavaScript
195179Sistem saya cukup sederhana, mengurangi semua angka Romawi menjadi serangkaian
I
untuk kedua angka, bergabung dengan mereka dan kemudian membalikkan proses mengubah blok tertentuI
menjadi masing-masing versi yang lebih besar ...Iterasi 1
a="IIIII0VV0XXXXX0LL0CCCCC0DD0M".split(0);d=b=>x.replace(g=RegExp((c=z)>b?a[c][0]:a[c],"g"),c>b?a[b]:a[b][0]);x=prompt().replace("+","");for(z=6;0<z;z--)x=d(z-1);for(z=0;6>z;z++)x=d(z+1);alert(x)
Iterasi 2
a="IIIII0VV0XXXXX0LL0CCCCC0DD0M".split(0);x=prompt().replace("+","");for(z=-6;6>z;z++)b=0>z?-z:z,c=0>z?~z:z+1,x=x.replace(g=RegExp(b>c?a[b][0]:a[b],"g"),b>c?a[c]:a[c][0]);alert(x)
Fitur:
Input dimasukkan melalui prompt dalam bentuk
<first roman number>+<second roman number>
(tanpa spasi), output dalam bentuk peringatan.misalnya
sumber
VBA, 187 karakter
sumber
o
hanya digunakan sekali, Anda dapat menyimpan 3 byte dengan menghapus tugas dan evaluasi dan menghubungkannyan Mod r
langsung keString(
pemanggilan fungsiJavaScript, 190
Menempatkan beberapa instruksi di dalam slot ketiga dari
for
operator biar saya simpan beberapa titik koma!Saat input diminta, Anda memasukkan dua angka (
+
dan spasi tidak diperlukan, tetapi jika Anda memasukkannya, Anda tidak mendapatkan kesalahan). Lalu peringatan menunjukkan jumlah.sumber
C ++, 319 karakter
sumber
PHP, 136 Bytes
Cobalah online!
sumber