Jusqu'à la décimalisation en 1971 , la monnaie britannique était basée sur la division de la livre en 240 sous. Un shilling était de 12 sous, donc 20 shillings ont fait une livre. La plus petite dénomination était la portion d'un quart de sou. Il y avait beaucoup d'autres dénominations et surnoms pour les pièces, ce qui peut devenir assez déroutant si vous n'êtes pas habitué au système.
Défi
Écrivez un programme ou une fonction qui peut convertir (presque) toute dénomination de vieil argent anglais en une autre. Pour faciliter la tâche de l'utilisateur, vous devez prendre en charge les pluriels et les surnoms.
Ce sont les dénominations et leurs termes synonymes que vous devez prendre en charge. Pour plus de commodité, leur valeur en farthings mène chaque ligne.
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
(Je ne suis pas britannique, cette liste ne fait nullement autorité mais elle suffira pour le défi.)
Via stdin ou argument de fonction, vous devez prendre une chaîne de la forme
[value to convert] [denomination 1] in [denomination 2]
et retourner ou imprimer
[value to convert] [denomination 1] is [converted value] [denomination 2]
où [converted value]
sont les [value to convert]
unités de la dénomination 1 converties en dénomination 2.
Les [value to convert]
et [converted value]
sont des flotteurs positifs. Dans la sortie, les deux doivent être arrondis ou tronqués à 4 décimales. Si vous le souhaitez, vous pouvez supposer qu'il a [value to convert]
toujours un point décimal et zéro lors de la saisie (par exemple 1.0
au lieu de 1
).
Les dénominations 1 et 2 peuvent être deux termes quelconques de la liste ci-dessus. Ne vous inquiétez pas s'ils sont pluriels ou non, traitez toutes les dénominations et synonymes de la même manière. Vous pouvez supposer que le format d'entrée et les dénominations sont toujours valides.
Exemples
1 pounds in shilling
→ 1 pounds is 20 shilling
(ce 1.0000 pounds is 20.0000 shilling
serait bien)
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
Notation
Le code le plus court en octets gagne.
la source
quid
estquid
. Cela aurait probablement été le même avec l'ancien argent. Exemple:Five quid a pint! Cor blimey guvnor
. Exception: quids-inRéponses:
Pyth ,
146145Plus lisible (les sauts de ligne et les retraits doivent être supprimés pour fonctionner):
Mise à jour: Il s'avère que c'est un caractère plus court (pas d'espace nécessaire) pour découper la chaîne en une liste de 2 chaînes de caractères avant d'exécuter l'opération d'indexation de chaîne.
/x"string"<b2 2
->xc"string"2<b2
. Rien d'autre ne doit être changé.Comment ça marche:
Cela utilise l'approche de @ xnor consistant à rechercher la valeur de la devise en utilisant ses deux premières lettres, ainsi que l'astuce de détection de l'initiale
half
outwo
, de la supprimer et d'appeler à nouveau la fonction.Pour rechercher la valeur des deux premiers caractères, il trouve l'emplacement des deux premières lettres de la devise dans une chaîne, puis divise par 2 et prend la valeur à cet index dans la liste. C'est beaucoup plus court qu'un dict en pyth.
Utilise le fait que
x
(find within string) renvoie -1 en cas d'échec pour éviter de mettrepo
(livres)qu
(quid) ouso
(souverains) dans la chaîne, et renvoie simplement le dernier élément de la liste, 960, par défaut.En réorganisant l'ordre des devises dans le système de recherche et en l'initialisant soigneusement, avec
K4
etJ24
, tous les espaces qui auraient été nécessaires pour séparer les nombres dans la liste ont été supprimés.Utilise l'opérateur d'affectation double de pyth,,
A
sur la division d'entréein
pour obtenir le début et la fin de l'entrée dans des variables distinctes.Fait essentiellement la même recherche à la fin, bien que pyth n'en ait pas
.split(_,1)
, il est donc un peu plus lourd.Exemples:
la source
<
et>
travaillais en tant qu'opérateurs de tranche de chaîne / liste; c'est beaucoup, beaucoup mieux que de prendre la tête ou la fin d'une côtelette :)Rubis,
345306302288287278273253252242232221202190 octetsPrend l'entrée de STDIN et imprime vers STDOUT.
J'utilise des expressions régulières courtes pour ne faire correspondre que les dénominations souhaitées pour chaque valeur. Il existe deux tableaux, un avec des expressions rationnelles et un avec des valeurs, aux indices correspondants. Le tableau d'expressions régulières est un littéral de tableau délimité par des espaces et le tableau de valeurs est compressé dans une chaîne de caractères UTF-8.
Je sélectionne l'index dans les valeurs en recherchant une expression régulière qui correspond à chaque dénomination. Je prends également par défaut le cas de tuppence / half-groat (valeur 8), car cela nécessitait la plus longue expression régulière. De même, certains des modèles supposent que d'autres valeurs ont déjà été mises en correspondance avec des modèles antérieurs, de sorte que chaque expression régulière ne distingue que la valeur souhaitée uniquement des autres. En utilisant cela, je pourrais probablement raser un autre couple d'octets en réorganisant l'ordre des dénominations.
Merci à Ventero de m'avoir aidé à
battre Pythpour le raccourcir!la source
s[k]
) qui écrase$1
etc. Vous pouvez enregistrer quelques caractères en déplaçant le bloc de carte dans un lambda et en l'appelant directement dans la dernière ligne (ce qui vous permet également de supprimer les affectations pour$1
et$2
). Est également.index
plus court que.find_index
.Regexp.new k
→/#{k}/
et$><<gets.sub(/foo/){a=$3;...}
→gets[/foo/];a=$3;puts...
pour un total de 221. Et vous pouvez bien sûr utiliser l'ancienne astuce consistant à compresser le tableau int dans une chaîne (à l'aide.pack("U*")
) puis à l'indexer dans cette chaîne. Cela devrait vous faire descendre à 195 caractères / 200 octets.a=gets[/foo/,3]
Python 3:
264239 caractèresLa fonction
f
obtient la valeur en shilling de la chaîne monétairec
en empreinte digitale les deux premières lettresà l'aide du dictionnaireen les trouvant dans une chaîne. Les préfixes "moitié" et "deux" sont détectés et pris en compte en coupant le préfixe et l'espace et en appliquant un multiplicateur. Comme "halfpenny" manque d'espace après "half", cela se traduit par "enny", mais cela est géré avec une entrée fictive "en".Merci à @isaacg et @grc pour de nombreuses améliorations dans la recherche du dictionnaire.
la source
2/4**(c<'t')
partie..get(c[:2],960)
pour rechercher la valeur dans le dictionnaire et en omettant lespo=960,so=960,qu=960,
entrées du dictionnaire.Python 2 - 345
358Nécessite que le numéro d'entrée soit un flottant en python, c'est-à-dire
144.1
Je pense que cela pourrait être raccourci en python 3 ...
... Confirmé grâce à @xnor. A également confirmé qu'avoir un meilleur algorithme est très important;)
la source
q=raw_input().split(' in ')
parq,b=raw_input().split(' in ')
h+' gr':8
eth+' g':504
selon qui est évalué en premier pour les demi-gruauxu
à celui de la Guinée ...Haskell - 315 octets
la source
JavaScript (ES5), 344
Je suis allé avec une approche de fonction de hachage ... Je pense que j'ai sous-estimé (relativement) la complexité du traitement d'entrée (par rapport à l'approche regex, peu importe le nombre).
la source
Basé sur la réponse de @ FryAmTheEggMan, avec une manière différente de tester
str.startwith
:Python 2: 317
la source
print
chaîne formatée et. Vous pouvez également réécrire le lambdas=lambda x:x and C.get(x,s(x[:-1]))or 0
pour enregistrer un caractère (avec les espaces). C'est uneand/or
chose.u.split(' ')
voixu.split(' ',1)
pour les devises qui ont des espaces, comme "demi-souverain"., 1
!x and y or 0
peut être raccourci en généralx and y
, car les deux évaluent0
ou équivalentFalse
àx
Falsey.JavaScript ES6, 264
273Afficher l'extrait de code
Cela obtient la valeur de chaque devise en la comparant à différentes expressions régulières, en commençant par la plus large
/t/
; la valeur est remplacée si une autre correspondance est rencontrée. Il pourrait y avoir un moyen de raser quelques octets en réorganisant la chaîne d'expression régulière. Vous pouvez le tester à l'aide de l'extrait ci-dessus (il est formaté uniquement pour utiliser des boîtes de dialogue et supprimer les fonctions de flèche ES6 afin que tout le monde puisse tester le code facilement). Merci à Alconja pour les suggestions.la source
't0sh|bo0^p....'.split(0)
, 4 plus en utilisant au.map
lieu de.forEach
et 3 plus en appelantc(0)
etc(1)
et faires[d].match