Wyzwanie
Biorąc pod uwagę jakiś ciąg wejściowy, zwróć prawdziwą wartość, jeśli reprezentuje poprawną liczbę rzymską między 1 (= I
) a 3999 (= MMMCMXCIX
), a w przeciwnym razie wartość falsey.
Detale
- Dane wejściowe są niepustym ciągiem znaków, który zawiera tylko znaki
IVXLCDM
. - Cyfry rzymskie (których używamy tutaj w tym wyzwaniu) są zdefiniowane w następujący sposób:
Używamy tylko następujących symboli:
Symbol I V X L C D M
Value 1 5 10 50 100 500 1000
Aby zdefiniować, które ciągi są faktycznie poprawnymi cyframi rzymskimi, prawdopodobnie najłatwiej jest podać regułę konwersacji: Aby zapisać liczbę dziesiętną a3 a2 a1 a0
(gdzie każda ai
reprezentuje jedną cyfrę. Na przykład, aby przedstawić, 792
że mamy a3=0, a2=7, a1=9, a0=2
) jako cyfrę rzymską, rozkładamy ją w potęgę dziesiątek. Różne potęgi dziesięciu można zapisać w następujący sposób:
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
Zaczynając od lewej strony z najbardziej znaczącą cyfrą, możemy przekonwertować liczbę, którą każda cyfra reprezentuje osobno, i połączyć je. Na przykład z góry wyglądałoby to tak:
Digit a3 a2 a1 a0
Decimal 0 7 9 2
Roman DCC XC II
Dlatego cyfrą rzymską dla 792
jest DCCXCII
. Oto pełna lista wszystkich cyfr rzymskich istotnych dla tego wyzwania: OEIS a006968.txt
Przykłady
Prawda
MCCXXXIV (1234)
CMLXXXVIII (988)
DXIV (514)
CI (101)
Falsey
MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
MMMM
nieważny? Czy istnieje litera 5000, która powinna być używana zamiast M <letter>?I,V,X,L,C,D,M
.Odpowiedzi:
Pełne , 1362 bajtów
Dane wyjściowe
I
dla prawidłowych cyfr rzymskich w zakresieI-MMMCMXCIX
iNULLA
(0) lub informują, że dane wprowadzone przez użytkownika nie są poprawnymi cyframi rzymskimi.źródło
C # (interaktywny kompilator Visual C #) ,
79109 bajtówTo wydaje się być wyzwaniem Regex, jestem pewien, że można znaleźć krótsze rozwiązanie ...
Wypróbuj online!
źródło
{0,3}
do{,3}
?{5,}
praca, ale nie{,5}
./u:System.Text.RegularExpressions.Regex
, tak jak ta odpowiedź :)^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$
. Ta sama długość, ale wygląda dziwniej (który jest celem, prawda?)Wolfram Language (Mathematica) , 35 bajtów
Wypróbuj online!
5 bajtów zapisanych dzięki @attinat
ograniczenie
[1,3999]
niefortunnie kosztuje 7 bajtów ...oto kod dla dowolnej liczby rzymskiej
Wolfram Language (Mathematica) , 28 bajtów
Wypróbuj online!
powyższy kod działa dla dowolnej liczby, nie tylko [1,3999]
źródło
IVXLCDM
.”Boole
jest również krótszy (o jeden bajt) niż użycieIf
w ten sposób.Zespół CP-1610 ( Intellivision ),
52 ... 4847 DECLE 1 = 59 bajtówWypróbujmy to na systemie, który wyprzedza Perla o dobre 7 lat. :-)
Pobiera wskaźnik do łańcucha zakończonego znakiem NUL w R4 . Ustawia zero flagę jeśli dane wejściowe są prawidłową cyfrą rzymską, lub usuwa je w inny sposób.
W jaki sposób?
Wyrażenie regularne może zostać przepisane jako 4 grupy o tej samej strukturze, pod warunkiem, że
#
jakikolwiek nieprawidłowy znak, który na pewno nie będzie obecny w ciągu wejściowym.Nasza rutyna próbuje przeanalizować wejściowy ciąg znaków po znaku zgodnie z tymi wzorami i ostatecznie sprawdza, czy osiągnięto koniec łańcucha.
Wynik
zrzut ekranu jzIntv
1. Kod operacyjny CP-1610 jest kodowany za pomocą 10-bitowej wartości, zwanej „DECLE”. Ta procedura ma długość 47 DECLE, zaczynając od 4876 $, a kończąc na 48A4 $ (w zestawie).
źródło
Java 8, 70 bajtów
Port @ Innat3 „s C # odpowiedzi , więc upewnij się, że go głosujesz!
Wypróbuj online.
Wyjaśnienie:
źródło
R ,
747156 bajtówDzięki @RobinRyder, @Giuseppe, & @MickyT dla ich sugestie jak używać grep skutecznie R wbudowanego w
as.roman
.Wypróbuj online!
źródło
as.roman
i tak nie będzie działać, ponieważ działa tylko z3899
jakiegoś powodu.as.roman
: najpierwM
usuń inicjał, jeśli taki istnieje, a następnie sprawdź, czy wynik jestas.roman(1:2999)
. Wymaga to specjalnej obsługi przypadku, w którym znajduje się wejścieM
.romans
że przydałaby się w R ??? Dodano go w wersji 2.5.0 (kwiecień 2007) ...Wolfram Language (Mathematica) , 32 bajty
Wypróbuj online!
źródło
Galaretka ,
48 47 4644 bajtów-1 dzięki Nickowi Kennedy'emu
IVXLCDM
1
0
Wypróbuj online! Lub zobacz zestaw testowy .
W jaki sposób?
źródło
Perl 5 (
-p
), 57 bajtówTIO
{0,3}
zmiennik kwantyfikatora został zmieniony przez*
&!/(.)\1{3}/
aby upewnić się, że ten sam znak nie może wystąpić 4 razy z rzędu.-/(.)\1{3}/
ponieważ dałoby-1
naIIIIVI
przykładźródło
Python 2 , 81 bajtów
Wypróbuj online!
Spójrzmy na ostatnią część wyrażenia regularnego, która odpowiada cyfrom rzymskim do 9 (w tym pusty ciąg znaków)
Ma dwie alternatywy oddzielone
|
:V?I{,3}
: Opcjonalny,V
po którym następują maksymalnie 3I
. To dopasowuje pusty łańcuchI
,II
,III
,V
,VI
,VII
,VIII
.I[VX]
: Po którymI
następuje aV
lubX
. To pasujeIV
iIX
.To samo z
X,L,C
dopasowywaniem dziesiątek, z dopasowywaniemC,D,M
setek, i na koniec^M{,3}
pozwala na 3M
(tysiące) na początku.Próbowałem wygenerować szablon dla każdego trio znaków, zamiast pisać 3 razy, ale było to o wiele dłużej.
źródło
^
kotwicy;match
już sugeruje, że pasuje na początku łańcucha.^
.f=
nie jest zawarta w kodzie, ponieważ dozwolone są funkcje anonimowe. To tylko dla TIO.lambda
s są legalne, więc nieprzypisane powiązane metody skompilowanego wyrażenia regularnego również powinny być dobre.Siatkówka ,
5651 bajtówPort odpowiedzi Perla 5 na @NahuelFouilleul , więc upewnij się, aby go upvote!
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
05AB1E ,
6198 bajtówSolidny-52 bajty dzięki @Adnan , ponieważ najwyraźniej wbudowana liczba rzymska 05AB1E nie została udokumentowana, haha .. xD
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (rozdział Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak
ŽF¯
jest3999
.Oryginalna 61 bajtów odpowiedź:
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz tę końcówkę 05AB1E kopalni (sekcje Jak kompresować strun nie jest częścią słownika? , Jak skompresować dużych liczb całkowitych? I jak skompresować list całkowitych? ) , Aby zrozumieć, dlaczego:
•1∞Γ'иÛnuÞ\₂…•
jest397940501547566186191992778
Ž8в
jest2112
•1∞Γ'иÛnuÞ\₂…•Ž8вв
jest[1,11,111,12,2,21,211,2111,10]
.•6#&‘нδ•
jest"xivcxlmcd"
źródło
.X
nie jest to udokumentowane, ale myślę, że to powinno działać:3999L.XQO
3999
. :)perl -MRegexp :: Common -pe, 34 bajty
Ta
&!/(.)\1{3}/
część jest konieczna, ponieważRegexp::Common
pozwala na cztery (ale nie pięć) takich samych znaków z rzędu. W ten sposób dopasowuje cyfry rzymskie używane na tarczach zegara, gdzieIIII
często stosuje się 4.źródło
Python 3 ,
116113109107105106 bajtówWypróbuj online!
-1 bajt dzięki ShadowRanger
źródło
^
jest zbędne, ponieważmatch
pasuje już tylko na początku łańcucha.$
jest konieczny (fullmatch
implikuje tylko kotwice na obu końcach, i oczywiście kosztowałoby to więcej niż a$
).Ruby , (
-n
) 56 bajtówWypróbuj online!
Wyprowadza 0 (prawda) lub zero (fałsz).
źródło