Форматировать репутацию


13

Вы, вероятно, знаете, что разные уровни репутации в Stack Exchange по-разному форматируются, если смотреть со страницы вопросов / поста. Все правила форматирования репов:

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

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

    2. 16941 приводит к 16.9k16950 раундам до 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.

Поскольку Jon Skeet не достигает 1000000 в ближайшее время, ваш код должен быть настолько коротким, насколько это возможно, вам не нужно обрабатывать повторение более одного миллиона (т.е. никаких особых случаев для 999500 и выше).


7
«Потому что Джон Скит, кажется, не достигнет 1 000 000 в ближайшее время» [цитата нужна]
Майло Брандт

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

Длинное объяснение, но в целом, это просто способ округления, обычно делается
edc65

@Edc Посмотрите этот ответ Питера Тейлора.
Ника

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

Ответы:


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

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

1
В принципе, если это работает на вашем компьютере, я думаю, что это достаточно хорошо.
геокавель

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" ...?
Конор О'Брайен

@ 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.