Гольф кода: дружелюбный аббревиатор числа

На основе этого вопроса: существует ли путь к круглым числам в дружественный формат?

ПРОБЛЕМА - ОБНОВЛЕННЫЙ! (удаленные сотни сокращения от спецификации)

Самый короткий код счетчиком символов, который сократит целое число (никакие десятичные числа).

Код должен включать полную программу.

Соответствующий диапазон от 0 - 9,223,372,036,854,775,807 (верхний предел для целого числа на 64 бита со знаком).

Количество десятичных разрядов для сокращения будет положительно. Вы не должны будете вычислять следующее: 920535 abbreviated -1 place (который был бы чем-то как 0.920535M).

Числа в десятках и сотнях места (0-999) никогда не должен сокращаться (сокращение для числа 57 кому: 1+ десятичные разряды 5.7dk - это является ненужным и не дружественным).

Помните к круглой половине далеко от нуля (23.5, округлен к 24). Округление банкира является verboten.

Вот соответствующие сокращения числа:

h = hundred (102)
k = thousand (103)
M = million (106)
G = billion (109)
T = trillion (1012)
P = quadrillion (1015)
E = quintillion (1018)

ДЕМОНСТРАЦИОННЫЕ ИСХОДНЫЕ ДАННЫЕ/ВЫВОДЫ (исходные данные могут быть переданы как отдельные аргументы):

Первым аргументом будет целое число для сокращения. Вторым является количество десятичных разрядов.

12 1                  => 12 // tens and hundreds places are never rounded
1500 2                => 1.5k
1500 0                => 2k // look, ma! I round UP at .5
0 2                   => 0
1234 0                => 1k
34567 2               => 34.57k
918395 1              => 918.4k
2134124 2             => 2.13M
47475782130 2         => 47.48G
9223372036854775807 3 => 9.223E
// ect...

Исходный ответ от связанного вопроса (JavaScript, не следует за спецификацией):

function abbrNum(number, decPlaces) {
    // 2 decimal places => 100, 3 => 1000, etc
    decPlaces = Math.pow(10,decPlaces);

    // Enumerate number abbreviations
    var abbrev = [ "k", "m", "b", "t" ];

    // Go through the array backwards, so we do the largest first
    for (var i=abbrev.length-1; i>=0; i--) {

        // Convert array index to "1000", "1000000", etc
        var size = Math.pow(10,(i+1)*3);

        // If the number is bigger or equal do the abbreviation
        if(size <= number) {
             // Here, we multiply by decPlaces, round, and then divide by decPlaces.
             // This gives us nice rounding to a particular decimal place.
             number = Math.round(number*decPlaces/size)/decPlaces;

             // Add the letter for the abbreviation
             number += abbrev[i];

             // We are done... stop
             break;
        }
    }

    return number;
}

27
задан 8 revs, 2 users 71% 23 May 2017 в 10:31
поделиться

7 ответов

J, 61 63 65 символов

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.)

Вывод:

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.) 1500 0
┌─┬─┐
│2│k│
└─┴─┘

((j.&(1&{)":({.%&1e3{:));{&' kMGTPE'@{.)(([:<.1e3^.{.),{:,{.) 987654321987654321 4
┌────────┬─┐
│987.6543│P│
└────────┴─┘

(Причина, по которой вывод "коробочный", заключается в том, что J не поддерживает список, состоящий из различных типов)

Объяснение (справа налево):

(([:<. 1000^.{.),{:,{.)

Мы создаем новый 3-элементный список, используя , для присоединения ([:<.1000^.{.) (поплавок <. основание 1000 лог ^. первого параметра {. . Присоединяем к нему второй параметр {:, а затем первый параметр {. .

Итак, после первого бита мы преобразовали, скажем, 12345 2 в 1 2 12345

((j.&(1&{)":({.%&1000{:));{&' kMGTPE'@{.) использует ; для соединения двух половин выражения вместе в рамке, чтобы получить окончательный результат.

Первая половина - это ((j.&(1&{)":({.%&1000{:)), которая делит (%) последнее входное число ({:) на 1000, первое число раз. Затем он устанавливает точность ":, используя второе число в списке ввода (1&{).

Вторая половина {&' kMGTPE'@{. - здесь используется первое число для выбора ({) соответствующего символа из списка сокращений с индексом 0.

10
ответ дан 28 November 2019 в 05:34
поделиться

Python 2.x, 78 символов

a=input()
i=0
while a>=1e3:a/=1e3;i+=1
print"%g"%round(a,input())+" kMGTPE"[i]

В этой версии ( 75 символов ) используется printf, который выводит дополнительные нули и следует правилу округления до четности.

a=input()
i=0
while a>=1e3:a/=1e3;i+=1
print"%%.%df"%input()%a+" kMGTPE"[i]
7
ответ дан 28 November 2019 в 05:34
поделиться

Perl 114 111 104 символа

Моя первая кодовая запись в гольф!

Аргументы, полученные из стандартного ввода: perl fna.pl 918395 1

($n,$d)=@ARGV;
@n=$n=~/./g;
@s=' kMGTPE'=~/./g;
printf"%.".(@n>3?$d:0)."f%s",$n/(10**($#n-$#n%3)),$s[@n/3];

Вывод:

918.4k


Версия без гольфа (с объяснением):

( $number, $dp ) = @ARGV;      # Read in arguments from standard input

@digits = split //, $number;   # Populate array of digits, use this to count
                               # how many digits are present

@suffix = split //, ' kMGTPE'; # Generate suffix array

$number/(10**($#n-$#n%3));     # Divide number by highest multiple of 3

$precision = @n>3 ? $dp : 0;   # Determine number of decimal points to print

sprintf "%.".$precision."f%s", # "%.2f" prints to 2 dp, "%.0f" prints integer
        $number, $suffix[@n/3];# Select appropriate suffix
5
ответ дан 28 November 2019 в 05:34
поделиться

Javascript 114 символов

function m(n,d){p=M.pow
d=p(10,d)
i=7
while(i)(s=p(10,i--*3))<=n&&(n=M.round(n*d/s)/d+"kMGTPE"[i])
return n}

Также 114 - Использование spidermonkey - Ввод на STDIN

[n,d]=readline().split(' '),x=n.length,p=Math.pow,d=p(10,d)
x-=x%3
print(Math.round(n*d/p(10,x))/d+" kMGTPE"[x/3])

104 - Функция

function(a,b,c,d){
    c=(''+a).length;
    d=Math.pow;
    b=d(10,b);
    return((a*b/d(10,c-=c%3))+.5|0)/b+' kMGTPE'[c/3]
}

Которая также становится 99, если вы замените ('' + a) с a и обещание передавать только строки :)

5
ответ дан 28 November 2019 в 05:34
поделиться

Ruby - 79 77 75 83 символа

n,d=ARGV
l=n.to_s.length
printf"%.#{l>3?d:0}f%s",n.to_f/10**(l-l%3)," kMGTPE"[l/3]

Считывает из аргументов командной строки.

74 72 80 символов, вывод выводится в двойных кавычках

n,d=ARGV
l=n.to_s.length
p"%.#{l>3?d:0}f%s"%[n.to_f/10**(l-l%3)," kMGTPE"[l/3]]

66 74 символа, вывод дополнительных нулей

n,d=ARGV
l=n.to_s.length
p"%.#{d}f%s"%[n.to_f/10**(l-l%3)," kMGTPE"[l/3]]

На основе этого решения и примера кода .

4
ответ дан 28 November 2019 в 05:34
поделиться

dc - 75 символов

A7 1:U77 2:U71 3:U84 4:U80 5:U69 6:U[3+r1-r]sJ?sddZd3~d0=Jrsp-Ar^ldk/nlp;UP

Использует Z (количество цифр) % 3 , чтобы найти единицу измерения. Большая часть кода предназначена для установки массива символов единиц, реальный код - 39 символов. Макрос J настраивается, когда % 3 равно 0 , чтобы избежать печати 0,918M в седьмом. прецедент. Он не округляется должным образом.

Если вы говорите dc , не стесняйтесь его улучшать.

3
ответ дан 28 November 2019 в 05:34
поделиться

Perl 94 символа

($_,$d)=@ARGV;$l=length;@u=' kMGTPE'=~/./g;printf"%.".($l>3?$d:0)."f$u[$l/3]",$_/10**($l-$l%3)

Использование:

perl abbreviator.pl 47475782130 2

Вывод:

47.48G
0
ответ дан 28 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: