Hasta la decimalización en 1971 , el dinero británico se basaba en dividir la libra en 240 centavos. Un chelín fue de 12 centavos, por lo que 20 chelines hicieron una libra. La denominación más pequeña era el pedo en un cuarto de un centavo. Había muchas otras denominaciones y apodos para las monedas, lo que puede ser bastante confuso si no estás acostumbrado al sistema.
Reto
Escriba un programa o función que pueda convertir (casi) cualquier denominación de dinero antiguo en inglés a cualquier otra. Para que sea más fácil para el usuario, debe admitir plurales y apodos.
Estas son las denominaciones y sus términos sinónimos que debe admitir. Por conveniencia, su valor en farthings lidera cada línea.
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
(No soy británico, esta lista no es de ninguna manera autorizada, pero será suficiente para el desafío).
A través de stdin o argumento de función, debe tomar una cadena de la forma
[value to convert] [denomination 1] in [denomination 2]
y devolver o imprimir
[value to convert] [denomination 1] is [converted value] [denomination 2]
donde [converted value]
se [value to convert]
convierten las unidades de denominación 1 en la denominación 2.
Los [value to convert]
y [converted value]
son flotadores positivos. En la salida, ambos deben redondearse o truncarse a 4 decimales. Si lo desea, puede suponer que [value to convert]
siempre tiene un punto decimal y cero cuando ingresa (por ejemplo, en 1.0
lugar de 1
).
Las denominaciones 1 y 2 pueden ser dos términos de la lista anterior. No se preocupe si son plurales o no, trate todas las denominaciones y sinónimos de la misma manera. Puede suponer que el formato de entrada y las denominaciones son siempre válidas.
Ejemplos
1 pounds in shilling
→ 1 pounds is 20 shilling
( 1.0000 pounds is 20.0000 shilling
estaría 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
Tanteo
El código más corto en bytes gana.
fuente
quid
isquid
. Lo más probable es que esto hubiera sido lo mismo con el dinero antiguo. Ejemplo:Five quid a pint! Cor blimey guvnor
. Excepción: quids-inRespuestas:
Pyth ,
146145Más legible (las líneas nuevas y las sangrías deben eliminarse para ejecutarse):
Actualización: Resulta que es 1 carácter más corto (no se necesita espacio) para cortar la cadena en una lista de cadenas de 2 caracteres antes de ejecutar la operación de índice de cadena.
/x"string"<b2 2
->xc"string"2<b2
. Nada más necesita ser cambiado.Cómo funciona:
Utiliza el enfoque de @ xnor de buscar el valor de la moneda usando sus dos primeras letras, así como el truco de detectar la inicial
half
otwo
, eliminarla y volver a llamar a la función.Para buscar el valor de los dos primeros caracteres, encuentra la ubicación de las dos primeras letras de la moneda en una cadena, luego se divide por 2 y toma el valor en ese índice en la lista. Esto es mucho más corto que un dict en pyth.
Utiliza el hecho de que
x
(buscar dentro de la cadena) devuelve -1 en caso de no evitar ponerpo
(libras)qu
(quid) oso
(soberanos) en la cadena, y simplemente devuelve el último elemento de la lista, 960, por defecto.Al reorganizar el orden de las monedas en el sistema de búsqueda e inicializar cuidadosamente, con
K4
yJ24
, se eliminaron todos los espacios que habrían sido necesarios para separar los números en la lista.Utiliza el operador de asignación dual de pyth
A
, en la entrada divididain
para obtener el principio y el final de la entrada en variables separadas.Esencialmente realiza la misma búsqueda al final, aunque pyth no tiene
.split(_,1)
, por lo que es algo más engorroso.Ejemplos:
fuente
<
y>
trabajé como operadores de corte de cadena / lista; eso es mucho, mucho mejor que tomar la cabeza o el final de un corte :)Rubí,
345306302288287278273253252242232221202190 bytesToma información de STDIN e imprime en STDOUT.
Estoy usando expresiones regulares cortas para hacer coincidir solo las denominaciones deseadas para cada valor. Hay dos matrices, una con expresiones regulares y otra con valores, en los índices correspondientes. La matriz regex es una matriz literal delimitada por espacios, y la matriz de valores está empaquetada en una cadena de caracteres UTF-8.
Estoy seleccionando el índice en los valores buscando una expresión regular que coincida con cada denominación. También estoy por defecto en el caso tuppence / half-groat (valor 8), porque eso requería la expresión regular más larga. Del mismo modo, algunos de los patrones suponen que otros valores ya han sido emparejados por patrones anteriores, por lo que cada expresión regular solo distingue el valor deseado solo de los restantes. Usando esto, probablemente podría recortar otro par de bytes reorganizando el orden de las denominaciones.
¡Gracias a Ventero por ayudarme a
vencer a Pythhaciéndolo más corto!fuente
s[k]
) la que sobrescribe,$1
etc. Puede guardar algunos caracteres moviendo el bloque del mapa a una lambda y llamando eso directamente en la última línea (que también le permite colocar las asignaciones para$1
y$2
). También.index
es más corto que.find_index
.Regexp.new k
→/#{k}/
y$><<gets.sub(/foo/){a=$3;...}
→gets[/foo/];a=$3;puts...
para un total de 221. Y, por supuesto, puede usar el viejo truco de empaquetar la matriz int en una cadena (usando.pack("U*")
) y luego indexarla en esa cadena. Debería bajarlo a 195 caracteres / 200 bytes.a=gets[/foo/,3]
Python 3:
264239 caracteresLa función
f
obtiene el valor de chelín de la cadena de monedac
al tomar las huellas digitales de las dos primeras letrasusando el diccionarioal encontrarlas en una cadena. Los prefijos "mitad" y "dos" se detectan y explican cortando el prefijo y el espacio y aplicando un multiplicador. Como "halfpenny" carece de un espacio después de "half", esto resulta en "enny", pero eso se maneja con una entrada ficticia "en".Gracias a @isaacg y @grc por muchas mejoras en la búsqueda del diccionario.
fuente
2/4**(c<'t')
parte..get(c[:2],960)
para buscar el valor del diccionario y omitiendo laspo=960,so=960,qu=960,
entradas del diccionario.Pitón 2 - 345
358Requiere que el número de entrada sea flotante en Python, es decir
144.1
Creo que esto podría acortarse en Python 3 ...
... Confirmado gracias a @xnor. También confirmó que tener un mejor algoritmo importa mucho;)
fuente
q=raw_input().split(' in ')
porq,b=raw_input().split(' in ')
h+' gr':8
yh+' g':504
dependiendo de quién es evaluado primero por medio groatsu
al de Guinea ...Haskell - 315 bytes
fuente
JavaScript (ES5), 344
Fui con un enfoque de función hash ... Creo que subestimé (relativamente) cuán complejo sería el procesamiento de entrada (sobre el enfoque de expresiones regulares, eso no le importaría el número).
fuente
Basado en la respuesta de @ FryAmTheEggMan, con una forma diferente de prueba
str.startwith
:Pitón 2: 317
fuente
print
cadena formateada. También puede reescribir la lambdas=lambda x:x and C.get(x,s(x[:-1]))or 0
para guardar un personaje (junto con los espacios). Esta es una buena idea, por cierto :)and/or
cosa.u.split(' ')
vozu.split(' ',1)
a las monedas que tienen espacios, como "medio soberano"., 1
!x and y or 0
se puede acortar en general ax and y
, ya que ambos evalúan0
o son equivalentesFalse
cuandox
es Falsey.JavaScript ES6, 264
273Mostrar fragmento de código
Esto obtiene el valor de cada moneda al compararlo con varias expresiones regulares, comenzando por la más amplia
/t/
; el valor se sobrescribe si se encuentra otra coincidencia. Puede haber una manera de reducir un par de bytes reordenando la cadena de expresiones regulares. Puede probarlo con el fragmento anterior (está formateado solo para usar cuadros de diálogo y eliminar las funciones de flecha ES6 para que todos puedan probar el código fácilmente). Gracias a Alconja por las sugerencias.fuente
't0sh|bo0^p....'.split(0)
, 4 más usando.map
en lugar de.forEach
y 3 más información llamandoc(0)
yc(1)
y haciendos[d].match