fundo
A tarefa é simples, mas todo programador a implementou pelo menos uma vez. O Stackoverflow possui muitas amostras, mas elas são curtas o suficiente para ganhar?
História do problema
Você é um programador mal-humorado que recebeu a tarefa de implementar a entrada de tamanho de arquivo para os usuários. Como os usuários não usam bytes, todos digitam "1M", "1K", "3G", "3,14M" - mas você precisa de bytes! Então você escreve um programa para fazer a conversão.
Em seguida, seu gerente entrega dezenas de relatórios de usuários com reclamações sobre números grandes e estranhos na entrada do tamanho do arquivo. Parece que você precisará codificar a conversão reversa também.
O que você precisa fazer?
Aqui está o truque: você deve implementar a conversão bidirecional em um único pedaço de código. Duas funções separadas usadas conforme necessário? Nah, isso é muito simples - vamos fazer um, um curto!
Para os propósitos deste desafio, "kilobyte" significa 1024 bytes, "megabyte" significa 1024 * 1024 = 1048576 bytes e "gigabytle" significa 1024 * 1024 * 1024 = 1073741824 bytes.
Dados de teste
Input -> Output
5 -> 5
1023 -> 1023
1024 -> 1K
1K -> 1024
1.5K -> 1536
1536 -> 1.5K
1048576 -> 1M
1M -> 1048576
Regras
- O valor do teste não excederá 2 * 1024 * 1024 * 1024 ou 2G
- Os seguintes postfixes são usados pelos usuários: K para kilobytes, M para megabytes, G para gigabytes
- O código não é necessário para trabalhar com números negativos
- Não use nenhuma biblioteca externa (por exemplo,
BCMath
em PHP) além das que estão incluídas no pacote (por exemplomath.h
) - As brechas padrão não são permitidas
- O código não deve produzir nada no stderr
- Seu programa pode receber e produzir resultados usando métodos padrão
Respostas:
Python 2,
204190 bytesEste é o meu primeiro codegolf.
fonte
Pip, 60 bytes
Pega entrada da linha de comando (atribuída à
a
variável) e gera saída para stdout.Versão não destruída:
Algoritmo:
i
de 1 a 3:a >= 1024
, esse é um valor de byte que precisa ser convertido em uma unidade maior:a
por 1024x
como o valor atual dea
concatenado com a unidade atualx
foi definido pela etapa anterior, faça a saída. Caso contrário,a
era menor que 1024 (com um possível sufixo de unidade), portanto:a
se houver umaKMG
no final: traduza a letra para a potência apropriada de 1024 e multiplique o número pelo resultado.fonte
JavaScript,
144106 bytesDefinitivamente, isso pode ser encurtado e será feito mais tarde. Só queria ter algo feio por aí;)
fonte
Python2 199 bytes
isso é bobagem, mas funciona (ignorando a questão da precisão decimal) desde que você tenha dezenas de gigabytes de RAM. caso contrário, sua máquina poderá congelar e travar. A primeira coisa que faz é alocar uma matriz de 2gigabyte de números inteiros.
fonte
C
206183 bytesLivrei-me do máximo que pude.
Resultado
Explicação
fonte