Давайте скоротимо ці цифри! Тепер реверс?


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 -> один мільйон -> M
  • 10 9 -> один мільярд -> B

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

Правила та обмеження:

  • Ви можете написати програму або функцію, взявши введення через STDIN(або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT(або найближчу альтернативу), значення повернення функції або параметр функції (вихід).
  • вхід може бути у будь-якому зручному списку чи рядковому форматі. Ви можете припустити, що їх менше, ніж кожен, і що список містить щонайменше один елемент.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
Використання "кілограму" передбачає приставки SI і такі ["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.


Ваш другий приклад не складається.
Олексій Хованський

1
У вас незбалансовані паролі.
Олексій Хованський

1
-4 байти: for($j=1;$x=$argv[$j++];) - замістьforeach($argv as$i=>$x)if($i)
вставитикористувачтуг

1
-2 байти: kmb[$i] - замість "kmb"[$i].
insertusernamehere

1
@insertusernamehere Негативні рядкові індекси надходять у PHP 7.1; і це RC (поки). Дякуємо за інші байти!
Тит

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

3
Ось декілька способів пограти в цей гольф. Не соромтеся задавати будь-які питання, які можуть виникнути у вас :-)
ETHproductions
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.