Mari kita menyingkat angka-angka itu! Sekarang terbalik?

11

Pengantar:

Seperti Twitter, Instagram, dan lainnya, saya ingin menampilkan angka suka 1.2Kdan 3.8 Mbukan 1,222atau 3,823,456.

Tapi bukan itu saja! Seperti yang kita semua tahu, mungkin ada beberapa manusia yang pasti tidak akan menyukai singkatan ini dan akan mencoba untuk membalikkannya. Jadi, 1.2kakan menjadi 1,200dan 3.8 Makan menjadi 3,800,000.

Tugas:

  • tugas Anda adalah menulis program atau fungsi yang mengubah daftar angka ( yang diberikan sebagai string ) menjadi pasangan singkatannya dan sebaliknya.

Misalnya, jika daftar input (atau apa saja STDIN) adalah ['1.4k', '1,234,567', '7.99M'], maka Anda harus menampilkan:

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

Anda dapat mengikuti skema singkatan berikut:

  • 10 3 -> satu kilo -> K
  • 10 6 -> satu juta -> M
  • 10 9 -> satu miliar -> B

Kode Anda dapat mengasumsikan semua huruf kecil, semua huruf besar, huruf besar atau huruf kecil untuk input dan menggunakan semua ini untuk output, tetapi harus konsisten.

Aturan dan batasan:

  • Anda dapat menulis program atau fungsi, mengambil input melalui STDIN(atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT(atau alternatif terdekat), nilai fungsi kembali atau parameter fungsi (keluar).
  • input mungkin dalam format string atau daftar yang mudah digunakan. Anda dapat mengasumsikan bahwa jumlahnya kurang dari masing-masing dan bahwa daftar tersebut mengandung setidaknya satu elemen.ai231
  • setiap nomor yang disingkat hanya akan berisi satu. sedangkan nomor normal akan berisi sebanyak yang , diperlukan (Anda dapat mengasumsikan bahwa nomor ini tidak akan diubah).
  • Anda MUNGKIN TIDAK memasukkan nomor '123456'melainkan123,456
  • aturan standar berlaku.

Kasus uji:

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']

Klarifikasi:

  • untuk angka <1000 setelah titik desimal dalam keluaran singkatan Anda harus memiliki digit sebanyak yang diperlukan untuk mendapatkan hasil yang benar. (misalnya: 2-> akan menjadi 0.002k) - itu berarti paling banyak 3 desimal ; untuk angka> 1000 Anda dapat memiliki maksimal 1 desimal .
  • singkatan mungkin dalam huruf kecil atau besar
  • Saya menghapus batasan bawaan seperti yang disarankan dalam komentar

Kode terpendek dalam byte menang!

Grajdeanu Alex.
sumber
1
Permintaan klarifikasi: berapa digit setelah titik desimal dalam keluaran singkatan? bagaimana cara menyingkat angka <1000? huruf besar atau kecil atau keduanya dalam input dan output?
edc65
1
Tidak seharusnya '123,456,789' -> '123.4M'? Juga, ini tidak menjelaskan berapa banyak desimal yang digunakan. Tentunya apapun yang di bawah 1000 seharusnya tidak perlu disingkat lagi.
Kade
1
@ anonymous2 baca aturan ketiga.
Grajdeanu Alex.
4
"Anda tidak diizinkan menggunakan modul / fungsi bawaan apa pun" Apa fungsi bawaan?
Alex Howansky
1
Penggunaan Anda "kilo" menunjukkan awalan SI dan itu akan menjadi ["k", "M", "G"]. Apa artinya "sementara angka normal akan mengandung sebanyak, seperlunya " berarti, di negara saya itu akan menjadi kesalahan untuk menggunakan.
Angs

Jawaban:

2

PHP, 234 224 213 201 205 byte

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]," ";}

6 byte disimpan oleh insertusername di sini, 4 byte terinspirasi oleh itu.


  • mengambil input dari argumen baris perintah, mencetak hasil yang dipisahkan oleh spasi dengan trailing separator
  • mengharapkan singkatan huruf kecil
  • jalankan bersama -r

-2 byte jika garis bawah sebagai pemisah tidak masalah: Ganti " "dengan _.
-1 byte jika pembulatan yang benar ok: Ganti ($y*10|0)/10dengan round($y,1).
-17 byte untuk PHP 7.1: Ganti substr($x,strlen($x)-1)dengan $x[-1].


80 (63) byte untuk memperluas satu argumen saja:

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

simpan ke file, kemudian jalankan (atau ganti <?=dengan echo+ spasi dan jalankan dengan -r.

Titus
sumber
Contoh kedua Anda tidak dikompilasi.
Alex Howansky
1
Anda memiliki orangtua yang tidak seimbang.
Alex Howansky
1
-4 byte: for($j=1;$x=$argv[$j++];) - bukanforeach($argv as$i=>$x)if($i)
insertusernamehere
1
-2 byte: kmb[$i] - bukan "kmb"[$i].
masukkan nama pengguna di sini
1
@insertusernamehere indeks string negatif datang dalam PHP 7.1; dan itu RC (belum). Terima kasih atas byte lainnya!
Titus
2

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

Terima kasih kepada @ETHproductions untuk menghemat 180 byte!

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

Untuk memanggil fungsi:

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

Keluaran sebagai alert, di mana masing alert- masing berisi elemen input yang berbeda

Versi yang dapat dibaca:

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

Ringkasan hasil edit: fungsi yang dikonversi ke fungsi panah

  • dihapus semi-titik dua ';'
  • dihapus var
  • dikonversi menjadi fungsi panah
  • peta yang digunakan untuk beralih melalui elemen individual dari array
  • digunakan |0bukan lantai
  • digunakan regex untuk pengujian
  • menggunakan operator ternary alih-alih pernyataan if-else
  • termasuk fungsi terpisah untuk .reverse().join''
pengguna41805
sumber
3
Berikut adalah beberapa cara untuk menurunkan ini. Jangan ragu untuk mengajukan pertanyaan yang mungkin Anda miliki :-)
ETHproduk