ฉันจ่ายด้วยดอลลาร์เท่านั้น


14

ในฐานะที่เป็นชื่อเรื่อง - ถึงแม้ว่าจะไม่ได้รับคำแนะนำก็ตามฉันจ่ายด้วยดอลลาร์เท่านั้น

ความท้าทาย

เขียนฟังก์ชัน / โปรแกรมที่รับสตริงเป็นอินพุตซึ่งเป็นค่าเงินนำหน้าด้วยสัญลักษณ์ ex) £4.99. จากนั้นส่งคืนจำนวนเงินเดียวกันที่แปลงเป็น USD

อินพุต

คุณจะได้รับสตริงเป็นอินพุต มันจะมีสัญลักษณ์สกุลเงินตามด้วยตัวเลขที่มีทศนิยมสองตำแหน่ง (ซึ่งอาจเป็น.00) จะมีจุดทศนิยม.และ / หรือเครื่องหมายจุลภาค,คั่นจำนวน สัญลักษณ์สกุลเงินต่อไปนี้จะเข้ามาในอินพุต:

ยูโร:
ปอนด์ปอนด์สเตอร์ลิง: ปอนด์
หยวนเงินหยวน: ¥

นอกจากนี้จะมีเครื่องหมายจุลภาคหรือจุดทศนิยมขึ้นอยู่กับสกุลเงินเพื่อแยก 'ดอลลาร์' จาก 'เซ็นต์':

ยูโร: # .#####
ปอนด์สเตอร์ลิง: #, ###. ##
หยวนหยวน: #, ###. ##

เอาท์พุต

คุณจะแปลงอินพุตจากสกุลเงินที่กำหนดโดยสัญลักษณ์เป็น USD ปัดเศษเป็นทศนิยมสองตำแหน่ง เอาต์พุตจะอยู่ในรูปแบบ$#,###.##และแน่นอนว่าจะมีจำนวนมากขึ้นทางด้านซ้ายของเอาต์พุตหากจำเป็นต้องมี ( แก้ไข: นี่หมายถึงว่ามีจำนวนจุลภาคโดยพลการในเอาต์พุตเหมือนกับในอินพุต ) อัตราแลกเปลี่ยนสกุลเงินที่เราจะใช้อยู่ด้านล่าง

คุณสามารถสมมติว่าอินพุตมีสัญลักษณ์ที่มีเพียงหนึ่งในข้างบน ( € £ ¥ . ,) - ซึ่งมันถูกต้องเสมอ

อัตราแลกเปลี่ยน

€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 จริง renminbi ควรมีเครื่องหมายจุลภาคคั่นที่เครื่องหมาย 10k ไม่ใช่ที่เครื่องหมาย 1k (เช่น10,0000.15)
ไม่ใช่ชาร์ลส์

24
เป็นเรื่องตลกที่ถ้าคุณโพสต์คำถามนี้เมื่อวานนี้อัตราแลกเปลี่ยนปอนด์อังกฤษจะเป็น£1 : $1.51xD
Kevin Cruijssen

1
ตกลง @Adnan ฉันจะทำอย่างนั้น เสร็จสิ้น
Daniel

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
Kevin Cruijssen

1
@KevinCruijssen ฉันเพิ่งรู้ว่าเมื่อใช้ Google เพื่อแปลงอัตราแลกเปลี่ยนได้เปลี่ยนไปแล้ว ซ่อมมัน.
Daniel

คำตอบ:


1

Pyth - 54 53 48 47 ไบต์

Wลืมเกี่ยวกับการสมัครเงื่อนไข

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

Test Suite


อืม .. เป็นฉันหรือนี่เป็นคำตอบที่ดีมากสำหรับ Pyth ในแง่ bytes? o.Ôเกือบ 1 ใน 4 ของคำตอบ Javaของฉัน! (โดยปกติคือ 1 / 50th หรือมากกว่า .. xD)
Kevin Cruijssen

1
@KevinCruijssen ใช่การจัดรูปแบบสตริงและข้อมูลสกุลเงินดิบมีขนาดเกือบครึ่งหนึ่ง
Maltysen

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"\Ø'$\

อย่างนี้จะสั้นลงอย่างแน่นอน ลองออนไลน์!

บันทึกเป็นไบต์ด้วย Lynn!

คำอธิบายเกิดขึ้นเมื่อฉันสามารถเข้าถึงคอมพิวเตอร์


แล้วไง[1.1_.27+.15]ล่ะ
Lynn

@ ลินน์นั่นแหละอัจฉริยะ! ขอบคุณ!
GamrCorps

"คำอธิบายที่จะมาเมื่อฉันจะได้รับการเข้าถึงเครื่องคอมพิวเตอร์" หมายความว่าที่นักเก็ตเล็ก ๆ น้อย ๆ ของ unreadability น่ากลัวถูกเขียนบนโทรศัพท์มือถือ ทำได้ดีเรียนเก่ง ทำได้ดี.
strugee

1
@ strugee ใช่ฉันเคยออกไปทั้งวัน แต่ฉันได้ทำคีย์บอร์ด CP-1252 สำหรับ iPhone ของฉันเพื่อจุดประสงค์นี้
GamrCorps

ทำไมเครื่องหมาย 55 ไบต์สุดท้ายถูกขีดออกมา นอกจากนี้ typo ในdefinetely - แน่นอน
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 ขอบคุณ! ฉันไม่รู้ว่าฉันสามารถทำเช่นนั้นได้! :)
R. Kap

46:0แทนที่จุดด้วยอักขระ NUL
vaultah

@vaultah อะไรนะ? มันใช้งานได้กับอินพุตยูโร
R. Kap

@vaultah ดีมันทำงานได้อย่างสมบูรณ์แบบบนIdeoneและคอมพิวเตอร์ของฉัน
R. Kap

3

JavaScript (ES6), 107

เรียบง่ายและตรงไปตรงมาอาจเล่นกอล์ฟได้มากกว่า

หมายเหตุ: ทดสอบใน FireFox เบราว์เซอร์จำนวนมาก (โดยเฉพาะอุปกรณ์พกพา) ได้รับการสนับสนุน buggytoLocaleString

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

@NoOne อยู่ที่นี่ 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
Kevin Cruijssen

1
ใช่มันไม่ดี แต่ที่นี่เป็นข่าวที่ดี: ขอบคุณที่ค่า Unicode '£' < '¥' < '€'ที่ไม่ซ้ำกันของสัญญาณสกุลเงินที่คุณสามารถร่นมันเพราะ ดังนั้นคุณสามารถเขียนได้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")

ยกเลิกแข็งแรงเล่นกอล์ฟ:

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 ไบต์ / ตัวอักษรตามกฎการท้าทาย

แทนที่จะแปลระหว่างหรือตีความตัวคั่นหลักพันและตัวแบ่งทศนิยมสิ่งเหล่านี้จะถูกแยกออกมาเพื่อให้เป็นสตริงตัวเลขหลัก

สตริงหลัก (หลังสัญลักษณ์สกุลเงิน) จะถูกแปลงเป็นจำนวนเต็ม

สัญลักษณ์สกุลเงินถูกใช้เป็นดัชนีในพจนานุกรมของอัตราการแปลง การแปลงจะดำเนินการโดยคูณด้วยอัตราการแปลงและหารด้วย 10,000

ผลลัพธ์ถูกจัดรูปแบบด้วยเครื่องหมายดอลลาร์ชั้นนำความแม่นยำทศนิยมสองตำแหน่งและเครื่องหมายจุลภาคสำหรับการจัดกลุ่ม


ทำไมคุณไม่ลบ 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 และเหมือนกัน ;)
Kevin Cruijssen

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 ออนไลน์ที่นี่คุณสามารถลิงก์ไปยังที่อยู่ในโพสต์ของคุณเพื่อให้ผู้อ่านเรียกใช้ / ทดสอบคำตอบของคุณได้ง่ายขึ้น
James
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.