Buat kalkulator dasar untuk angka Romawi.
Persyaratan
- Mendukung
+
,-
,*
,/
- Input dan output harus mengharapkan hanya satu awalan subtractor per simbol (yaitu 3 tidak bisa
IIV
karena ada duaI
sebelumnyaV
) - Penanganan prinsip pengurangan input dan output keharusan di dukungan minimal konvensi standar modern, di mana hanya kekuatan sepuluh dikurangi dari jumlah yang lebih besar (misalnya
I
,X
,C
subtractors diperlukan tapi tidakV
,L
,D
) dan pengurangan tidak pernah dilakukan dari nomor lebih dari 10x subtractor (mis.IX
Harus didukung tetapiIC
tidak diperlukan). - Input dan output harus dibiarkan ke kanan dalam urutan nilai, dimulai dengan yang terbesar (yaitu 19 =
XIX
tidakIXX
, 10 lebih besar dari 9) - Kiri ke kanan, tidak ada prioritas operator, seolah-olah Anda menggunakan kalkulator tangan.
- Mendukung seluruh bilangan positif input / output antara 1-4999 (tidak perlu untuk V̅)
- Tidak ada perpustakaan yang melakukan konversi angka romawi untuk Anda
Bagi Anda untuk memutuskan
- Sensitivitas kasus
- Spasi atau tidak ada spasi pada input
- Apa yang terjadi jika Anda mendapatkan output desimal. Potong, tidak ada jawaban, kesalahan, dll.
- Apa yang harus dilakukan untuk output yang tidak dapat Anda tangani. Negatif atau angka hingga besar untuk dicetak.
- Apakah akan mendukung penggunaan prinsip pengurangan yang lebih liberal daripada persyaratan minimum.
Kredit tambahan
- -50 - Tangani hingga 99999 atau lebih besar. Simbol harus menyertakan vinculum
Contoh input / output
XIX + LXXX (19+80)
XCIX
XCIX + I / L * D + IV (99+1/50*500+4)
MIV
Kode terpendek menang.
code-golf
roman-numerals
Danny
sumber
sumber
IM = 999
diperlukan penanganan angka ?IM
. Apakah outputnyaIM
atauCMXCIX
untuk 999 terserah Anda. Keduanya sesuai dengan persyaratan.Jawaban:
JavaScript (ES6), 238
Pemakaian:
Versi beranotasi:
sumber
T-SQL, 1974 - 50 = 1924 byte
Saya tahu bahwa bermain golf dalam SQL sama dengan bermain 18 hole tanpa apa-apa selain sand wedge, tapi saya menikmati tantangan yang satu ini, dan saya pikir saya berhasil melakukan beberapa hal menarik secara metodologis.
Ini mendukung vinculum untuk input dan output. Saya mengadopsi konvensi menggunakan trailing tilde untuk mewakilinya, jadi V ~ adalah 5000, X ~ adalah 10000, dll. Ini juga harus menangani output hingga 399.999 menurut standar penggunaan angka Romawi modern. Setelah itu, itu akan melakukan pengkodean Romawi sebagian non-standar apa pun dalam jangkauan yang didukung INT.
Karena semuanya bilangan bulat matematika, hasil non-bilangan bulat dibulatkan secara implisit.
Saya masih mengutak-atik solusi berbasis set untuk menggantikan beberapa perulangan WHILE yang mungkin mengurangi jumlah byte dan menjadi contoh yang lebih elegan dari SQL idiomatik. Ada juga beberapa byte yang bisa diperoleh dengan mengurangi penggunaan alias tabel ke minimum. Tapi karena pada dasarnya ini tidak dapat dimenangkan dalam bahasa ini, saya sebagian besar hanya di sini untuk memamerkan pakaian Don Quixote saya. :)
SELECT @i di bagian atas mengulangi input:
Dan SELECT pada akhirnya mengembalikan:
Dan Anda bisa mengujinya sendiri di SQLFiddle ini
Dan saya akan kembali untuk menambahkan beberapa komentar tentang cara kerjanya, karena mengapa memposting jawaban yang jelas hilang jika Anda tidak akan memanfaatkannya untuk nilai pendidikan?
sumber
Javascript -
482476 karakterInput / output sampel berfungsi:
Itu buruk menangani jumlah besar juga:
Dan itu menerima, tetapi tidak membutuhkan ruang juga.
Tapi, sejak saya bermain golf ada beberapa masalah:
Versi alternatif ini menangani angka lebih dari 5000 hingga 99999, tetapi memiliki
600598584 karakter:sumber
Javascript
479361348278253303 karakter - 50 untuk nomor pendukung hingga 1 juta, lengkap dengan dukungan vinculum:
Penggunaan:,
p(text)
misalnya,p('XIX + LXXX')
pengembalianXCIX
.Kode dengan komentar penjelasan:
Ini berfungsi untuk sampel yang diberikan dan untuk semua orang lain yang saya coba. Contoh:
sumber
Ruby 2.1,
353 (dan banyak iterasi lainnya), 295 - 50 = 245Penanganan vinculum menambah ~ 23 karakter.
Ini menangani "IL" atau "VM" pada input, dan gagal tanpa kesalahan negatif (masuk ke int tinggi) atau desimal (terpotong), atau spasi apa pun. Sekarang juga menangani angka pertama negatif (meskipun jika total negatif, itu masih gagal buruk). Gagal juga buruk jika Anda mulai dengan * atau / atau jika hasilnya 4 juta atau lebih besar.
Menggunakan Objek # kirim untuk fungsi "kalkulator tangan".
Tidak Disatukan:
sumber
Python 2 -
427418404401396395392 karakterMembaca dari input standar. Ini hanya menangani huruf besar (bisa membuatnya case-sensitive dengan biaya 8 karakter tambahan) dan membutuhkan ruang. Tidak ada validasi - Saya belum menguji untuk melihat bagaimana rusak dalam berbagai kasus. Namun, ia menangani angka seperti VC = 95.
Dan versi yang tidak diserang:
Saya punya perasaan Perl akan lebih baik, tetapi saya tidak cukup tahu tentang itu. Untuk penusukan pertama pada kode golf, saya merasa cukup baik tentang ini.
sumber
PHP -
549525524520 byteTidak ada yang terlalu inovatif: menormalkan operator untuk memastikan diutamakan kiri ke kanan, mengkonversi Roman ke desimal, berjalan
eval
pada pernyataan, misalnya XCIX + I / L * D + IV dikonversi ke sesuatu seperti return (((((+90 +9)) + (+1)) / (+50)) * (+500)) + (+4)); , lalu mengonversi desimal kembali ke Romawi.misalnya
sumber
Python - 446 byte
Ini dapat ditingkatkan secara signifikan. Saya merasa saya harus mengambil ayunan pertama menggunakan Python. Ia melakukan 3 hal pada pass pertama
x
untuk memasukkan semua kemungkinan kombinasi yang ditemui (bahkan jika mereka tidak digunakan). Misalnya, saatXIX
sedang lexed, nilai parsial dari"X":10
,"XI":11
dan"XIX":19
ditambahkan ke tabel simbolPada akhirnya, ia memanggil
eval
string asli (kecuali dengan parens yang ditambahkan) dan memberinya tabel simbol.Lalu saya hanya menempelkan solusi yang dikenal untuk mengkonversi bilangan bulat ke Romawi, karena saya telah bekerja cukup lama ... jangan ragu untuk meningkatkan sehingga saya belajar sesuatu yang baru :)
sumber