Bu sayıları kısaltalım! Şimdi ters mi?


11

Giriş:

Twitter ve Instagram ve diğerleri gibi ben gibi sayıları görüntülemek istedi 1.2Kve 3.8 Myerine 1,222ya 3,823,456.

Ama hepsi bu değil! Hepimizin bildiği gibi, kuşkusuz bu kısaltmaları sevmeyecek ve onları tersine çevirmeye çalışan bazı insanlar olabilir . Böylece, 1.2kolacak 1,200ve 3.8 Molacak 3,800,000.

Görev:

  • sizin göreviniz, bir sayı listesini ( dize olarak verilir ) kısaltma çiftlerine veya tam tersine dönüştüren bir program veya işlev yazmaktır .

Örneğin, giriş listesi (veya herhangi biri STDIN) ise ['1.4k', '1,234,567', '7.99M'], çıktı almalısınız:

['1,400', '1.2M', '7,990,000']

Kısaltmalar için bir sonraki şemayı takip edebilirsiniz:

  • 10 3 -> bir kilo -> K
  • 10 6 -> bir milyon -> M
  • 10 9 -> bir milyar -> B

Kodunuz giriş için tüm küçük harfleri, büyük harfleri, karışık harfleri veya tanımsız harfleri varsayabilir ve çıktı için bunlardan herhangi birini kullanabilir, ancak tutarlı olmalıdır.

Kurallar ve kısıtlamalar:

  • bir program veya işlev yazabilir, STDIN(veya en yakın alternatif), komut satırı bağımsız değişkenini veya işlev bağımsız değişkenini girerek ve sonucu STDOUT(veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıkarabilirsiniz.
  • girdi herhangi bir uygun liste veya dize biçiminde olabilir. Her birinin daha küçük olduğunu ve listenin en az bir öğe içerdiğini varsayabilirsiniz .ai231
  • Her kısaltılmış numara içerecektir sadece bir . normal sayıda içerecektir ederken birçok olarak , gerektiği kadar (bu sayılar değişmiş olmayacak varsayabiliriz olabilir).
  • Eğer OLMAYABİLİR olarak bir sayı girin '123456'ziyade123,456
  • standart kuralları geçerlidir.

Test senaryoları:

Input: ['1.5M', '77.6k', '123,456,789']         Output: ['1,500,000', '77,600', '123.4M']
Input: ['3,000,000,000', '581k', '2b']          Output: ['3B', '581,000', '2,000,000,000']
Input: ['0.1k']                                 Output: ['100']
Input: ['888', '33']                            Output: ['0.888k', '0.033k']

Açıklamalar:

  • kısaltma çıktısında ondalık noktadan sonraki <1000 sayıları için, doğru sonucu elde etmek için gereken sayıda basamağa sahip olmalısınız. (örneğin: 2-> olacak 0.002k) - bu en fazla 3 ondalık sayı anlamına gelir ; 1000'den büyük sayılar için en fazla 1 ondalık basamak kullanabilirsiniz .
  • kısaltma hem küçük hem de büyük harf olabilir
  • Yorumlarda önerildiği gibi yerleşik kısıtlamayı kaldırdım

Bayttaki en kısa kod kazanır!


1
Açıklama talebi: kısaltma çıktısında ondalık noktadan sonra kaç basamak var? 1000'den küçük sayılar nasıl kısaltılır? büyük harf mi, küçük harf mi, yoksa giriş ve çıkışta mı?
edc65

1
Olmamalı mı '123,456,789' -> '123.4M'? Ayrıca, kaç ondalık basamak kullanılacağı açık değildir. Elbette 1000'in altındaki herhangi bir şeyin kısaltılması gerekmez.
Kade

1
@ anonymous2 üçüncü kuralı okuyun.
Grajdeanu Alex.

4
" Herhangi bir yerleşik modül / işlev kullanmanıza izin verilmiyor" Herhangi bir yerleşik işlev var mı?
Alex Howansky

1
"Kilo" kullanımınız SI öneklerini önerir ve bunlar olur ["k", "M", "G"]. "Normal bir sayı gerektiği kadar çok içerecek olsa da " ne demek, ülkemde herhangi birini kullanmak bir hata olur.
Angs

Yanıtlar:


2

PHP, 234 224 213 201 205 bayt

for(;$x=$argv[++$n];){$y=str_replace(",","",$x)/1e3;for($i=0;$y>999;$i++)$y=($y|0)/1e3;echo(A<$c=substr($x,strlen($x)-1))?number_format($x*[k=>1e3,m=>1e6,b=>1e9][$c]):($i?($y*10|0)/10:$y).kmb[$i]," ";}

İnsertusernamehere tarafından kaydedilen 6 bayt, bundan ilham alan 4 bayt.


  • komut satırı bağımsız değişkenlerinden girdi alır, bir ayırıcıyla boşlukla ayrılmış sonuçları yazdırır
  • küçük harf kısaltması bekleniyor
  • ile koş -r

Ayırıcı olarak alt çizgi Tamam ise -2 bayt: Değiştir " "ile _.
-1 doğru yuvarlama ok bayt ise: Değiştir ($y*10|0)/10ile round($y,1).
PHP 7.1 için -17 bayt: Değiştir substr($x,strlen($x)-1)ile $x[-1].


Yalnızca bir argümanı genişletmek için 80 (63) bayt:

<?=number_format(($x=$argv[1])*[K=>1e3,M=>1e6,B=>1e9][substr($x,strlen($x)-1)]);

, dosyaya kaydetmek sonra yürütmek (veya değiştirin <?=ile echobirlikte + uzay ve kaçak -r.


İkinci örneğiniz derlenmiyor.
Alex Howansky

1
Dengesiz ebeveynleriniz var.
Alex Howansky

1
-4 bayt: for($j=1;$x=$argv[$j++];) - yerineforeach($argv as$i=>$x)if($i)
insertusernameburada

1
-2 bayt: kmb[$i] - yerine "kmb"[$i].
insertusernameburada

1
@insertusernamehere PHP 7.1'de negatif dize dizinleri geliyor; ve bu bir RC (henüz). Diğer baytlar için teşekkürler!
Titus

2

JavaScript, 545 524 522 518 514 508 504 498 494 214 bayt

180 bayt tasarruf için @ETHproductions'a teşekkürler!

d=F=>F.map(f=>1/f.slice(-1)?f=(f=f.replace(/,/g,""))[9]?(f/1e8|0)/10+"B":f[6]?(f/1e5|0)/10+"M":f/1e3+"k":R(R(f.slice(0,-1)+"e"+' kMB'.indexOf(f.substr(-1))*3-0+"").match(/.{1,3}/g)+""),R=x=>[...x].reverse().join``)

İşlevi çağırmak için:

d(["1.5M","1,500,000"]) //["1,500,500","1.5M"]

alertHer biri alertgirişin farklı bir elemanını içerdiği şekilde çıktılar

Okunabilir sürüm:

d = F => F.map(f => 1 / f.slice(-1) ? f = (f = f.replace(/,/g, ""))[9] ? (f / 1e8 | 0) / 10 + "B" : f[6] ? (f / 1e5 | 0) / 10 + "M" : f / 1e3 + "k" : R(R(f.slice(0, -1) + "e" + ' kMB'.indexOf(f.substr(-1)) * 3 - 0 + "").match(/.{1,3}/g) + ""), R = x => [...x].reverse().join ``)

Düzenlemelerin özeti: işlevi bir ok işlevine dönüştürdü

  • noktalı virgül kaldırıldı ';'
  • çıkarıldı var
  • ok işlevine dönüştürüldü
  • Dizinin tek tek öğelerini yinelemek için harita kullanılır
  • |0zemin yerine kullanılır
  • test için regex kullanıldı
  • if-else ifadeleri yerine üçlü operatörler kullandı
  • için ayrı bir işlev dahil .reverse().join''

3
İşte bunu golf için bazı yollar. Herhangi bir soru sormaktan çekinmeyin :-)
ETHproductions
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.