До десятичности в 1971 году британские деньги основывались на делении фунта на 240 копеек. Шиллинг был 12 копеек, поэтому 20 шиллингов сделали фунт. Самым маленьким номиналом был фартинг на четверть копейки. Было много других номиналов и прозвищ для монет, которые могут запутать, если вы не привыкли к системе.
Вызов
Напишите программу или функцию, которая может преобразовать (почти) любую деноминацию старых английских денег в любую другую. Чтобы пользователю было проще, вам нужно поддерживать множественное число и псевдонимы.
Это наименования и их синонимы, которые вы должны поддерживать. Для удобства их значение в фартингах приводит каждую строчку.
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
(Я не британец, этот список ни в коем случае не является авторитетным, но его будет достаточно для вызова.)
С помощью стандартного аргумента или функции вы должны получить строку вида
[value to convert] [denomination 1] in [denomination 2]
и вернуть или распечатать
[value to convert] [denomination 1] is [converted value] [denomination 2]
где [converted value]
- [value to convert]
единицы достоинства 1, преобразованные в наименование 2.
[value to convert]
И [converted value]
положительные поплавки. В выходных данных оба должны быть округлены или усечены до 4 десятичных знаков. При желании вы можете предположить, что [value to convert]
всегда имеет десятичную точку и ноль при вводе (например, 1.0
вместо 1
).
Деноминации 1 и 2 могут быть любыми двумя терминами из списка выше. Не беспокойтесь о том, множественные они или нет, относитесь ко всем наименованиям и синонимам одинаково. Вы можете предположить, что формат ввода и номиналы всегда действительны.
Примеры
1 pounds in shilling
→ 1 pounds is 20 shilling
( 1.0000 pounds is 20.0000 shilling
было бы хорошо)
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
счет
Самый короткий код в байтах побеждает.
источник
quid
являетсяquid
. Скорее всего, это было бы то же самое со старыми деньгами. Пример:Five quid a pint! Cor blimey guvnor
. Исключение: квидс-инОтветы:
Пиф ,
146145Более читабельно (для запуска необходимо удалить переводы строки и отступы):
Обновление: Оказывается, это на 1 символ короче (без пробела), чтобы разбить строку в список из 2-х символьных строк перед запуском операции индекса строки.
/x"string"<b2 2
->xc"string"2<b2
. Больше ничего не нужно менять.Как это работает:
При этом используется подход @ xnor, который заключается в поиске значения валюты с использованием первых двух букв, а также в приеме определения начального
half
илиtwo
удаления его и повторного вызова функции.Чтобы найти значение первых двух символов, он находит расположение первых двух букв валюты в строке, затем делит на 2 и принимает значение по этому индексу в списке. Это намного короче, чем диктат в пите.
Использует тот факт, что
x
(найти в строке) возвращает -1 при невозможности избежать помещенияpo
(фунтов)qu
(quid) илиso
(суверенных) в строку и просто возвращает последний элемент списка, 960, по умолчанию.Путем изменения порядка валют в поисковой системе и тщательной инициализации с помощью
K4
иJ24
все пробелы, необходимые для разделения чисел в списке, были удалены.Использует оператор двойного присваивания pyth при разбивке
A
входных данных,in
чтобы получить начало и конец входных данных в отдельных переменных.По сути, делает тот же поиск в конце, хотя Pyth не имеет
.split(_,1)
, так что это несколько более громоздко.Примеры:
источник
<
и>
работал как оператор среза строки / списка; это намного, намного лучше, чем брать голову илиRuby,
345306302288287278273253252242232221202190 байтовПринимает ввод из STDIN и печатает в STDOUT.
Я использую короткие регулярные выражения, чтобы соответствовать только желаемым номиналам для каждого значения. Есть два массива, один с регулярными выражениями и один со значениями, с соответствующими индексами. Массив регулярных выражений является литералом массива с разделителями-пробелами, а массив значений упакован в строку символов UTF-8.
Я выбираю индекс по значениям путем поиска регулярного выражения, соответствующего каждому наименованию. Я также по умолчанию использую случай tuppence / half-groat (значение 8), потому что для этого требуется самое длинное регулярное выражение. Аналогично, некоторые из шаблонов предполагают, что другие значения уже сопоставлены с более ранними шаблонами, поэтому каждое регулярное выражение только отличает желаемое значение только от остальных. Используя это, я мог бы, вероятно, сбрить еще пару байтов, изменив порядок номиналов.
Спасибо Вентеро за то, что он помог мне
победить Пита,сделав его короче!источник
s[k]
), которое перезаписывает$1
и т. Д. Вы можете сохранить несколько символов, переместив блок карты в лямбду и вызвав его непосредственно в последней строке (что также позволяет отбрасывать назначения для$1
и$2
). И.index
короче чем.find_index
.Regexp.new k
→/#{k}/
и$><<gets.sub(/foo/){a=$3;...}
→gets[/foo/];a=$3;puts...
всего 221. И вы, конечно, можете использовать старый трюк, заключающийся в упаковке массива int в строку (использование.pack("U*")
) и последующем индексировании в эту строку. Должны получить до 195 символов / 200 байт.a=gets[/foo/,3]
Python 3:
264239 символовФункция
f
получает значение шиллинга строки валютыc
путем снятия отпечатков пальцев с первых двух букв,используя словарь, находя их в строке. Префиксы «половина» и «два» обнаруживаются и учитываются путем выбора префикса и пробела и применения множителя. Поскольку «полпенни» не хватает пробела после «половины», это приводит к «enny», но это обрабатывается с вымышленной записью «en».Спасибо @isaacg и @grc за большое улучшение поиска по словарю.
источник
2/4**(c<'t')
часть..get(c[:2],960)
поиск значения из словаря и пропускаяpo=960,so=960,qu=960,
записи из словаря.Python 2 - 345
358Требуется, чтобы входной номер был числом с плавающей точкой в python, т.е.
144.1
Я думаю, что это может быть сокращено в Python 3 ...
... Подтверждено благодаря @xnor. Также подтвердил, что лучший алгоритм имеет большое значение;)
источник
q=raw_input().split(' in ')
наq,b=raw_input().split(' in ')
h+' gr':8
и вh+' g':504
зависимости от того, кого оценивают в первую очередь дляu
к гвинейскому ...Haskell - 315 байт
источник
JavaScript (ES5), 344
Я пошел с подходом хэш-функции ... Я думаю, что недооценил (относительно), насколько сложной была бы обработка ввода (по сравнению с подходом регулярных выражений, это не заботится о числе).
источник
На основе ответа @ FryAmTheEggMan, с другим способом тестирования
str.startwith
:Python 2: 317
источник
print
и отформатированной строке. Вы также можете переписать лямбду,s=lambda x:x and C.get(x,s(x[:-1]))or 0
чтобы сохранить символ (вместе с пробелами). Это довольноand/or
.u.split(' ')
сказать,u.split(' ',1)
для валют, которые имеют пробелы, такие как "наполовину суверенный"., 1
!x and y or 0
может быть сокращен в целомx and y
, так как оба оценивают0
или эквивалентно,False
когдаx
Фолси.JavaScript ES6, 264
273Показать фрагмент кода
Это получает значение каждой валюты, сравнивая ее с различными регулярными выражениями, начиная с самого широкого
/t/
; значение перезаписывается, если встречается другое совпадение. Может быть способ сократить пару байтов, переупорядочив строку регулярного выражения. Вы можете протестировать его с помощью приведенного выше фрагмента (он отформатирован только для использования диалоговых окон и удаления функций стрелок ES6, чтобы каждый мог легко протестировать код). Спасибо Alconja за предложения.источник
't0sh|bo0^p....'.split(0)
, 4 больше, используя.map
вместо.forEach
и 3 более по телефонуc(0)
иc(1)
и делатьs[d].match