평판 형식


13

질문 페이지 / 게시물에서 볼 때 Stack Exchange의 다양한 평판 수준이 다르게 형식화되어 있다는 것을 알고있을 것입니다. 모든 형식 지정 규칙이 있습니다.

  • 사용자에게 1 ~ 999 (1 ~ 3 자리)의 담당자가있는 경우 그대로 유지됩니다.
  • 사용자가 1000에서 9999 회 (4 자리 숫자)를 가진 경우 쉼표를 구분 기호로받습니다. 9,999
  • 사용자가 10000에서 99999 사이의 응답 (5 자리)을 가진 경우 단축되고 반올림됩니다. 즉, 16741 rep 형식 16.7k은로 표시됩니다. 하위 구분 (이전 지점)의 쉼표와 달리 점 구분 기호를 확인하십시오.

    1. 16750은 이미 결과가 나올 것입니다 16.8k( 고정 된 것으로 보이므로 )

    2. 16941의 결과는 16.9k16950으로 반올림 17k되며 예를 들어 17014입니다.

    3. 99941은으로 99.9k, 99950은으로 반올림합니다 100k(이것은 제가 SE에서 rep-rounding으로 실제로 싫어하는 것입니다. 100,000은 그런 이정표이고 99950은 어디에도 없기 때문입니다).

  • 사용자가 100000에서 999999의 담당자를 가지고 있다면 다음과 같이 반올림됩니다.

    1. 100100 100k은로 내림하고 100500은로 내림합니다 101k. 문제는 반올림이 수행되지만 소수점 이하 자릿수가 제거됩니다 (4 자리 rep와 달리).

    2. 100450은로 반올림하고 100k450에서 500을 반올림하는 단계는 없습니다 100k. 100499도 마찬가지 입니다.

    3. 279843은로 반올림 280k하고 399999는로 반올림합니다 400k.

입력으로, 당신은 원시 평판을 받고 형식으로 출력합니다.

입력에 유효하지 않은 숫자 / 숫자가 아닌 숫자 또는 선행 0이있는 숫자가 수신 되지 않는다고 생각할 수 있습니다 0001234.

Jon Skeet이 곧 1,000,000 개에 도달하지 않는 것 같으므로 코드는 가능한 한 짧아야합니다. 즉 백만을 초과하는 담당자를 처리 할 필요가 없습니다 (예 : 999500 이상에서는 특별한 경우는 없음).


7
"존 소총은 곧 100에 도달 할 것 같지 않기 때문에"[표창장은 필요로했다]
마일로 브란트

@Milo Easy -2015 년 93k를 기록했습니다. 1,000,000 년까지 163,685 명이 남았으므로 1.5 년 이상 걸릴 것입니다 (거의 2, 거의 말할 것입니다). 이를 통해 2011 년 이후 매년 매년 그의 담당자가 감소하고 있음을 고려해야합니다. 2011 : 134.7k, 2012 : 131.8k, 2013 : 116.8k, 2014 : 104.3k, 2015 : 94.3k.
nicael

긴 설명이지만,
대체로

@Edc Peter Taylor 의이 답변 을 보십시오 .
nicael

2
" 응답의 범위가 10000 ~ 994999 (둘 다 포함) 인 경우 반올림 규칙을 사용하여 유효 숫자 3을 반올림하여 1000으로 나눈 .다음 소수점으로 표시k0 하여 설명을 단축 할 수 있다고 생각합니다. 접미사로 ; 세 번째 유효 숫자가 소수점 오른쪽에있는 경우 값은 2 개의 유효 숫자로만 표시 된다는 경고에 따라야합니다 . "특정 컷오프는 단일 테스트 목록으로 이동할 수 있습니다. 게시물 끝에있는 사례로, 테스트 프레임 워크에 복사하여 붙여 넣기에 더 편리합니다.
피터 테일러

답변:


4

apt, 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

자바 스크립트 (ES6), 76 68 바이트

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

또 다른 첫 번째 시도. 그 편리를 위해 이여 감사 .toLocaleString(), 내가 찾을 수있는 가장 짧은 대안은 21 바이트 이상 ...

이것은 거주하는 국가에 따라 ,또는을 기준으로 수천을 구분합니다 .. 5 바이트를 더 늘리려면 항상 쉼표를 사용하도록 할 수 있습니다.

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

귀하의 로케일은 당신을 위해 잘 작동하지만, 여기 이탈리아에서 나는 1.234 (쉼표 대신 점)를
얻습니다

@ edc65 이제 코드 골프에 빠질 줄은 몰랐습니다. 지금 작동합니까?
ETHproductions

완전한. 실제로 나는 그것이 가능하다고 생각하지 않았습니다. 그리고 나는 단지 'en'을 시도했고 그것은 또한 작동하는 것 같습니다
edc65

휴대용 일 필요가 없기 때문에 로케일을 조정할 필요가 없다고 생각합니다.
geokavel

1
기본적으로 컴퓨터에서 작동하면 충분하다고 생각합니다.
geokavel

3

자바 스크립트 (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"

편집 : ["1", "001"]문자열 화하는 것을 깨달았을 때 6 바이트를 절약 했습니다 "1,001".

편집 : @ Mwr247의 의견을 수정하기 위해 2 바이트를 저장했습니다!


16950주는 16.9k대신17k
Mwr247

@ Mwr247 감사합니다.이 수정으로 2 바이트가 더 절약되었습니다!
Neil

1

파이썬 2.7, 58 바이트

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

사건 (x+.5)을 처리 하기 위해 사용해야 했어16950->17k

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.