Sadece dolar ile ödeme yaparım


14

Başlık olarak - her ne kadar gizli olsa da - ipuçları, sadece dolar ile ödeme yapıyorum.

Meydan okuma

Bir dizeyi girdi olarak alan ve önünde bir sembol olan parasal bir değer olan bir işlev / program yazın. ex) £4.99. Ardından, aynı tutarı ABD Doları'na dönüştürün.

Giriş

Girdi olarak bir dize alacaksınız. Para birimi sembolünün ardından iki ondalık basamaklı bir sayı gelecektir (ki bu olabilir .00). Sayıyı ayıran ondalık noktalar .ve / veya virgüller olacaktır ,. Girdilerde aşağıdaki para birimi simgeleri gelir:

Euro: €
İngiliz Sterlini: £
Yuan Renminbi: ¥

Ayrıca, 'dolarları' sentlerden 'ayırmak için para birimine bağlı olarak virgül veya ondalık nokta olacaktır:

Euro: #. ###, ##
Pound Sterling: #, ###. ##
Yuan Renminbi: #, ###. ##

Çıktı

Girdiyi sembolle belirlenen para biriminden USD'ye çevirerek iki ondalık basamağa yuvarlayacaksınız. Çıktı formatta $#,###.##olacak ve elbette gerekiyorsa çıktının solunda daha fazla sayı olacaktır ( DÜZENLE: bu, çıktıda olduğu gibi çıktıda rasgele sayıda virgül olduğu anlamına gelir ). Kullanacağımız döviz kuru aşağıdaki gibidir.

Girişin, yukarıdakilerden ( € £ ¥ . ,) yalnızca biri olan - her zaman geçerli olduğunu gösteren bir simge içerdiğini varsayabilirsiniz .

Döviz kurları

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

Örnekler

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

Respective output:
$1.51
$5.48
$417,318.42

Son sözler

  1. Yukarıdaki simgelerden birini (€, £, ¥) kullanırsanız, bunları 1 bayt olarak sayabilirsiniz
  2. Bu kod golf, bayt çok kısa kod kazanır!

1
Gerçek l10n kullanmak istiyorsanız, renminbi'nin 1k işaretinde değil, 10k işaretinde virgül ayırıcısı olmalıdır. (örneğin, 10,0000.15)
Charles

24
Bu soruyu dün £1 : $1.51
gönderirseniz

1
Tamam @ Adnan, ben yaparım. Bitti.
Daniel

2
Hmm, bu çıktı doğru mu? 1.37 * 1.10 = 1,507 = 1,51(öyle değil 1.52) ve 4.00 * 1.37 = 5.48(değil 5.50) ve 2782122.78 * 0.15 = 417318.417 = 417318.42(değil 420165.06) ...: S
Kevin Cruijssen

1
@KevinCruijssen, Google'ı dönüştürmek için kullanırken döviz kurunun zaten değiştiğini fark ettim. Onu düzeltti.
Daniel

Yanıtlar:


1

Pyth - 54 53 48 47 bayt

Koşullu uygulamayı unuttum W.

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

Test Takımı .


Hmm .. bu ben mi yoksa Pyth için bayt cinsinden oldukça büyük bir cevap mı? o.Ô Java cevabımın neredeyse 1 / 4'ü ! (Genellikle 1/50 veya daha fazla .. xD)
Kevin Cruijssen

1
@KevinCruijssen evet, dize biçimlendirmesi ve ham para birimi verileri neredeyse yarısı oluşturuyor.
Maltysen

5

Python 3.6 (ön sürüm), 87

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

Sonucu değerlendirmek ve biçimlendirmek için f-dizeleri kullanır .

s.translate({46:'',44:''})noktaları ve virgülleri kaldırır s, böylece onu geçerli bir intdeğişmez hale getirir , ardından int(...)onu gerçek intnesneye dönüştürür .


4

Dışbükey, 56 55 54 bayt

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

Bu kesinlikle kısaltılabilir. Çevrimiçi deneyin!

Lynn sayesinde bir bayt kurtardı!

Bir bilgisayara erişebildiğim zaman gelecek açıklama.


Nasıl [1.1_.27+.15]?
Lynn

@Lynn bu dahi! Teşekkürler!
GamrCorps

"Bir bilgisayara erişebildiğimde gelen açıklama", bu harika okunamayan küçük külçenin bir mobil cihaza yazıldığı anlamına geliyor . aferin, bilgin. aferin.
strugee

1
@strugee Evet, bütün gün dışarı çıktım ama bu amaçla iPhone'um için bir CP-1252 klavye yaptım.
GamrCorps

Son 55 bayt işareti neden çıkarıldı? Ayrıca, kesinlikle - kesinlikle yazım hatası .
user48538

3

Python 3.5, 137 131 121 120 117 bayt:

( Maltsen'e 6 bayt tasarrufu için bir ipucu için teşekkürler (137 -> 131)!)

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

Çevrimiçi Deneyin! (Ideone)


2
kendi yuvarlamanızı yapmak zorunda değilsiniz, .format()eğer yaparsanız sizin için yapar${:,.2f}
Maltysen

@Maltysen Teşekkürler! Bunu yapabileceğimi bilmiyordum! :)
R. Kap

46:0noktaları NUL karakterleriyle değiştirir.
vaultah

@vaultah Ne olmuş yani? Euro girdileri için çalışır.
R. Kap

@vaultah Eh, Ideone ve bilgisayarımda mükemmel çalışıyor .
R. Kap

3

JavaScript (ES6), 107

Basit ve anlaşılır , muhtemelen daha golf edilebilir

Not: FireFox'ta test edilmiştir. Birçok tarayıcıda (özellikle mobil cihazlarda)toLocaleString

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

ÖLÇEK

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>


Bunu yalnızca Firefox'ta test edebilirdim. Bana Firefoex'e bir bağlantı verebilir misin?
NoOneIsHere

Google "Firefoex", yanlış yazılmış olsa bile size doğru bağlantıyı verecektir
edc65

3

Java 7, 240 227 215 211 207 202 199 196 bayt

(201 - 2 bayt kuralı nedeniyle " Yukarıdaki sembollerden birini kullanırsanız (€, £, ¥), bunları 1 bayt olarak sayabilirsiniz ") Çok fazla bayt kaydettiği
için @Frozn'a teşekkürler .

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

Test edilmemiş ve test kodu:

Burada deneyin.

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

Çıktı:

$1.51
$5.48
$417,318.42

2
char c=a.charAt(0)(sonuçta ihtiyacınız yok c, cevabımı görün)
edc65

1
d *Üçlü ağaçtan dışarı çekerek bazı kopyaları kaydedersiniz. Dış görünüş böyle: d*(c=='€'?1.1:c=='£'?1.37:.15)/100.
Frozn

@Frozn Teşekkürler. Ayrıca, ne yazık ki /100ve *.01bayt ile aynı miktarda ve c=='€'?.011:c=='£'?.0137:.0015aynı ile tam olarak aynı /100.
Kevin Cruijssen

1
Evet bu kötü. Ancak iyi haber: Para birimi işaretlerinin benzersiz unicode değerleri sayesinde onu kısaltabilirsiniz '£' < '¥' < '€'. Böylece c<'¥'?1.37:c>'¥'?1.1:.152 karakter daha kısa yazabilirsiniz .
Frozn

1
Sadece bir dkez kullanıldığından artık ihtiyacımız olmadığını gördüm .
Frozn

1

F #, 198 bayt

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

Hala F # anlamaya çalışıyorum, bu yüzden binlerce ayırıcıyla uğraşmak çok fazla bayt alıyor.

Zorluk kurallarına göre, Euro, Yen ve Pound sembolleri, Unicode'un bunları dahili olarak nasıl depoladığına rağmen, her biri bir bayt olarak sayılır.


1

Python 3.5, 101 98

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

Euro, Pound ve Yen sembolleri, meydan okuma kurallarına göre her biri 1 bayt / karakter olarak sayılır.

Binlerce ve ondalık ayırıcıları çevirmek veya yorumlamak yerine, bunlar düz basamaklı bir dize vermek için çıkarılır.

Sayı dizesi (para birimi sembolünden sonra) bir tamsayıya dönüştürülür.

Para birimi simgesi, dönüşüm oranları sözlüğüne endeks olarak kullanılır; dönüşüm, dönüşüm oranı ile çarpılarak 10000'e bölünerek gerçekleştirilir.

Sonuç, önde gelen dolar işareti, iki ondalık kesinlik yeri ve gruplama için virgülle biçimlendirilir.


Neden 1 bayt kaydetmek için 0'ı 1,10'dan silmiyorsunuz?
Daniel

Belki atlayabilirsin. oranlarda bölün ve 1e4'e bölün
agtoever

0

Python 3, 112 bayt YARIŞMADI

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

Bu rekabet etmiyor çünkü kendi sorumu cevaplamama izin verilmediğini sanmıyorum.

Ayrıca, bunu henüz bir bilgisayarda çalıştırma şansım olmadı, ama bana öyle geliyor ki çalışması gerektiği gibi. Bir şansım olur olmaz bir bilgisayarda çalıştıracağım.


4
Kendi sorunuza cevap vermenizde bir sakınca yoktur. Bazı insanlar soruyu kendisi yapmadan önce bir cevap bile bulabilirler. Yine de hala Jelly, Pyth, Pyke ve benzerleri gibi golf dilleri tarafından dövülüyorlar. ;)
Kevin Cruijssen

0

PHP, 117 bayt

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

Bu, kullanımdan kaldırılmış bir işlevi kullanır; kodu tamamen modern hale getirmek için ereg_replace('[^0-9]'ile değiştirin preg_replace('%[^\d]%'; 1 bayt ekler.


0

CJam, 54 bayt

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

Burada deneyin!


Güzel cevap ve siteye hoş geldiniz! Bildiğiniz gibi, burada çevrimiçi bir CJam yorumlayıcısı var .
James
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.