Sasaran:
Tulis fungsi yang mengambil angka sebagai input dan mengembalikan angka romawi untuk nomor tersebut sebagai output.
Simbol Angka Romawi:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Sebagai contoh tentang apa yang saya maksud ketika saya mengatakan "angka romawi tangan pendek", mari pertimbangkan mencari angka romawi untuk mewakili tahun 1983, karena itulah tahun saya dilahirkan. Salah satu opsi adalah melakukan ini dengan cara biasa (10 huruf):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
Pilihan lainnya adalah melakukannya dengan cara singkat (6 karakter):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Tahukah Anda apa artinya ini?!? !! ?? Jika saya roman saya bisa menyelamatkan 4 karakter setiap kali saya menulis tanggal lahir saya! Woot Woot !!
Namun, sebelum saya maju dalam kegembiraan, saya memiliki pertanyaan untuk ditulis, jadi saya mungkin harus mendefinisikan aturan angka romawi tangan pendek sehingga kita semua berada di halaman yang sama:
Aturan Angka Romawi Singkat:
- Selalu pertimbangkan simbol dari kiri ke kanan hingga tidak ada lagi karakter yang perlu dipertimbangkan.
- Jika tidak ada simbol bernilai lebih tinggi di sebelah kanan simbol saat ini:
- Tambahkan nilai simbol saat ini ke total angka romawi ini.
- Jika ada simbol bernilai lebih tinggi di sebelah kanan simbol yang Anda pertimbangkan:
- Temukan simbol bernilai tertinggi paling kanan di sebelah kanan simbol saat ini
- Pertimbangkan semua karakter hingga simbol itu sebagai satu angka romawi
- Hitung nilai angka romawi itu menggunakan langkah-langkah ini
- Kurangi nilai angka romawi dari total angka romawi ini.
- Pindah ke simbol berikutnya setelah grup yang baru saja Anda pertimbangkan
- Setiap angka romawi harus memiliki setidaknya 1 simbol di dalamnya.
- Itu dia! Apa pun yang mengikuti aturan ini akan diterima!
Contoh:
IIIIV = (-(1+1+1+1)+5) = 1 //Don't ask me why you'd want to do this!
VVX = (-(5+5) + 10) = 0 //Who said you couldn't represent 0 with roman numerals?!!?
VVXM = (-(-(5+5) + 10) + 1000) = 1000 //Again...don't ask me why you'd want to do this!
MXIIXMI = (1000-(10-(1+1)+10)+1000+1) = 1983 //Ahhh...such a great year :)
Aturan Pertanyaan:
Buat fungsi yang mengambil nomor tunggal sebagai input dan mengembalikan angka romawi untuk nomor itu sebagai output menggunakan aturan di atas. Hitung codeGolfScore dari fungsi ini.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Dengan menggunakan fungsi Anda dari aturan 1, buat angka romawi antara -1000 (benar, NEGATIF seribu) dan 3.000. Kemudian jumlah panjang karakter angka romawi ini untuk mendapatkan totalCharacterCount Anda . Berikut beberapa pseudocode yang akan diklarifikasi:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- Final FinalScore terendah !
Catatan: Karena jumlah total Karakter adalah dalam sepuluh-ribuan +, algoritma karakter-panjang harus menjadi prioritas utama. Skor kode-golf hanyalah tie-breaker jika beberapa pengguna menemukan algoritma atau algoritma optimal yang dekat satu sama lain.
Selamat mencoba, dan bersenang-senang di perayaan MMXII Anda besok malam !!!
sumber
DDDDM
berdiri untuk-1000
?""
diizinkan untuk nol atau apakah kita harus menggunakanVVX
atau sesuatu yang setara?IXV = -(-1 + 10) + 5 = -4
(kemenangan paling kanan), atauIXV = -1 + 10 + 5 = 14
(kemenangan bernilai tertinggi)?Jawaban:
Haskell, 25637 (= 268 + 25369)
26045 (= 222 + 25823)untuk digunakan sebagai contoh
Anda dapat mengevaluasi jumlah panjang dengan mudah
Yang membutuhkan sesuatu dalam urutan satu menit.
sumber
C ++, 345 karakter kode, 25021 angka romawi = 25366
Deobfuscated sedikit, dengan driver:
V
menghitung nilai numerik dari strings
panjang angka romawi yang diberikanL
. String dikodekan basis 7 (digit pertama s% 7, digit kedua s / 7% 7, ...). Setiap digit dikodekan dengan I = 0, V = 1, ..., M = 6.f
apakah enumerasi brute-force dari string angka romawi yang mungkin untuk menemukan satu yangV
mengevaluasin
.Jumlah digit angka romawi optimal. Angka romawi terpanjang yang dibutuhkan untuk [-1000,3000] adalah 11 digit (misalnya -827 = CMDDMLXXIII), yang membutuhkan waktu sekitar 5 menit pada mesin saya.
sumber
LMCLXXIII
sebagai jawaban-777
. Saya akan membacanya sebagai-50+1000-100+50+10+10+3 = 923 ≠ -777
, hanya dengan "nilai paling kanan lebih tinggi " daripada " tertinggi " yang diberikannya-777
. Tapi itu hanya apa yang Anda minta di komentar!VVVXI
untuk-4
saatIXVX
ini sebenarnya lebih pendek, karena saya hanya melihat) - tapi itu sangat legal.Ruby, 25987 (= 164 + 25823)
Anda dapat menelepon
r
langsung untuk mendapatkan hasilnya. Jumlah di atas rentang hasil yang ditentukanyang merupakan jumlah optimal seperti solusi lainnya.
sumber
C # 23537 (639 karakter kode + 22898 karakter keluaran)
Menghitung:
Enumerable.Range(-1000, 3000).Sum(i => M.R(i).Length);
sumber