Utwórz podstawowy kalkulator dla cyfr rzymskich.
Wymagania
- Podpory
+
,-
,*
,/
- Wejścia i wyjścia należy spodziewać się tylko jednego odejmującego prefiks na symbol (czyli 3 nie może być
IIV
, ponieważ istnieją dwaI
„s przedV
) - Obchodzenie zasady odejmowania w wejście i wyjście musi wynosić minimum wsparcia nowoczesnych standardowych konwencji, w której tylko uprawnienia dziesiątce są odejmowane od większych liczb (np
I
,X
,C
wymagane są subtractors ale nieV
,L
,D
) i odejmowanie nigdy nie odbywa się od wielu więcej niż 10x odejmator (np.IX
Musi być obsługiwany, aleIC
nie jest wymagany). - Dane wejściowe i wyjściowe powinny być od lewej do prawej w kolejności od wartości, zaczynając od największej (tj. 19 =
XIX
nieIXX
, 10 jest większe niż 9) - Od lewej do prawej, bez pierwszeństwa dla operatora, tak jakbyś korzystał z kalkulatora ręcznego.
- Obsługuje wejście / wyjście całych liczb dodatnich od 1 do 4999 (nie ma potrzeby V need)
- Brak bibliotek wykonujących konwersję cyfr rzymskich
Do decyzji
- Rozróżnianie wielkości liter
- Spacje lub brak spacji na wejściu
- Co się stanie, jeśli otrzymasz wynik dziesiętny. Obcinanie, brak odpowiedzi, błąd itp.
- Co zrobić, aby uzyskać wyjście, którego nie można obsłużyć. Negatywy lub liczby do wydrukowania.
- Czy poprzeć bardziej liberalne stosowanie zasady odejmowania niż minimalny wymóg.
Dodatkowy kredyt
- -50 - Uchwyt do 99999 lub większy. Symbole muszą zawierać vinculum
Przykładowe wejście / wyjście
XIX + LXXX (19+80)
XCIX
XCIX + I / L * D + IV (99+1/50*500+4)
MIV
Najkrótszy kod wygrywa.
code-golf
roman-numerals
Danny
źródło
źródło
IM = 999
wymagana?IM
. To, czy dane wyjściowe są,IM
czyCMXCIX
dla 999, zależy od Ciebie. Oba spełniają wymagania.Odpowiedzi:
JavaScript (ES6), 238
Stosowanie:
Wersja z adnotacjami:
źródło
T-SQL, 1974-50 = 1924 bajtów
Wiem, że gra w golfa w SQL jest równoznaczna z graniem w 18 dołków bez piasku, ale podoba mi się to wyzwanie i myślę, że udało mi się zrobić kilka interesujących rzeczy metodologicznie.
To obsługuje vinculum zarówno dla wejścia jak i wyjścia. Przyjąłem konwencję używania tylnego tylda do reprezentowania go, więc V ~ to 5000, X ~ to 10000 itp. Powinien on również obsługiwać wyjścia do 399,999 zgodnie ze standardowym nowoczesnym użyciem cyfr rzymskich. Następnie wykona częściowo niestandardowe rzymskie kodowanie czegokolwiek w obsługiwanym zakresie INT.
Ponieważ jest to matematyka w liczbach całkowitych, wyniki nie będące liczbami całkowitymi są domyślnie zaokrąglane.
Nadal majstruję przy rozwiązaniu opartym na zestawie, aby zastąpić część pętli WHILE, która może zmniejszyć liczbę bajtów i być bardziej eleganckim przykładem idiomatycznego SQL. Istnieją również pewne bajty, które można uzyskać, ograniczając użycie aliasów tabeli do absolutnego minimum. Ale ponieważ w tym języku jest to w zasadzie niemożliwe do wygrania, jestem głównie tutaj, aby pochwalić się moim strojem Don Kichota. :)
SELECT @i u góry powtarza dane wejściowe:
A SELECT na końcu zwraca:
I możesz to przetestować sam na tym SQLFiddle
Wrócę, aby dodać komentarz na temat tego, jak to działa, ponieważ po co publikować oczywistą przegraną odpowiedź, jeśli nie zamierzasz wykorzystać jej dla wartości edukacyjnej?
źródło
JavaScript -
482476 znakówPrzykładowe wejście / wyjście działa:
Źle obsługuje też duże liczby:
I akceptuje, ale nie wymaga również spacji.
Ale odkąd grałem w golfa, ma pewne problemy:
Ta alternatywna wersja obsługuje liczby od 5000 do 99999, ale ma
600598584 znaków:źródło
JavaScript
479361348278253303 znaków - 50 dla liczb obsługujących do 1 miliona, wraz z obsługą vinculum:
Zastosowanie:
p(text)
np .p('XIX + LXXX')
ZwrotyXCIX
.Kod z komentarzami wyjaśniającymi:
Działa to dla podanych próbek i dla wszystkich innych próbowałem. Przykłady:
źródło
Ruby 2.1,
353 (i wiele innych iteracji), 295-50 = 245Obsługa vinculum dodaje ~ 23 znaki.
To obsługuje „IL” lub „VM” na wejściu i kończy się niepowodzeniem bez błędów na negatywach (przechodzi do wysokich int) lub dziesiętnych (obcina) lub dowolnych spacji. Teraz obsługuje także pierwszą ujemną liczbę (chociaż jeśli suma jest ujemna, to nadal zawodzi słabo). Nie udaje się również źle, jeśli zaczynasz od * lub / lub jeśli wynik wynosi 4 miliony lub więcej.
Używa obiektu # send dla funkcji „kalkulatora ręcznego”.
Nie golfowany:
źródło
Python 2 -
427418404401396395392 znakówOdczytuje ze standardowego wejścia. Obsługuje tylko wielkie litery (może powodować, że wielkość liter nie jest rozróżniana kosztem 8 dodatkowych znaków) i wymaga spacji. Nie sprawdza poprawności - nie testowałem, aby zobaczyć, jak się psuje w różnych przypadkach. Obsługuje jednak liczby takie jak VC = 95.
I wersja bez golfa:
Mam wrażenie, że Perl byłby lepszy, ale nie wiem o tym wystarczająco dużo. Jednak po raz pierwszy w golfa code czuję się z tym całkiem nieźle.
źródło
PHP -
549525524520 bajtówNic zbyt innowacyjnego: normalizuje operatory, aby zapewnić pierwszeństwo od lewej do prawej, konwertuje liczbę rzymską na dziesiętną, działa
eval
na instrukcji, np. XCIX + I / L * D + IV jest konwertowany na coś takiego jak return (((((((+90 +9)) + (+1)) / (+50)) * (+500)) + (+4)); , następnie konwertuje dziesiętne z powrotem na rzymski.na przykład
źródło
Python - 446 bajtów
Można to znacznie poprawić. Czułem, że muszę zrobić pierwszy zamach używając Pythona. Robi 3 rzeczy przy pierwszym przejściu
x
aby uwzględnić wszystkie możliwe napotkane kombinacje (nawet jeśli nie są używane). Na przykład, podczas gdyXIX
jest lexed cząstkowe wartości"X":10
,"XI":11
i"XIX":19
dodaje się do tablicy symboliNa koniec wywołuje
eval
oryginalny ciąg (oprócz dodanych parens) i nadaje mu tablicę symboli.Potem wkleiłem tylko znane rozwiązanie konwersji liczb całkowitych na rzymskie, ponieważ pracowałem nad tym wystarczająco długo ... nie krępuj się poprawić, aby nauczyć się czegoś nowego :)
źródło