Tantangan
Diberikan beberapa input string, kembalikan nilai kebenaran jika itu mewakili angka romawi yang benar antara 1 (= I
) dan 3999 (= MMMCMXCIX
), dan nilai falsey sebaliknya.
Detail
- Input adalah string yang tidak kosong yang hanya terdiri dari karakter
IVXLCDM
. - Angka romawi (yang kami gunakan di sini dalam tantangan ini) didefinisikan sebagai berikut:
Kami hanya menggunakan simbol berikut:
Symbol I V X L C D M
Value 1 5 10 50 100 500 1000
Untuk menentukan string mana yang benar-benar angka romawi, mungkin paling mudah untuk memberikan aturan percakapan: Untuk menulis angka desimal a3 a2 a1 a0
(di mana masing-masing ai
mewakili satu digit. Jadi misalnya untuk mewakili yang 792
kita miliki a3=0, a2=7, a1=9, a0=2
.) Sebagai angka romawi, kita mendekomposisikannya menjadi kekuatan puluhan. Kekuatan sepuluh yang berbeda dapat ditulis sebagai berikut:
1-9: I, II, III, IV, V, VI, VII, VIII, IX
10-90: X, XX, XXX, XL, L, LX, LXX, LXXX, XC
100-900: C, CC, CCC, CD, D, DC, DCC, DCCC, CM
1000-3000: M, MM, MMM
Dimulai dari sisi kiri dengan digit paling signifikan, kita dapat mengonversi angka yang diwakili oleh masing-masing digit secara terpisah dan menyatukannya. Jadi untuk contoh dari atas ini akan terlihat seperti ini:
Digit a3 a2 a1 a0
Decimal 0 7 9 2
Roman DCC XC II
Oleh karena itu angka romawi 792
adalah DCCXCII
. Berikut adalah daftar lengkap semua angka romawi yang relevan untuk tantangan ini: OEIS a006968.txt
Contohnya
Sejujurnya
MCCXXXIV (1234)
CMLXXXVIII (988)
DXIV (514)
CI (101)
Falsey
MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
MMMM
tidak valid? Apakah ada huruf untuk 5000 yang seharusnya digunakan untuk M <letter>?I,V,X,L,C,D,M
.Jawaban:
Verbose , 1362 byte
Keluaran
I
untuk angka romawi yang valid dalam kisaranI-MMMCMXCIX
danNULLA
(0) atau menginformasikan input pengguna bukan angka romawi yang valid.sumber
C # (Visual C # Interactive Compiler) ,
79109 byteIni sepertinya tantangan Regex, saya yakin solusi yang lebih pendek dapat ditemukan ...
Cobalah online!
sumber
{0,3}
ke{,3}
?{5,}
pekerjaan, tetapi tidak{,5}
./u:System.Text.RegularExpressions.Regex
, seperti jawaban ini :)^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$
. Panjangnya sama, tetapi terlihat lebih aneh (yang tujuannya, kan?)Bahasa Wolfram (Mathematica) , 35 byte
Cobalah online!
5 byte disimpan, terima kasih kepada @attinat
batasan
[1,3999]
unfortunateley biaya 7 byte ...sini adalah kode untuk nomor romawi
Bahasa Wolfram (Mathematica) , 28 byte
Cobalah online!
kode di atas berfungsi untuk nomor apa pun, bukan hanya [1,3999]
sumber
IVXLCDM
."Boole
juga lebih pendek (dengan satu byte) daripada menggunakanIf
cara itu.Perakitan CP-1610 ( Intellivision ),
52 ... 4847 DECLEs 1 = 59 byteMari kita coba ini pada sistem yang mendahului Perl selama 7 tahun. :-)
Membawa pointer ke string null-dihentikan di R4 . Atur bendera Nol jika inputnya berupa angka Romawi yang valid, atau kosongkan sebaliknya.
Bagaimana?
Ekspresi reguler dapat ditulis ulang sebagai 4 grup dengan struktur yang sama, asalkan
#
karakter yang tidak valid yang dijamin tidak ada dalam string input.Rutin kami mencoba untuk menguraikan karakter string input berdasarkan karakter sesuai dengan pola ini dan akhirnya memeriksa apakah akhir string tercapai.
Keluaran
tangkapan layar jzIntv
1. Sebuah opcode CP-1610 dikodekan dengan nilai 10-bit, yang dikenal sebagai 'DECLE'. Rutin ini sepanjang 47 DECLE, mulai dari $ 4876 dan berakhir pada $ 48A4 (termasuk).
sumber
Java 8, 70 byte
Port of @ Innat3 jawaban C # , jadi pastikan untuk menghapusnya!
Cobalah online.
Penjelasan:
sumber
R ,
747156 byteTerima kasih kepada @RobinRyder, @Giuseppe, & @MickyT atas saran mereka tentang cara menggunakan grep secara efektif dengan R yang ada di dalamnya
as.roman
.Cobalah online!
sumber
as.roman
toh tidak akan berfungsi, karena hanya berfungsi hingga3899
beberapa alasan.as.roman
: strip pertama inisialM
jika ada, kemudian periksa apakah hasilnya ada dias.roman(1:2999)
. Ini membutuhkan penanganan khusus dari kasus di mana input beradaM
.romans
akan menjadi hal yang berguna untuk dimasukkan ke dalam R ??? Itu ditambahkan dalam 2.5.0 (April 2007) ...Bahasa Wolfram (Mathematica) , 32 byte
Cobalah online!
sumber
Jelly ,
48 47 4644 byte-1 Terima kasih kepada Nick Kennedy
IVXLCDM
1
0
(jika tidak).Cobalah online!Atau lihat test-suite .
Bagaimana?
sumber
Perl 5 (
-p
), 57 byteTIO
{0,3}
kuantifier diubah oleh*
&!/(.)\1{3}/
untuk memastikan karakter yang sama tidak dapat muncul 4 kali berturut-turut.-/(.)\1{3}/
karena akan memberikan-1
untukIIIIVI
misalnyasumber
Python 2 , 81 byte
Cobalah online!
Mari kita lihat bagian terakhir dari regex, yang cocok dengan angka Romawi hingga 9 (termasuk string kosong)
Ini memiliki dua alternatif yang dipisahkan oleh
|
:V?I{,3}
: Sebuah opsionalV
diikuti oleh hingga 3I
's. Ini cocok dengan string kosongI
,II
,III
,V
,VI
,VII
,VIII
.I[VX]
: SebuahI
diikuti olehV
atauX
. Ini cocokIV
danIX
.Hal yang sama dengan
X,L,C
mencocokkan puluhan, denganC,D,M
mencocokkan ratusan, dan akhirnya^M{,3}
memungkinkan hingga 3M
(ribuan) di awal.Saya mencoba membuat template untuk masing-masing trio karakter daripada menulisnya 3 kali, tapi ini jauh lebih lama.
sumber
^
jangkar di awal;match
sudah tersirat cocok dengan di awal string.^
.f=
tidak termasuk dalam kode karena fungsi anonynomous diizinkan. Ini hanya untuk TIO.lambda
adalah legal, jadi metode terikat yang disusun untuk regex yang dikompilasi harus juga bagus.Retina ,
5651 bytePelabuhan @NahuelFouilleul 's Perl 5 jawaban , jadi pastikan untuk mendukungnya!
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
05AB1E ,
6198 byteKekalahan-52 byte terimakasih untuk @Adnan , karena rupanya builtin Number Roman 05AB1E tidak didokumentasikan, haha .. xD
Cobalah online atau verifikasi semua kasus uji .
Penjelasan:
Lihat tip tambang 05AB1E ini (bagian Cara mengompres bilangan bulat besar? ) Untuk memahami alasannya
ŽF¯
adalah3999
.Jawaban asli 61 byte:
Cobalah online atau verifikasi semua kasus uji .
Penjelasan:
Lihat ini ujung 05AB1E saya (bagian Cara string kompres bukan bagian dari kamus? , Cara kompres bilangan bulat besar? , Dan Cara kompres bilangan bulat daftar? ) Untuk memahami mengapa:
•1∞Γ'иÛnuÞ\₂…•
adalah397940501547566186191992778
Ž8в
adalah2112
•1∞Γ'иÛnuÞ\₂…•Ž8вв
adalah[1,11,111,12,2,21,211,2111,10]
.•6#&‘нδ•
adalah"xivcxlmcd"
sumber
.X
tidak didokumentasikan, tetapi saya pikir ini harus berhasil:3999L.XQO
3999
. :)perl -MRegexp :: Common -pe, 34 byte
Bagian
&!/(.)\1{3}/
ini diperlukan, karenaRegexp::Common
memungkinkan empat (tetapi bukan lima) dari karakter yang sama berturut-turut. Dengan begitu, ini cocok dengan angka romawi yang digunakan pada tampilan jam, di manaIIII
sering digunakan untuk 4.sumber
Python 3 ,
116113109107105106 byteCobalah online!
-1 byte terima kasih kepada ShadowRanger
sumber
^
tidak perlu karenamatch
hanya cocok di awal string.$
diperlukan (hanyafullmatch
menyiratkan jangkar di kedua ujungnya, dan jelas itu akan menelan biaya lebih dari a$
).Ruby , (
-n
) 56 byteCobalah online!
Output 0 (benar) atau nihil (falsy).
sumber