그 숫자를 축약하자! 이제 반대?


11

소개:

트위터와 인스 타 그램 및 다른 사람처럼, 내가 좋아하는 번호를 표시하고 싶어 1.2K하고 3.8 M대신에 1,222또는 3,823,456.

그러나 이것이 전부가 아닙니다! 우리 모두가 알다시피, 몇 가지가있을 수 있습니다 인간 undoubtely를 반전하려고하지 않습니다 이러한 약어와 같은 것이다. 그래서, 1.2k될 것입니다 1,2003.8 M될 것입니다 3,800,000.

작업:

  • 당신의 임무는 숫자 목록 ( 문자열로 주어진 )을 약어 쌍으로 변환하거나 그 반대로 변환하는 프로그램이나 함수를 작성하는 것 입니다.

예를 들어, 입력 목록 (또는 any STDIN)이 인 ['1.4k', '1,234,567', '7.99M']경우 다음을 출력해야합니다.

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

약어의 다음 스키마를 따를 수 있습니다.

  • 10 3- > 1 킬로-> K
  • 10 6- > 백만-> M
  • 10 9- > 10 억-> 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보다 큰 숫자의 경우 최대 10 진수 를 사용할 수 있습니다 .
  • 약어는 소문자 또는 대문자 일 수 있습니다.
  • 의견에서 제안한대로 내장 제한을 제거했습니다.

바이트 단위의 가장 짧은 코드가 이깁니다!


1
설명 요청 : 약어 출력에서 ​​소수점 뒤에 몇 자리 숫자입니까? 1000 미만의 숫자를 줄이는 방법? 입력 또는 출력에서 ​​대문자 또는 소문자 또는 둘 다?
edc65

1
하지 말아야 '123,456,789' -> '123.4M'합니까? 또한 이것은 사용할 소수 자릿수를 명확하게하지 않습니다. 어쨌든 1000 미만의 항목은 약어로 사용할 필요가 없습니다.
Kade

1
@ anonymous2는 세 번째 규칙을 읽습니다.
Grajdeanu Alex.

4
"당신은 어떤 내장 모듈 / 기능을 사용할 수 없습니다 것" 모든 내장 기능을?
Alex Howansky

1
"kilo"를 사용하면 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]," ";}

insertusername으로 6 바이트를 절약 할 수 있습니다.


  • 명령 행 인수에서 입력을 받고 후행 분리 자로 공백으로 분리 된 결과를 인쇄합니다.
  • 소문자 약어를 기대합니다
  • 와 실행 -r

세퍼레이터로서 밑줄 OK이면 바이트 -2 : 교체 " "_.
-1 올바른 반올림 괜찮 바이트 경우 : 교체 ($y*10|0)/10와 함께 round($y,1).
PHP 7.1 -17 바이트 : 교체 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)]);

파일에 저장 한 다음 실행하거나 + space로 바꾸고 <?=echo실행하십시오 -r.


두 번째 예제는 컴파일되지 않습니다.
Alex Howansky

1
균형이 맞지 않는 괄호가 있습니다.
Alex Howansky

1
-4 바이트 : for($j=1;$x=$argv[$j++];) – 대신foreach($argv as$i=>$x)if($i)
insertusername 여기

1
-2 바이트 : kmb[$i] – 대신 "kmb"[$i].
insertusername 여기에

1
@insertusername 여기 PHP 7.1에서 음수 문자열 인덱스가 나옵니다. 그리고 그것은 RC입니다 (아직). 다른 바이트 주셔서 감사합니다!
Titus

2

자바 스크립트, 545 524 522 518 514 508 504 498 494 214 바이트

180 바이트를 절약 한 @ETHproductions에 감사합니다!

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
  • 화살표 함수로 변환
  • 배열의 개별 요소를 반복하는 데 사용 된 map
  • |0바닥 대신 사용
  • 테스트에 정규식 사용
  • if-else 문 대신 삼항 연산자를 사용했습니다.
  • 별도의 기능을 포함 .reverse().join''

3
골프를 치는 방법은 다음과 같습니다. 질문이 있으시면 언제든지 문의하십시오 :-)
ETHproductions
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.