Bis zur Dezimalisierung im Jahr 1971 beruhte das britische Geld auf der Aufteilung des Pfunds in 240 Pennys. Ein Schilling war 12 Pennys, also machten 20 Schilling ein Pfund. Die kleinste Stückelung war das Hochrad bei einem Viertel eines Pennys. Es gab viele andere Bezeichnungen und Spitznamen für Münzen, die ziemlich verwirrend werden können, wenn Sie nicht an das System gewöhnt sind.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die (fast) jede Stückelung alten englischen Geldes in eine andere umwandeln kann. Um es dem Benutzer einfacher zu machen, müssen Sie Pluralformen und Spitznamen unterstützen.
Dies sind die Konfessionen und deren Synonyme, die Sie unterstützen müssen. Der Einfachheit halber führt ihr Wert in Farthings jede Zeile.
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
(Ich bin kein Brite, diese Liste ist keineswegs maßgebend, aber sie wird für die Herausforderung ausreichen.)
Über stdin oder Funktionsargument sollten Sie einen String der Form übernehmen
[value to convert] [denomination 1] in [denomination 2]
und zurück oder drucken
[value to convert] [denomination 1] is [converted value] [denomination 2]
wo [converted value]
ist [value to convert]
Einheiten Stückelung 1 bis Denomination 2 umgewandelt.
Die [value to convert]
und [converted value]
sind positive Schwimmer. In der Ausgabe sollten beide auf 4 Dezimalstellen gerundet oder abgeschnitten werden. Auf Wunsch können Sie [value to convert]
bei der Eingabe immer von einem Dezimalpunkt und Null ausgehen (zB 1.0
statt 1
).
Die Bezeichnungen 1 und 2 können zwei beliebige Begriffe aus der obigen Liste sein. Kümmere dich nicht darum, ob es sich um Plural handelt oder nicht, sondern behandle alle Bezeichnungen und Synonyme gleich. Sie können davon ausgehen, dass das Eingabeformat und die Nennwerte immer gültig sind.
Beispiele
1 pounds in shilling
→ 1 pounds is 20 shilling
( 1.0000 pounds is 20.0000 shilling
wäre gut)
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
Wertung
Der kürzeste Code in Bytes gewinnt.
quelle
quid
ISquid
. Dies wäre höchstwahrscheinlich auch mit dem alten Geld so gewesen. Beispiel:Five quid a pint! Cor blimey guvnor
. Ausnahme: Quids-inAntworten:
Pyth ,
146,145Mehr Lesbarkeit (Zeilenumbrüche und Einrückungen müssen entfernt werden, um ausgeführt zu werden):
Update: Es hat sich herausgestellt, dass es 1 Zeichen kürzer ist (kein Leerzeichen erforderlich), um die Zeichenfolge in eine Liste von 2 Zeichenfolgen zu zerlegen, bevor die Zeichenfolgenindexoperation ausgeführt wird.
/x"string"<b2 2
->xc"string"2<b2
. Ansonsten muss nichts geändert werden.Wie es funktioniert:
Dabei wird @ xnors Ansatz verwendet, den Wert der Währung anhand der ersten beiden Buchstaben zu ermitteln. Außerdem wird der Trick verwendet, den Anfangsbuchstaben zu ermitteln
half
oder ihn zutwo
entfernen und die Funktion erneut aufzurufen.Um den Wert der ersten beiden Zeichen zu ermitteln, wird die Position der ersten beiden Buchstaben der Währung in einer Zeichenfolge ermittelt, durch 2 geteilt und der Wert an diesem Index in der Liste übernommen. Dies ist viel kürzer als ein Diktat in Pyth.
Verwendet die Tatsache, dass
x
(find within string) -1 zurückgibt , wenn nicht vermieden wird, dass (po
Pfund)qu
(Quid) oderso
(Sovereigns) in die Zeichenfolge eingefügt werden, und gibt standardmäßig einfach das letzte Element der Liste (960) zurück.Durch Umstellen der Reihenfolge der Währungen im Nachschlagesystem und sorgfältiges Initialisieren mit
K4
undJ24
wurden alle Leerzeichen entfernt, die zum Trennen der Nummern in der Liste erforderlich gewesen wären.Uses pyth Dual Zuweisungsoperator,
A
am Eingang Split aufin
den Anfang und das Ende der Eingabe in separaten Variablen zu erhalten.Hat im Wesentlichen die gleiche Suche am Ende, obwohl Pyth keine hat
.split(_,1)
, so ist es etwas umständlicher.Beispiele:
quelle
<
und>
arbeitete als String- / Listen-Slice-Operatoren. Das ist viel, viel besser als den Kopf oder das Ende eines Koteletts zu nehmen :)Ruby,
345306302288287278273253252242232221202190 BytesNimmt Eingaben von STDIN und druckt auf STDOUT.
Ich verwende kurze reguläre Ausdrücke, um nur den gewünschten Nennwerten für jeden Wert zu entsprechen. Es gibt zwei Arrays, eines mit regulären Ausdrücken und eines mit Werten, an entsprechenden Indizes. Das Regex-Array ist ein durch Leerzeichen getrenntes Array-Literal, und das Wert-Array ist in eine Zeichenfolge aus UTF-8-Zeichen gepackt.
Ich wähle den Index in die Werte aus, indem ich nach einem regulären Ausdruck suche, der zu jedem Nennwert passt. Ich verwende auch standardmäßig den Fall Tuppence / Half-Groat (Wert 8), da hierfür die längste Regex erforderlich ist. Ebenso wird in einigen Mustern davon ausgegangen, dass andere Werte bereits mit früheren Mustern übereinstimmen, sodass jede Regex nur den gewünschten Wert von den übrigen unterscheidet. Auf diese Weise könnte ich wahrscheinlich noch ein paar Bytes abschneiden, indem ich die Reihenfolge der Bezeichnungen ändere.
Vielen Dank an Ventero, der mir geholfen hat, Pyth zu
schlagenund es kürzer zu machen!quelle
s[k]
), die$1
usw. überschreibt . Sie können einige Zeichen speichern, indem Sie den Kartenblock in ein Lambda verschieben und dies direkt in der letzten Zeile aufrufen (wodurch Sie auch die Zuweisungen für$1
und löschen können$2
). Ist auch.index
kürzer als.find_index
.Regexp.new k
→/#{k}/
und$><<gets.sub(/foo/){a=$3;...}
→gets[/foo/];a=$3;puts...
für insgesamt 221. Und Sie können natürlich den alten Trick anwenden, das int-Array in einen String zu packen (using.pack("U*")
) und dann in diesen String zu indizieren. Solltest du auf 195 Zeichen / 200 Bytes bringen.a=gets[/foo/,3]
Python 3:
264239 ZeichenDie Funktion ermittelt
f
den Schilling-Wert der Währungszeichenfolge,c
indem sie die ersten beiden Buchstabenmithilfe des Wörterbuchs abtastet,indem sie sie in einer Zeichenfolge findet. Die Präfixe "half" und "two" werden durch Zerhacken des Präfixes und des Leerzeichens und Anwenden eines Multiplikators erkannt und berücksichtigt. Da "halfpenny" ein Leerzeichen nach "half" fehlt, ergibt dies "enny", aber das wird mit einem fiktiven "en" -Eintrag behandelt.Vielen Dank an @isaacg und @grc für viele Verbesserungen beim Nachschlagen des Wörterbuchs.
quelle
2/4**(c<'t')
Teil..get(c[:2],960)
den Wert aus dem Wörterbuch nachschlagen und diepo=960,so=960,qu=960,
Einträge aus dem Wörterbuch auslassen .Python 2 - 345
358Erfordert die Eingabe einer Zahl als Float in Python
144.1
Ich denke, das könnte in Python 3 verkürzt werden ...
... Bestätigt dank @xnor. Auch bestätigt, dass ein besserer Algorithmus sehr wichtig ist;)
quelle
q=raw_input().split(' in ')
durchq,b=raw_input().split(' in ')
h+' gr':8
undh+' g':504
je nachdem, wer zuerst für die Hälfte Grütze ausgewertet wirdu
um die Guinea One ...Haskell - 315 Bytes
quelle
JavaScript (ES5), 344
Ich habe mich für einen Ansatz mit Hash-Funktionen entschieden ... Ich glaube, ich habe (relativ) unterschätzt, wie komplex die Eingabeverarbeitung sein würde (im Gegensatz zum Regex-Ansatz, bei dem die Zahl keine Rolle spielt).
quelle
Basierend auf der Antwort von @ FryAmTheEggMan mit einer anderen Art des Testens
str.startwith
:Python 2: 317
quelle
print
und der formatierten Zeichenfolge ein Leerzeichen hinzufügen . Sie können das Lambda auch umschreibens=lambda x:x and C.get(x,s(x[:-1]))or 0
, um ein Zeichen (zusammen mit den Leerzeichen) zu speichern. Dies ist eine ziemlich nette Idee, übrigens :)and/or
sache nicht gedacht habe.u.split(' ')
mitredenu.split(' ',1)
müssen., 1
!x and y or 0
kann generell zu verkürzt werdenx and y
, da beide zu0
oder gleichwertig auswertenFalse
wannx
Falsey ist.JavaScript ES6, 264
273Code-Snippet anzeigen
Dies ermittelt den Wert jeder Währung, indem sie mit verschiedenen regulären Ausdrücken verglichen wird, beginnend mit der breitesten
/t/
; Der Wert wird überschrieben, wenn eine andere Übereinstimmung festgestellt wird. Möglicherweise gibt es eine Möglichkeit, einige Bytes zu reduzieren, indem Sie die Regex-Zeichenfolge neu anordnen. Sie können es mit dem obigen Snippet testen (Es ist nur zur Verwendung von Dialogfeldern und zum Entfernen von ES6-Pfeilfunktionen formatiert, damit jeder den Code problemlos testen kann). Danke an Alconja für die Vorschläge.quelle
't0sh|bo0^p....'.split(0)
, 4 weitere mit.map
anstelle von.forEach
und 3 weitere mitc(0)
undc(1)
und tuns[d].match