Форматуйте репутацію


13

Ви, напевно, знаєте, що різні рівні репутації на Stack Exchange відформатовані по-різному, якщо їх бачити на сторінці питань / публікації. Є всі правила повторного форматування:

  • якщо користувач має від 1 до 999 (одна-три цифри) повтор, він залишається таким, як є.
  • якщо користувач має від 1000 до 9999 повторень (чотири цифри), він отримує кому як роздільник: 9,999
  • якщо користувач має від 10000 до 99999 повторень (п'ять цифр), він скорочується і округляється. Тобто, 16741 повтор відформатовано як 16.7k, помітьте роздільник точок на відміну від коми для нижнього повтору (попередня точка).

    1. 16750 вже матиме результат 16.8k(оскільки це, здається, виправлено )

    2. 16941 призводить до 16.9k, 16950 раундів до 17k, як і 17014, наприклад.

    3. 99941 раундів до 99.9k, 99950 раундів до 100k(це те, що я насправді ненавиджу при повторному округленні на SE, тому що 100 000 - це така віха, а 99950 - ніде).

  • Якщо користувач має від 100000 до 999999 повторень, він округляється таким чином:

    1. 100100 раундів до 100k, 100500 раундів до 101k. Річ у тому, що округлення робиться, але десяткова частина знімається (на відміну від чотиризначного повтору).

    2. 100450 округлюється до 100k, жодного кроку до круглого від 450 до 500. Також 100499 - все одно 100k.

    3. 279843 раундів до 280k, і 399999 раундів до 400k.

Як вхід, вам надається сира репутація та виводиться у форматі.

Ви можете вважати, що вхід не отримає недійсних чисел / не-чисел чи чисел із провідними нулями, тобто 0001234.

Оскільки, схоже, Джон Скіт скоро не досягає 1 000 000, ваш код повинен бути максимально коротким, вам не потрібно обробляти представники, що перевищують один мільйон (тобто немає спеціальних випадків для 999500 і вище).


7
"Тому що, схоже, Джон Скіт скоро не досягне 1 000 000" [потрібна цитата]
Міло Брандт

@Milo Easy - за 2015 рік він заробив 93 тис. У нього залишилось 163 685 до 1 000 000, тож таким чином йому знадобиться більше 1,5 років (майже 2, я б сказав). З цим слід також враховувати, що його щорічна реплікація зменшується з кожним роком, починаючи з 2011 року. 2011: 134,7k, 2012: 131,8k, 2013: 116,8k, 2014: 104,3k, 2015: 94,3k.
nicael

Довге пояснення, але в цілому, це просто спосіб округлення, як правило, робиться
edc65

@ Edc Дивіться цю відповідь Пітера Тейлора.
nicael

2
Я думаю, що пояснення можна скоротити, сказавши: " Якщо представник знаходиться в діапазоні від 10000 до 994999 (обидва включно), він округляється до 3 значущих цифр за допомогою правила напіврозведення, поділеного на 1000, і відображається з .десятковою точкою і з суфіксом k; з урахуванням застереження, що якщо третя значуща цифра є 0і знаходиться праворуч від десяткової крапки, то значення відображається лише до двох значущих цифр. "Потім конкретні відсічки можуть бути переміщені до єдиного списку тесту випадки в кінці публікації, що зручніше для вставки копії в тестову рамку.
Пітер Тейлор

Відповіді:


4

Japt, 50 48 байт

Перша спроба; може бути кращий метод.

U<A³?U:U<L²?Us i1', :(U<1e5?Ue2n)r /A:Ue3n)r)+'k

Спробуйте в Інтернеті!

Як це працює

          // Implicit: U = input integer, A = 10, L = 100
U<A³?U    // If U is less than A³ (10³ = 1000), return U.
:U<L²?    // Else, if U is less than L² (100² = 10000), return:
Us i1',   //  U.toString, with a comma inserted at position 1.
:(        // Else, return:
U<1e5?    //  If U is less than 1e5:
Ue2n)     //   U * (10 to the power of -2), 
r /A      //   rounded and divided by 10.
:Ue3n)r)  //  Else: U * (10 to the power of -3), rounded.
+'k       //  Either way, add a "k" to the end.
          // Implicit: output last expression

7

JavaScript (ES6), 76 68 байт

x=>x<1e4?x.toLocaleString():(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"

Ще одна перша спроба. Слава Богу за те, що зручно .toLocaleString(), найкоротша альтернатива, яку я міг знайти, - це на 21 байт довше ...

Це розділяє тисячі або, ,або .залежно від того, в якій країні ви проживаєте. На п’ять два байти більше, ви завжди можете використовувати кому:

x=>x<1e4?x.toLocaleString`en`:(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"

Ваша мова працює для вас чудово, але тут, в Італії, я отримую 1.234 (крапка замість коми)
edc65

@ edc65 Тепер це проблема, яку я ніколи не думав зіткнутися з кодом гольфу. Чи працює це зараз?
ETHproductions

Ідеально. Дійсно, я не вважав, що це можливо. І я спробував просто "en", і, здається, теж працює
edc65

Я не думаю, що вам не потрібно налаштовувати локаль, тому що він не повинен бути портативним.
geokavel

1
В основному, якщо це працює на вашому комп’ютері, я думаю, що це досить добре.
geokavel

3

JavaScript (ES6), 71

Побиття @ETHProductions, поки він не бачить мого натяку. Він це бачив.

x=>x<1e3?x:x<1e4?(x+='')[0]+','+x.slice(1):(x/1e3).toFixed(x<99950)+'k'

Тест

f=x=>x<1e3?x:x<1e4?(x+='')[0]+','+x.slice(1):(x/1e3).toFixed(x<99950)+'k'

function test() { n=+I.value, O.textContent = n + ' -> ' + f(n) }

test()
<input id=I type=number value=19557 oninput=test()>
<pre id=O></pre>

Тест


1
Можливо, вам слід оновити рядок "Побиття ETHproductions" ...?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ зроблено.
edc65

2

ES6, 68 62 байт

x=>x<1e4?`${x}`.split(/(?=...)/)+"":x.toPrecision(3)/1e3+"k"

Редагувати: Збережено 6 байт, коли я зрозумів, що ["1", "001"]строковим чином до "1,001".

Редагувати: збережено 2 байти, щоб виправити коментар @ Mwr247!


16950дає 16.9kзамість17k
Mwr247

@ Mwr247 Спасибі, виправлення врятує мені ще два байти!
Ніл

1

Python 2.7, 58 байт

lambda x:['%.3g'%((x+.5)/1e3)+'k','{:,}'.format(x)][x<1e4]

Мені довелося використовувати (x+.5)для розгляду 16950->17kсправи ..

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