Hãy viết tắt những con số đó! Bây giờ đảo ngược?


11

Giới thiệu:

Giống như Twitter và Instagram và những người khác, tôi muốn hiển thị số như 1.2K3.8 Mthay vì 1,222hoặc 3,823,456.

Nhưng đó không phải là tất cả! Như chúng ta đã biết, có thể có một số người chắc chắn sẽ không thích những từ viết tắt này và sẽ cố gắng đảo ngược chúng. Vì vậy, 1.2ksẽ trở thành 1,2003.8 Msẽ trở thành 3,800,000.

Nhiệm vụ:

  • Nhiệm vụ của bạn là viết một chương trình hoặc một hàm chuyển đổi một danh sách các số ( được đưa ra dưới dạng chuỗi ) thành các cặp viết tắt của chúng và ngược lại.

Ví dụ: nếu danh sách đầu vào (hoặc bất kỳ STDIN) là ['1.4k', '1,234,567', '7.99M'], thì bạn nên xuất:

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

Bạn có thể theo lược đồ tiếp theo để viết tắt:

  • 10 3 -> một kilôgam -> K
  • 10 6 -> một triệu -> M
  • 10 9 -> một tỷ -> B

Mã của bạn có thể giả sử tất cả chữ thường, tất cả chữ hoa, chữ thường hoặc trường hợp không xác định cho đầu vào và sử dụng bất kỳ chữ nào trong số này cho đầu ra, nhưng phải nhất quán.

Các quy tắc và hạn chế:

  • bạn có thể viết chương trình hoặc hàm, lấy đầu vào thông qua STDIN(hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua STDOUT(hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).
  • đầu vào có thể ở bất kỳ danh sách thuận tiện hoặc định dạng chuỗi. Bạn có thể giả sử rằng ít hơn mỗi và danh sách chứa ít nhất một phần tử.ai231
  • mỗi số viết tắt sẽ chỉ chứa một. trong khi một số bình thường sẽ chứa bao nhiêu , là cần thiết (bạn có thể cho rằng số này sẽ không bị thay đổi).
  • bạn KHÔNG THỂ nhập một số như '123456'nhưng thay vào đó123,456
  • quy tắc tiêu chuẩn áp dụng.

Các trường hợp thử nghiệm:

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

Làm rõ:

  • đối với các số <1000 sau dấu thập phân trong đầu ra viết tắt, bạn nên có nhiều chữ số theo yêu cầu để có kết quả chính xác. (ví dụ: 2-> sẽ trở thành 0.002k) - có nghĩa là tối đa 3 số thập phân ; đối với các số> 1000 bạn có thể có tối đa 1 thập phân .
  • chữ viết tắt có thể bằng cả chữ thường hoặc chữ hoa
  • Tôi đã loại bỏ các hạn chế tích hợp theo đề xuất trong các nhận xét

Mã ngắn nhất tính bằng byte thắng!


1
Yêu cầu làm rõ: có bao nhiêu chữ số sau dấu thập phân trong đầu ra viết tắt? Làm thế nào để viết tắt số <1000? chữ hoa hoặc chữ thường hoặc cả trong đầu vào và đầu ra?
edc65

1
Có nên không '123,456,789' -> '123.4M'? Ngoài ra, điều này không làm rõ có bao nhiêu số thập phân để sử dụng. Chắc chắn bất cứ điều gì dưới 1000 không cần phải viết tắt.
Kade

1
@ nặc danh2 đọc quy tắc thứ ba.
Grajdeanu Alex.

4
"Bạn không được phép sử dụng bất kỳ mô-đun / chức năng tích hợp nào" Bất kỳ chức năng tích hợp nào?
Alex Howansky

1
Việc bạn sử dụng "kilo" gợi ý các tiền tố SI và những tiền tố này sẽ là ["k", "M", "G"]. "Trong khi một số bình thường sẽ chứa bao nhiêu, khi cần thiết " thì ở nước tôi sẽ là một sai lầm khi sử dụng bất kỳ.
Angs

Câu trả lời:


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 được lưu bởi insertusernamehere, 4 byte lấy cảm hứng từ đó.


  • lấy đầu vào từ các đối số dòng lệnh, in kết quả được phân tách bằng dấu cách bằng dấu phân cách
  • mong đợi viết tắt chữ thường
  • chạy với -r

-2 byte nếu gạch dưới làm dấu phân cách là ok: Thay thế " "bằng _.
-1 byte nếu làm tròn đúng là ok: Thay thế ($y*10|0)/10bằng round($y,1).
-17 byte cho PHP 7.1: Thay thế substr($x,strlen($x)-1)bằng $x[-1].


80 (63) byte để chỉ mở rộng một đối số:

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

lưu vào tập tin, sau đó thực thi (hoặc thay thế <?=bằng echo+ dấu cách và chạy bằng -r.


Ví dụ thứ hai của bạn không biên dịch.
Alex Howansky

1
Bạn có parens không cân bằng.
Alex Howansky

1
-4 byte: for($j=1;$x=$argv[$j++];) - thay vìforeach($argv as$i=>$x)if($i)
insertusernamehere

1
-2 byte: kmb[$i] - thay vì "kmb"[$i].
insertusernamehere

1
@insertusernamehere Các chỉ mục chuỗi âm đang đến trong PHP 7.1; và đó là RCsa RC (chưa). Cảm ơn các byte khác!
Tít

2

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

Cảm ơn @ETHproductions đã lưu 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``)

Để gọi hàm:

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

Đầu ra là alert, trong đó mỗi đầu ra alertchứa một yếu tố khác nhau của đầu vào

Phiên bản dễ đọc:

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

Tóm tắt các chỉnh sửa: chức năng được chuyển đổi thành chức năng mũi tên

  • loại bỏ dấu chấm phẩy ';'
  • loại bỏ var
  • chuyển đổi thành chức năng mũi tên
  • sử dụng bản đồ để lặp qua các phần tử riêng lẻ của mảng
  • dùng |0thay sàn
  • regex được sử dụng để thử nghiệm
  • sử dụng toán tử ternary thay vì câu lệnh if-other
  • bao gồm một chức năng riêng cho .reverse().join''

3
Dưới đây là một số cách để chơi golf này. Vui lòng hỏi bất kỳ câu hỏi nào bạn có thể có :-)
ETHproductions 04/11/2016
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.