Aż do zdziesiątkowania w 1971 r. Brytyjskie pieniądze opierały się na podziale funta na 240 centów. Szyling wynosił 12 centów, więc 20 szylingów to funt. Najmniejszy nominał to grzebanie w jednej czwartej centa. Istnieje wiele innych nominałów i pseudonimów monet, co może być dość mylące, jeśli nie jesteś przyzwyczajony do systemu.
Wyzwanie
Napisz program lub funkcję, która może konwertować (prawie) dowolne nominały starych angielskich pieniędzy na dowolne inne. Aby ułatwić użytkownikowi, musisz obsługiwać liczbę mnogą i pseudonimy.
Są to nominały i ich synonimiczne warunki, które musisz wspierać. Dla wygody ich wartość w farthings prowadzi każdą linię.
1: farthing, farthings
2: halfpence, halfpenny, halfpennies
4: penny, pennies, pence, copper, coppers
8: twopenny, twopennies, twopence, tuppence, half groat, half groats
12: threepence, threepenny, threepennies, threepenny bit, threepenny bits, thruppence, thrupenny, thrupennies, thrupenny bit, thrupenny bits
16: groat, groats
24: sixpence, sixpenny, sixpennies, sixpenny bit, sixpenny bits, tanner, tanners
48: shilling, shillings, bob
96: florin, florins, two bob bit, two bob bits
120: half crown, half crowns
240: crown, crowns
480: half sovereign, half sovereigns
504: half guinea, half guineas
960: pound, pounds, pounds sterling, sovereign, sovereigns, quid, quids
1008: guinea, guineas
(Nie jestem Brytyjczykiem, ta lista nie jest autorytatywna, ale wystarczy na wyzwanie).
Za pomocą argumentu stdin lub funkcji należy przyjąć ciąg znaków
[value to convert] [denomination 1] in [denomination 2]
i zwróć lub wydrukuj
[value to convert] [denomination 1] is [converted value] [denomination 2]
w których [converted value]
to [value to convert]
jednostek nominału 1 przekształca się nominał 2.
[value to convert]
I [converted value]
są pozytywne pływaki. Na wyjściu oba powinny być zaokrąglone lub obcięte do 4 miejsc po przecinku. W razie potrzeby można założyć, że [value to convert]
zawsze ma kropkę dziesiętną i zero po wprowadzeniu (np. 1.0
Zamiast 1
).
Nominały 1 i 2 mogą być dowolnymi dwoma terminami z powyższej listy. Nie martw się, czy są w liczbie mnogiej, czy nie, traktuj wszystkie nominały i synonimy tak samo. Możesz założyć, że format wejściowy i nominały są zawsze prawidłowe.
Przykłady
1 pounds in shilling
→ 1 pounds is 20 shilling
( 1.0000 pounds is 20.0000 shilling
byłoby dobrze)
0.6 tuppence in tanner
→ 0.6 tuppence is 0.2 tanner
24 two bob bits in pounds sterling
→ 24 two bob bits is 2.4 pounds sterling
144 threepennies in guineas
→ 144 threepennies is 1.7143 guineas
Punktacja
Najkrótszy kod w bajtach wygrywa.
źródło
quid
jestquid
. Najprawdopodobniej byłoby tak samo ze starymi pieniędzmi. Przykład:Five quid a pint! Cor blimey guvnor
. Wyjątek: quids-inOdpowiedzi:
Pyth ,
146145Bardziej czytelne (nowe wiersze i wcięcia muszą zostać usunięte, aby uruchomić):
Aktualizacja: Okazuje się, że jest o 1 znak krótszy (nie wymaga spacji), aby pokroić ciąg na listę 2 ciągów znaków przed uruchomieniem operacji indeksu ciągu.
/x"string"<b2 2
->xc"string"2<b2
. Nic więcej nie trzeba zmieniać.Jak to działa:
Wykorzystuje @ podejścia XNOR dnia patrząc w górę wartości waluty przy użyciu dwóch pierwszych liter, a także sprawę wykrywania początkowego
half
lubtwo
usunięcie go i ponownie wywołanie funkcji.Aby wyszukać wartość pierwszych dwóch znaków, znajduje lokalizację pierwszych dwóch liter waluty w ciągu, a następnie dzieli przez 2 i przyjmuje wartość pod tym indeksem na liście. To jest znacznie krótsze niż dyktat w pyth.
Wykorzystuje fakt, że
x
(znajdź w ciągu ciągu) zwraca -1 po nieudanym uniknięciu wpisaniapo
(funtów)qu
(quid) lubso
(suwerenów) w ciągu i po prostu domyślnie zwraca ostatni element listy, 960.Przez zmianę kolejności walut w systemie wyszukiwania i staranne zainicjowanie za pomocą
K4
iJ24
, wszystkie spacje, które byłyby potrzebne do oddzielenia liczb na liście, zostały usunięte.Używa operatora podwójnego przypisania Pytha
A
, przy podziale danych wejściowych na,in
aby uzyskać początek i koniec danych wejściowych w osobnych zmiennych.Robi w zasadzie to samo wyszukiwanie na końcu, chociaż pyth nie ma
.split(_,1)
, więc jest nieco bardziej kłopotliwy.Przykłady:
źródło
<
i>
pracowałem jako operatory odcinków łańcuchów / list; to o wiele, wiele lepiej niż zabranie głowy lub końca kotleta :)Rubinowy,
345306302288287278273253252242232221202190 bajtówPobiera dane wejściowe ze STDIN i drukuje do STDOUT.
Używam krótkich wyrażeń regularnych, aby dopasować tylko pożądane nominały dla każdej wartości. Istnieją dwie tablice, jedna z wyrażeniami regularnymi i jedna z wartościami, przy odpowiednich indeksach. Tablica wyrażeń regularnych jest literałem rozdzielanym spacjami, a tablica wartości jest spakowana w ciąg znaków UTF-8.
Wybieram indeks do wartości, szukając wyrażenia regularnego pasującego do każdego nominału. Domyślam się również przypadku tuppence / half-groat (wartość 8), ponieważ wymagało to najdłuższego wyrażenia regularnego. Podobnie, niektóre wzorce zakładają, że inne wartości zostały już dopasowane do wcześniejszych wzorców, więc każde wyrażenie regularne odróżnia tylko pożądaną wartość tylko od pozostałych. Korzystając z tego, prawdopodobnie mógłbym ogolić kolejną parę bajtów, zmieniając kolejność nominałów.
Dzięki Ventero za pomoc w
pokonaniu Pytha,dzięki czemu jest on krótszy!źródło
s[k]
) zastępuje$1
itp. Możesz zapisać kilka znaków, przenosząc blok mapy do lambda i wywołując go bezpośrednio w ostatnim wierszu (co pozwala również na upuszczenie przypisań dla$1
i$2
)..index
Jest także krótszy niż.find_index
.Regexp.new k
→/#{k}/
i$><<gets.sub(/foo/){a=$3;...}
→gets[/foo/];a=$3;puts...
w sumie 221. I możesz oczywiście użyć starej sztuczki upakowania tablicy int w łańcuch (używając.pack("U*")
), a następnie indeksowania do tego łańcucha. Powinieneś sprowadzić cię do 195 znaków / 200 bajtów.a=gets[/foo/,3]
Python 3:
264239 znakówFunkcja
f
pobiera szylingową wartość łańcucha walutowegoc
poprzez odcisk palca pierwszych dwóch literza pomocą słownika, znajdując je w ciągu. Przedrostki „połowa” i „dwa” są wykrywane i uwzględniane poprzez wycięcie przedrostka i spacji oraz zastosowanie mnożnika. Ponieważ „halfpenny” nie ma spacji po „half”, skutkuje to „enny”, ale jest to obsługiwane za pomocą fikcyjnego wpisu „en”.Dzięki @isaacg i @grc za wiele ulepszeń w wyszukiwaniu słownika.
źródło
2/4**(c<'t')
część..get(c[:2],960)
do wyszukiwania wartości ze słownika i pomijającpo=960,so=960,qu=960,
wpisy ze słownika.Python 2 - 345
358Wymaga, aby numer wejściowy był zmiennoprzecinkowy w pythonie, tj
144.1
Myślę, że można to skrócić w Pythonie 3 ...
... Potwierdzone dzięki @xnor. Potwierdził także, że posiadanie lepszego algorytmu ma duże znaczenie;)
źródło
q=raw_input().split(' in ')
przezq,b=raw_input().split(' in ')
h+' gr':8
ih+' g':504
w zależności od tego, kto jest oceniany najpierw przez pół kaszu
do gwinei ...Haskell - 315 bajtów
źródło
JavaScript (ES5), 344
Poszedłem z podejściem funkcji skrótu ... Myślę, że nie doceniłem (względnie), jak skomplikowane byłoby przetwarzanie danych wejściowych (w stosunku do wyrażenia regularnego, które nie dbałoby o liczbę).
źródło
Na podstawie odpowiedzi @ FryAmTheEggMan, z innym sposobem testowania
str.startwith
:Python 2: 317
źródło
print
i sformatowanego ciągu. Możesz także przepisać lambda,s=lambda x:x and C.get(x,s(x[:-1]))or 0
aby zapisać postać (wraz ze spacjami). To całkiem fajny pomysł, btw :)and/or
.u.split(' ')
mówić wu.split(' ',1)
przypadku walut, które mają spacje, na przykład „pół suwerena”., 1
!x and y or 0
można ogólnie skrócić dox and y
, ponieważ oba oceniają, gdy jest Falsey,0
lub równoważnie .False
x
JavaScript ES6, 264
273Pokaż fragment kodu
Otrzymuje wartość każdej waluty, porównując ją z różnymi wyrażeniami regularnymi, zaczynając od najszerszego
/t/
; wartość zostanie zastąpiona, jeśli zostanie znalezione inne dopasowanie. Może istnieć sposób na zmniejszenie kilku bajtów poprzez zmianę kolejności ciągu wyrażeń regularnych. Możesz go przetestować za pomocą powyższego fragmentu (jest sformatowany tylko w celu korzystania z okien dialogowych i usuwania funkcji strzałek ES6, dzięki czemu każdy może łatwo przetestować kod). Dzięki Alconja za sugestie.źródło
't0sh|bo0^p....'.split(0)
, 4 więcej stosując.map
zamiast.forEach
i 3 więcej dzwoniącc(0)
ic(1)
i robis[d].match