Tôi chỉ trả bằng đô la


14

Như tiêu đề - mặc dù rời rạc - gợi ý, tôi chỉ trả bằng đô la.

Các thách thức

Viết hàm / chương trình lấy một chuỗi làm đầu vào, là giá trị tiền tệ đứng trước ký hiệu. ex) £4.99. Sau đó, trả lại số tiền tương tự được chuyển đổi sang USD.

Đầu vào

Bạn sẽ nhận được một chuỗi làm đầu vào. Nó sẽ có ký hiệu tiền tệ theo sau là một số có hai chữ số thập phân (có thể là .00). Sẽ có dấu thập phân .và / hoặc dấu phẩy ,phân tách số. Các ký hiệu tiền tệ sau đây sẽ xuất hiện trong các đầu vào:

Euro: €
Bảng Anh: £
Nhân dân tệ Nhân dân tệ:

Ngoài ra, sẽ có dấu phẩy hoặc dấu thập phân tùy thuộc vào loại tiền để tách 'đô la' khỏi 'xu':

Euro: #. ###, ##
Bảng Anh: #, ###. ##
Yuan Renminbi: #, ###. ##

Đầu ra

Bạn sẽ chuyển đổi đầu vào từ loại tiền được xác định bằng ký hiệu sang USD, làm tròn đến hai chữ số thập phân. Đầu ra sẽ ở định dạng $#,###.##, và dĩ nhiên sẽ có nhiều số ở bên trái của đầu ra nếu cần ( EDIT: điều này có nghĩa là có một số dấu phẩy tùy ý trong đầu ra, giống như trong đầu vào ). Tỷ giá hối đoái chúng tôi sẽ sử dụng dưới đây.

Bạn có thể giả sử rằng đầu vào chứa một ký hiệu chỉ là một trong các dấu trên ( € £ ¥ . ,) - rằng nó luôn hợp lệ.

Tỷ giá hối đoái

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

Ví dụ

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

Respective output:
$1.51
$5.48
$417,318.42

Từ cuối cùng

  1. Nếu bạn sử dụng một trong các ký hiệu trên (€, £, ¥), bạn có thể tính chúng là 1 byte
  2. Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng!

1
Nếu bạn muốn sử dụng l10n thực sự, đồng Nhân dân tệ nên có dấu phân cách dấu phẩy ở mốc 10k, không phải ở mốc 1k. (ví dụ 10,0000.15:)
Không phải Charles

24
Thật buồn cười nếu bạn đã đăng câu hỏi này vào ngày hôm qua, tỷ giá hối đoái của Bảng Anh sẽ là £1 : $1.51xD
Kevin Cruijssen

1
Ok @Adnan, tôi sẽ làm điều đó. Làm xong.
Daniel

2
Hmm, đầu ra đó có đúng không? 1.37 * 1.10 = 1,507 = 1,51(không phải 1.52) và 4.00 * 1.37 = 5.48(không 5.50) và 2782122.78 * 0.15 = 417318.417 = 417318.42(không 420165.06) ...: S
Kevin Cruijssen

1
@KevinCruijssen, tôi mới nhận ra rằng, khi sử dụng Google để chuyển đổi, tỷ giá hối đoái đã thay đổi. Đã sửa nó.
Daniel

Câu trả lời:


1

Pyth - 54 53 48 47 byte

Quên về ứng dụng có điều kiện W.

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

Phòng thử nghiệm .


Hmm .. đó là tôi hay đây là một câu trả lời khá lớn cho Pyth về mặt byte? o.Ô Đó là gần 1/4 câu trả lời Java của tôi ! (Thông thường là
1/50

1
@KevinCruijssen yeah, định dạng chuỗi và dữ liệu tiền tệ thô chiếm gần một nửa kích thước.
Maltysen

5

Python 3.6 (tiền phát hành), 87

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

Sử dụng chuỗi f để đánh giá kết quả và định dạng nó .

s.translate({46:'',44:''})loại bỏ các dấu chấm và dấu phẩy từ sđó, làm cho nó trở thành một intchữ hợp lệ , sau đó int(...)chuyển đổi nó thành intđối tượng thực tế .


4

Lồi, 56 55 54 byte

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

Vâng, điều này chắc chắn có thể được rút ngắn. Hãy thử trực tuyến!

Lưu một byte nhờ Lynn!

Giải thích sẽ đến khi tôi có thể truy cập vào máy tính.


Thế còn [1.1_.27+.15]?
Lynn

@Lynn đó là thiên tài! Cảm ơn!
GamrCorps

"Giải thích sẽ đến khi tôi có thể truy cập vào máy tính", ngụ ý rằng một chút không thể đọc được tuyệt vời đã được viết trên một thiết bị di động . làm tốt lắm, học giả uyên bác. làm tốt.
strugee

1
@strugee Vâng, tôi đã ra ngoài cả ngày nhưng tôi đã tạo ra một bàn phím CP-1252 cho iPhone của mình cho mục đích này.
GamrCorps

Tại sao dấu 55 byte cuối cùng bị loại? Ngoài ra, typo trong definetely - chắc chắn .
dùng48538

3

Python 3.5, 137 131 121 120 117 byte:

(Cảm ơn Maltysen về gợi ý tiết kiệm 6 byte (137 -> 131)!)

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

Dùng thử trực tuyến! (Ý)


2
bạn không cần phải làm tròn số của riêng mình, .format()làm điều đó cho bạn nếu bạn làm${:,.2f}
Maltysen

@Maltysen Cảm ơn! Tôi không biết tôi có thể làm điều đó! :)
R. Kap

46:0thay thế dấu chấm bằng ký tự NUL.
vaultah

@vaultah Vậy là sao? Nó hoạt động cho đầu vào Euro.
R. Kap

@vaultah Chà, nó hoạt động hoàn toàn tốt trên Ideone và máy tính của tôi.
R. Kap

3

JavaScript (ES6), 107

Đơn giản và dễ hiểu , có lẽ dễ chơi hơn

Lưu ý: đã thử nghiệm trong FireFox. Nhiều trình duyệt (đặc biệt là thiết bị di động) có hỗ trợ lỗitoLocaleString

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

KIỂM TRA

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>


Tôi chỉ có thể kiểm tra điều này trên Firefox. Bạn có thể cho tôi một liên kết đến Firefoex?
NoOneIsHãy

@NoOneIs Là Google "Firefoex", nó sẽ cung cấp cho bạn liên kết chính xác ngay cả khi nó viết sai chính tả
edc65

3

Java 7, 240 227 215 211 207 202 199 199 byte

(201 - 2 byte vì quy tắc " Nếu bạn sử dụng một trong các ký hiệu trên (€, £,), bạn có thể tính chúng là 1 byte ")
Cảm ơn @Frozn vì đã lưu rất nhiều byte.

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);}

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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"));
  }
}

Đầu ra:

$1.51
$5.48
$417,318.42

2
char c=a.charAt(0)(tất cả trong tất cả những gì bạn không cần c, xem câu trả lời của tôi)
edc65

1
Bằng cách kéo d *ra khỏi chim nhạn, bạn tiết kiệm được một số bản sao. Trông như thế này : d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn

@Frozn Cảm ơn. Ngoài ra, thật không may /100*.01là cùng một lượng byte, và c=='€'?.011:c=='£'?.0137:.0015cũng chính xác như với /100.
Kevin Cruijssen

1
Vâng, đó là xấu. Nhưng đây là tin tốt: Nhờ các giá trị unicode duy nhất của các ký hiệu tiền tệ mà bạn có thể rút ngắn nó bởi vì '£' < '¥' < '€'. Do đó bạn có thể viết c<'¥'?1.37:c>'¥'?1.1:.15ngắn hơn 2 ký tự.
Frozn

1
Chỉ cần thấy chúng tôi không cần dnữa vì nó chỉ được sử dụng một lần.
Frozn

1

F #, 198 byte

(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")

Chưa chơi gôn:

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")

Tôi vẫn đang cố gắng tìm ra F #, vì vậy việc xử lý hàng ngàn dấu phân cách chiếm rất nhiều byte.

Theo các quy tắc thách thức, các ký hiệu Euro, Yen và Pound được tính là một byte mỗi ký tự, mặc dù cách Unicode lưu trữ chúng bên trong.


1

Con trăn 3.5, 101 98

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

Các ký hiệu Euro, Pound và Yen được tính là 1 byte / ký tự cho mỗi quy tắc thử thách.

Thay vì dịch giữa hoặc giải thích hàng ngàn và dấu phân cách thập phân, chúng chỉ được loại bỏ để đưa ra một chuỗi chữ số đơn giản.

Chuỗi chữ số (sau ký hiệu tiền tệ) được chuyển đổi thành một số nguyên.

Ký hiệu tiền tệ được sử dụng làm chỉ mục vào từ điển tỷ lệ chuyển đổi; việc chuyển đổi được thực hiện bằng cách nhân với tỷ lệ chuyển đổi và chia cho 10000.

Kết quả được định dạng bằng ký hiệu đô la hàng đầu, hai vị trí chính xác thập phân và dấu phẩy để phân nhóm.


Tại sao bạn không xóa 0 từ 1.10 để tiết kiệm 1 byte?
Daniel

Có lẽ bạn có thể bỏ qua. trong các tỷ lệ và chia cho 1e4
bất kể

0

Python 3, 112 byte KHÔNG CẠNH TRANH

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

Điều này không cạnh tranh vì tôi không nghĩ rằng tôi được phép trả lời câu hỏi của riêng mình.

Ngoài ra, tôi chưa có cơ hội để chạy nó trên máy tính, nhưng có vẻ như tôi nên làm việc. Tôi sẽ chạy nó trên máy tính ngay khi có cơ hội.


4
Bạn hoàn toàn ổn để trả lời câu hỏi của riêng bạn. Một số người thậm chí đã đưa ra một câu trả lời trước khi tự đặt câu hỏi. Thông thường, họ vẫn bị đánh bại bởi các ngôn ngữ golf như Jelly, Pyth, Pyke và như nhau. ;)
Kevin Cruijssen

0

PHP, 117 byte

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

Điều này làm cho việc sử dụng một chức năng không dùng nữa; thay thế ereg_replace('[^0-9]'bằng preg_replace('%[^\d]%'để làm cho mã hoàn toàn hiện đại; thêm 1 byte.


0

CJam, 54 byte

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

Hãy thử nó ở đây!


Câu trả lời tốt đẹp, và chào mừng đến với trang web! Để bạn biết, có một trình thông dịch CJam trực tuyến tại đây Bạn có thể liên kết đến đó trong bài đăng của mình để giúp người đọc dễ dàng chạy / kiểm tra câu trả lời của bạn hơn.
DJMcMayhem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.