Я плачу только долларами


14

Как подсказывает название - хотя и дискретно - я плачу только долларами.

Соревнование

Напишите функцию / программу, которая принимает строку в качестве входных данных, которая является денежным значением, которому предшествует символ. ex) £4.99, Затем верните ту же сумму в долларах США.

вход

Вы получите строку в качестве ввода. Он будет иметь символ валюты, за которым следует число с двумя десятичными знаками (что может быть .00). Там будут либо десятичные точки .и / или запятые, ,разделяющие число. Следующие символы валюты появятся на входе:

Евро: €
Фунт стерлингов: £
Юань Ренминби: ¥

Кроме того, будет запятая или десятичная точка в зависимости от валюты, чтобы отделить «доллары» от «центов»:

Евро: #. ###, ##
Фунт стерлингов: #, ###. ##
Юань Юань: #, ###. ##

Выход

Вы конвертируете входные данные из валюты, определяемой символом, в доллары США с округлением до двух десятичных знаков Выходные данные будут иметь формат $#,###.##, и, конечно, слева от выходных данных будет больше чисел, если это необходимо ( РЕДАКТИРОВАТЬ: это означает, что в выходных данных есть произвольное количество запятых, как во входных данных ). Курс обмена валюты, который мы будем использовать, ниже.

Вы можете предположить, что вход содержит символ, который является только одним из вышеуказанных ( € £ ¥ . ,) - что он всегда действителен.

Курсы валют

€1 : $1.10
£1 : $1.37
¥1 : $0.15

Примеры

Input:
€1,37
£4.00
¥2,782,122.78

Respective output:
$1.51
$5.48
$417,318.42

Заключительные слова

  1. Если вы используете один из вышеуказанных символов (€, £, ¥), вы можете считать их как 1 байт
  2. Это код гольф, поэтому выигрывает самый короткий код в байтах!

1
Если вы хотите использовать истинное значение l10n, юань должен иметь разделитель запятой на отметке 10k, а не на отметке 1k. (например, 10,0000.15)
Не то, что Чарльз

24
Забавно, что если бы вы отправили этот вопрос вчера, обменный курс английского фунта был бы £1 : $1.51xD
Кевин Круйссен,

1
Хорошо @ Аднан, я сделаю это. Выполнено.
Даниэль

2
Хм, это вывод правильный? 1.37 * 1.10 = 1,507 = 1,51(так нет 1.52) и 4.00 * 1.37 = 5.48(нет 5.50) и 2782122.78 * 0.15 = 417318.417 = 417318.42(не 420165.06) ...: S
Кевин Круйссен

1
@KevinCruijssen, я только что понял, что при использовании Google для конвертации обменный курс уже изменился. Починил это.
Даниэль

Ответы:


1

Pyth - 54 53 48 47 байт

Забыли про условное приложение W.

.F"${:,.2f}"*v-tXWqhQ\€Q",.")\,@[1.1.15d1.37)Ch

Тестовый пакет .


Хм .. это я или это довольно большой ответ для Pyth с точки зрения байтов? o.Ô Это почти 1/4 моего ответа на Java ! (Обычно это
1/50

1
@KevinCruijssen да, форматирование строк и необработанные данные о валюте составляют почти половину размера.
Малтысен

5

Python 3.6 (предварительная версия), 87

lambda s:f"${int(s.translate({46:'',44:''})[1:])*[110,15,0,137][ord(s[0])%4]/1e4:,.2f}"

Использует f-строки, чтобы оценить результат и отформатировать его .

s.translate({46:'',44:''})удаляет точки и запятые s, тем самым делая его действительным intлитералом, а затем int(...)преобразует его в реальный intобъект.


4

Выпуклый, 56 55 54 байтов

(\®\.|,"ö)\e_\'.\++~\"€£¥"#[1.1_.27+.15]=*"%,.2f"\Ø'$\

Ну, это определенно можно сократить. Попробуйте онлайн!

Сэкономили байт благодаря Линн!

Объяснение придет, когда я смогу получить доступ к компьютеру.


Как насчет [1.1_.27+.15]?
Линн

@ Линн, это гений! Благодарность!
GamrCorps

«Объяснение наступит, когда я смогу получить доступ к компьютеру», подразумевая, что этот маленький кусочек удивительной нечитаемости был написан на мобильном устройстве . молодец, учёный ученый. отлично сработано.
Струджи

1
@strugee Да, я отсутствовал весь день, но для этой цели я сделал клавиатуру CP-1252 для своего iPhone.
GamrCorps

Почему вычеркнуты последние 55 байтов? Кроме того , опечатка в определенно - определенно .
user48538

3

Python 3.5, 137 131 121 120 117 байт:

(Спасибо Maltysen за подсказку о сохранении 6 байтов (137 -> 131)!)

lambda u:'${:,.2f}'.format(float(u[1:].translate([{44:''},{44:46,46:''}]['€'in u]))*{'€':1.1,'£':1.37,'¥':.15}[u[0]])

Попробуйте онлайн! (Ideone)


2
вам не нужно делать свое собственное округление, .format()делает это за вас, если вы это делаете${:,.2f}
Maltysen

@ Maltysen Спасибо! Я не знал, что смогу сделать это! :)
Р. Кап

46:0заменяет точки символами NUL.
vaultah

@vaultah И что? Это работает для евро входов.
Р. Кап

@vaultah Ну, это прекрасно работает на Ideone и моем компьютере.
Р. Кап

3

JavaScript (ES6), 107

Простой и понятный, возможно, более пригодный для игры в гольф

Примечание: проверено в FireFox. Многие браузеры (особенно мобильные) имеют глючную поддержкуtoLocaleString

a=>(a.replace(/\D/g,'')/1e4*(a<'¥'?137:a>'€'?110:15)).toLocaleString('en',{style:'currency',currency:'USD'})

ТЕСТОВОЕ ЗАДАНИЕ

function test()
{
  var i=I.value
  var F=a=>(a.replace(/\D/g,'')/1e4*(a<'¥'?137:a>'€'?110:15)).toLocaleString('en',{style:'currency',currency:'USD'})
  O.textContent=F(i)
}

test()
<input id=I value='¥2,782,122.78' oninput='test()'>
<pre id=O></pre>


Я мог только проверить это на Firefox. Можете ли вы дать мне ссылку на Firefoex?
NoOneIsHere

@NoOneIsHere Google "Firefoex", он даст вам правильную ссылку, даже если она написана с ошибкой
edc65

3

Java 7, 240 227 215 211 207 202 199 196 байт

(201 - 2 байта из-за правила « Если вы используете один из вышеуказанных символов (€, £, ¥), вы можете считать их как 1 байт »)
Спасибо @Frozn за сохранение большого количества байтов.

String c(String a){int c=a.charAt(0);return java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US).format(new Long(a.substring(1).replaceAll(",|\\.",""))*(c<'¥'?1.37:c>'¥'?1.1:.15)/100);}

Ungolfed & тестовый код:

Попробуй это здесь.

class Main{
  static String c(String a){
    int c = a.charAt(0);
    return java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US)
        .format(new Long(a.substring(1).replaceAll(",|\\.","")) *
                 (c < '¥'
                   ? 1.37
                   : c > '¥'
                     ? 1.1
                     : .15
                  ) / 100);
  }

  public static void main(String[] a){
    System.out.println(c("€1,37"));
    System.out.println(c("£4.00"));
    System.out.println(c("¥2,782,122.78"));
  }
}

Выход:

$1.51
$5.48
$417,318.42

2
char c=a.charAt(0)(в общем, вам вообще не нужно c, смотрите мой ответ)
edc65

1
Вытаскивая d *тройку, вы сохраняете некоторое дублирование. Выглядит следующим образом : d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn

@Frozn Спасибо. Кроме того, к сожалению /100и *.01такое же количество байтов, а c=='€'?.011:c=='£'?.0137:.0015также точно так же, как с /100.
Кевин Круйссен

1
Да, это плохо. Но вот хорошая новость: благодаря уникальным значениям знаков валюты в юникоде вы можете его сократить, потому что '£' < '¥' < '€'. Таким образом, вы можете написать c<'¥'?1.37:c>'¥'?1.1:.15что на 2 символа короче.
Frozn

1
Просто видел, что нам больше не нужно d, так как он используется только один раз.
Frozn

1

F #, 198 байт

(s:string)="$"+(System.Double.Parse(if s.[0]='€'then s.[1..].Replace(".","").Replace(',','.')else s.[1..].Replace(",",""))*(if s.[0]='€'then 1.1 else if s.[0]='£'then 1.37 else 0.15)).ToString("N2")

Un-Golfed:

let IOnlyUseDollars(s : string) = 
    let cur = s.[0]
    let str = if cur = '€' then s.[1..].Replace(".","").Replace(',', '.') else s.[1..].Replace(",","")
    let amt = System.Double.Parse(str)
    let dol = amt * (if cur = '€' then 1.1 else if cur = '£' then 1.37 else 0.15)
    "$" + dol.ToString("N2")

Я все еще пытаюсь понять F #, поэтому работа с разделителями тысяч занимает много байтов.

Согласно правилам испытаний, символы евро, иены и фунта считаются по одному байту каждый, несмотря на то, что Unicode хранит их внутри.


1

Python 3.5, 101 98

lambda x:'${:,.2f}'.format(int(x[1:].translate({44:'',46:''}))*{'€':110,'£':137,'¥':15}[x[0]]/1e4)

Символы евро, фунта и иены учитываются как 1 байт / символ каждый, согласно правилам испытания.

Вместо того, чтобы переводить или интерпретировать тысячи и десятичные разделители, они просто убираются, чтобы получить строку в виде простой цифры.

Цифровая строка (после символа валюты) преобразуется в целое число.

Символ валюты используется как указатель в словарь курсов валют; преобразование выполняется путем умножения на коэффициент преобразования и деления на 10000.

Результат форматируется лидирующим знаком доллара, двумя десятичными разрядами точности и запятыми для группировки.


Почему бы вам не удалить 0 из 1.10, чтобы сохранить 1 байт?
Даниэль

Может быть, вы можете пропустить. в соотношениях и разделить на 1E4
agtoever

0

Python 3, 112 байтов, не конкурирующих

def c(x):x=x.translate(None,",.");print“$”+‘{:,.2f}’.format([1.1,1.37,0.15][“€£¥”.index(x[0])]*int(x[1:])/100,2)

Это не соревнование, потому что я не думаю, что мне позволено отвечать на мой собственный вопрос.

Кроме того, у меня еще не было возможности запустить это на компьютере, но мне кажется, что это должно работать. Я буду запускать его на компьютере, как только у меня будет шанс.


4
Вы вполне можете ответить на свой вопрос. Некоторые люди даже придумывают ответ, прежде чем задавать сам вопрос. Обычно их все еще избивают такие игры в гольф, как Jelly, Pyth, Pyke и другие. ;)
Кевин Круйссен

0

PHP, 117 байт

function f($s){return'$'.number_format(ereg_replace('[^0-9]','',substr($s,1))*[E=>.011,P=>.0137,Y=>.0015][$s[0]],2);}

Это использует устаревшую функцию; заменить ereg_replace('[^0-9]'на, preg_replace('%[^\d]%'чтобы сделать код полностью современным; добавляет 1 байт.


0

CJam, 54 байта

'$q(\",."-de-2\"€£¥"#[1.1 1.37 .15]=*2mOs'./~\3/',*'.@

Попробуй это здесь!


Приятный ответ и добро пожаловать на сайт! Только так вы знаете, есть онлайн переводчик CJam здесь Вы можете связать к тому , что в вашем посте , чтобы сделать его проще для читателя , чтобы бежать / проверить свой ответ.
Джеймс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.