Introdução:
Como o Twitter, o Instagram e outros, eu queria exibir números como 1.2K
e em 3.8 M
vez de 1,222
ou 3,823,456
.
Mas isso não é tudo! Como todos sabemos, pode haver alguns seres humanos que, sem dúvida, não gostam dessas abreviações e tentam revertê-las. Então, 1.2k
se tornará 1,200
e 3.8 M
se tornará 3,800,000
.
A tarefa:
- sua tarefa é escrever um programa ou uma função que converta uma lista de números ( que são dados como cadeias ) em seus pares abreviados e vice-versa.
Por exemplo, se a lista de entrada (ou qualquer uma STDIN
) fosse ['1.4k', '1,234,567', '7.99M']
, você deve gerar:
['1,400', '1.2M', '7,990,000']
Você pode seguir o próximo esquema para abreviações:
- 10 3 -> um quilo -> K
- 10 6 -> um milhão -> M
- 10 9 -> um bilhão -> B
Seu código pode assumir todas as letras minúsculas, todas as maiúsculas, maiúsculas ou minúsculas para entrada e usar qualquer uma dessas para saída, mas deve ser consistente.
Regras e restrições:
- você pode escrever um programa ou função, recebendo entrada via
STDIN
(ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado viaSTDOUT
(ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída). - A entrada pode estar em qualquer formato conveniente de lista ou string. Você pode assumir que são menores que cada um e que a lista contém pelo menos um elemento.
ai
231
- cada número abreviado conterá apenas um,
.
enquanto um número normal conterá quantos forem,
necessários (você pode presumir que esses números não serão alterados). - você NÃO PODE inserir um número,
'123456'
mas sim123,456
- aplicam -se regras de código-golfe padrão .
Casos de teste:
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']
Esclarecimentos:
- para números <1000 após o ponto decimal na saída da abreviação, você deve ter quantos dígitos forem necessários para obter o resultado correto. (por exemplo:
2
-> se tornará0.002k
) - isso significa no máximo 3 casas decimais ; para números> 1000, você pode ter no máximo 1 decimal . - a abreviação pode estar em maiúsculas ou minúsculas
- Eu removi a restrição interna, conforme sugerido nos comentários
O código mais curto em bytes vence!
'123,456,789' -> '123.4M'
? Além disso, isso não esclarece quantas casas decimais usar. Certamente qualquer coisa abaixo de 1000 não precisa ser abreviada de qualquer maneira.["k", "M", "G"]
. O que significa "embora um número normal contenha o número necessário " significa que, no meu país, seria um erro usá-lo.Respostas:
PHP,
234224213201205 bytes6 bytes salvos por insertusernamehere, 4 bytes inspirados nisso.
-r
-2 bytes se sublinhado como separador estiver ok: Substitua
" "
por_
.-1 byte se o arredondamento correto estiver correto: Substitua
($y*10|0)/10
porround($y,1)
.-17 bytes para o PHP 7.1: Substitua
substr($x,strlen($x)-1)
por$x[-1]
.80 (63) bytes para expandir apenas um argumento:
salve no arquivo, execute (ou substitua
<?=
porecho
+ espaço e execute com-r
.fonte
for($j=1;$x=$argv[$j++];)
- em vez deforeach($argv as$i=>$x)if($i)
kmb[$i]
- em vez de"kmb"[$i]
.JavaScript,
545524522518514508504498494214 bytesObrigado a @ETHproductions por economizar 180 bytes!
Para chamar a função:
Saídas como
alert
, onde cadaalert
uma contém um elemento diferente da entradaVersão legível:
Resumo das edições: função convertida em uma função de seta
var
|0
vez de andar.reverse().join''
fonte