Давайте сокращать эти цифры! Теперь поменять?

11

Вступление:

Как Twitter, Instagram и другие, я хотел отображать цифры как 1.2Kи 3.8 Mвместо 1,222или 3,823,456.

Но это не все! Как мы все знаем, могут быть некоторые люди, которым, несомненно, не понравятся эти сокращения, и они попытаются обратить их вспять. Итак, 1.2kстанет 1,200и 3.8 Mстанет 3,800,000.

Задание:

  • Ваша задача - написать программу или функцию, которая преобразует список чисел ( которые представлены в виде строк ) в их сокращенные пары и наоборот.

Например, если список ввода (или любой STDIN) был ['1.4k', '1,234,567', '7.99M'], то вы должны вывести:

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

Вы можете следовать следующей схеме для сокращений:

  • 10 3 -> один килограмм -> К
  • 10 6 -> миллион -> М
  • 10 9 -> один миллиард -> B

Ваш код может принимать все строчные, все прописные, смешанные или неопределенные регистры для ввода и использовать любой из них для вывода, но должен быть согласованным.

Правила и ограничения:

  • Вы можете написать программу или функцию, принимая ввод через STDIN(или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT(или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
  • ввод может быть в любом удобном формате списка или строки. Вы можете предположить, что их меньше, чем каждый, и что список содержит хотя бы один элемент.ai231
  • каждое сокращенное число будет содержать только одно, в . то время как обычное число будет содержать столько, , сколько необходимо (вы можете предположить, что эти числа не будут изменены).
  • Вы НЕ МОЖЕТЕ вводить номер, а '123456'скорее123,456
  • применяются стандартные правила .

Тестовые случаи:

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

Разъяснения:

  • для чисел <1000 после десятичной точки в выводе аббревиатуры у вас должно быть столько цифр, сколько необходимо для получения правильного результата. (например: 2-> станет 0.002k) - это означает не более 3 десятичных знаков ; для чисел> 1000 вы можете иметь до 1 десятичного знака .
  • сокращение может быть как в нижнем, так и в верхнем регистре
  • Я снял встроенные ограничения, как это было предложено в комментариях

Самый короткий код в байтах побеждает!

Грайдеану Алекс.
источник
1
Запросы на уточнение: сколько цифр после десятичной точки в сокращении выводится? как сокращать числа <1000? прописные или строчные буквы или оба на входе и выходе?
edc65
1
Не должен '123,456,789' -> '123.4M'? Кроме того, это не уточняет, сколько десятичных знаков использовать. Конечно, все, что меньше 1000, не должно быть сокращено в любом случае.
Каде
1
@ anonymous2 прочитайте третье правило.
Грайдеану Алекс.
4
«Вам не разрешено использовать какой-либо встроенный модуль / функцию» Любая встроенная функция?
Алекс Хованский
1
Ваше использование "килограмма" предполагает префиксы СИ, и они будут ["k", "M", "G"]. Что означает «хотя обычное число будет содержать столько, сколько необходимо », в моей стране было бы ошибкой использовать любое.
Анг

Ответы:

2

PHP, 234 224 213 201 205 байт

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 байтов, сохраненных здесь именем пользователя, 4 байта, вдохновленные этим.


  • принимает входные данные из аргументов командной строки, печатает результаты через пробел с разделителем
  • ожидает сокращения в нижнем регистре
  • бежать с -r

-2 байта, если подчеркивание как разделитель в порядке: заменить " "на _.
-1 байт, если правильное округление в порядке: заменить ($y*10|0)/10на round($y,1).
-17 байт для PHP 7.1: заменить substr($x,strlen($x)-1)на $x[-1].


80 (63) байтов для расширения только одного аргумента:

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

сохранить в файл, затем выполнить (или заменить <?=на echo+ пробел и запустить с -r.

Titus
источник
Ваш второй пример не компилируется.
Алекс Хованский
1
У вас несбалансированные парены.
Алекс Хованский
1
-4 байта: for($j=1;$x=$argv[$j++];) - вместоforeach($argv as$i=>$x)if($i)
вставить имя пользователя здесь
1
-2 байта: kmb[$i] - вместо "kmb"[$i].
имя пользователя здесь
1
@insertusernamehere В PHP 7.1 появятся отрицательные строковые индексы; и это RC (пока). Спасибо за другие байты!
Titus
2

JavaScript, 545 524 522 518 514 508 504 498 494 214 байтов

Спасибо @ETHproductions за сохранение 180 байт!

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(["1.5M","1,500,000"]) //["1,500,500","1.5M"]

Выходы как alert, где каждый alertсодержит отдельный элемент ввода

Читаемая версия:

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

Сводка правок: преобразованная функция в функцию стрелки

  • удаленные точки с запятой ';'
  • удален var
  • преобразован в функцию стрелки
  • использовала карту для перебора отдельных элементов массива
  • используется |0вместо пола
  • использовал регулярное выражение для тестирования
  • использовали троичные операторы вместо операторов if-else
  • включена отдельная функция для .reverse().join''
user41805
источник
3
Вот некоторые из способов игры в гольф. Не стесняйтесь задавать любые вопросы, которые могут у вас возникнуть :-)
ETHproductions