Você pode se lembrar da primeira ou da segunda série usando o formulário expandido para aprender sobre o valor de posição dos números. É mais fácil explicar com um exemplo, então considere o número 123
. Em forma expandida, é representado como 100 + 20 + 3
, o que ajuda uma mente jovem a visualizar o valor do local. É uma reminiscência de como você diz: cento (mais) vinte (mais) três.
Podemos estender isso além do local das unidades com decimais: 2.718 => 2 + 0.7 + 0.01 + 0.008
Seu desafio é escrever um programa ou função que tenha um número de ponto flutuante positivo ou zero (suponha que seja tão grande ou preciso quanto o seu idioma possa suportar; não será em notação científica) ou string e o imprime / retorna em formato expandido como explicado acima.
Você não precisa de espaços entre +
zero e zero antes da vírgula decimal, portanto o exemplo acima pode ser 2+.7+.01+.008
. Valores que seriam iguais a zero devem ser omitidos ( 101.01 => 100 + 1 + 0.01
), a menos que a entrada seja zero (veja abaixo).
Os valores não devem ter mais de um zero inicial antes do ponto decimal ou qualquer zero posterior a ele (não-não:) 0060, 0000.2, 30., 30.000, .0400
. A entrada também estará em conformidade com isso.
Como os alunos da primeira série têm curtos períodos de atenção, seu código deve ser o mais curto possível.
Casos de teste
0 => 0
6 => 6
0.99 => 0.9 + 0.09
24601 => 20000 + 4000 + 600 + 1
6.283 => 6 + 0.2 + 0.08 + 0.003
9000000.0000009 => 9000000 + 0.0000009
fonte
Respostas:
CJam,
3326 bytesIsso não funcionará com o intérprete Java; a impressão flutua de maneira diferente. Experimente com o intérprete CJam .
O último caso de teste é impresso
9000000+9e-7
, que foi considerado válido por @NinjaBearMonkey .Graças a @ jimmy23013 por jogar fora 7 bytes!
Como funciona
fonte
r_ee\'0fe<f{\~t~}{},'+*0e|
.JavaScript (ES7), 102 bytes
Explicação
Requer que o número seja inserido como uma sequência sem zeros à esquerda (a menos que o número seja
0
claro).Nota: Devido à estranheza de ponto flutuante, alguns números (como
.3
) saem errados, mas teoricamente isso funciona para qualquer número.Teste
O teste usa em
Math.pow
vez de**
compatibilidade com o navegador.Mostrar snippet de código
fonte
Math.floor
=>0|
...?1
que seria quebradoMath.log10(n)
, retornaria um número negativo e|0
arredondaria para zero em vez de para o piso.0|Math.log10(n),p-=p<0
vez deMath.floor(Math.log10(n))
?n<1
porque o0|
faráp
igual0
para ambos0.1
e-0.1
. A maneira mais curta que consigo pensar ép=Math.log10(n),p=p-(p<0)|0
qual é o mesmo comprimento que o usoMath.floor
. :(n=0.1
qualquer maneira.Retina ,
867775 bytesA contagem de bytes assume que a fonte está codificada como ISO 8859-1.
O avanço de linha à direita é significativo.
Experimente online.
Explicação
Começamos transformando a entrada em uma lista separada de componentes de alimentação de linha, embora apenas o dígito inicial (ou final) esteja correto. Isso é feito abusando de um estágio dividido. Em vez de dividir a entrada, combinamos tudo, de modo que os segmentos restantes estão todos vazios. Removemos esses segmentos vazios com a
_
opção O problema é que os estágios divididos também retornam os valores de todos os grupos de captura. Por isso, usamos um lookahead em cada partida para capturar a parte correta da string: primeiro tentamos encontrar a.
esquerda da partida. Se for esse o caso, capturamos tudo, desde o.
até e incluindo o dígito que estamos correspondendo no momento. Caso contrário, devemos estar na parte inteira da entrada, portanto capturamos todos os números após a correspondência (incluindo a correspondência). Também devemos nos livrar do próprio ponto decimal, para que a segunda captura seja opcional. Se não houver\d
captura, isso simplesmente removerá a correspondência da entrada.Agora usamos um estágio de transliteração para transformar todos, exceto os dígitos iniciais / finais, em zeros. Combinamos um componente menor que 1 com
\..+\B
onde\B
garante que paramos a correspondência de um dígito antes do final, ou uma parte inteira com(?<=^\d).+
a aparência da parte traseira garante que iniciemos um dígito no número. O estágio de transliteração substituirá quaisquer dígitos (d
) por zeros nas correspondências.Agora, o formato de saída real
+
não deve usar alimentações de linha como separadores. As¶
partidas um avanço de linha para fazer essa substituição. Enquanto estamos nisso, também removemos linhas que contêm apenas0
s e.
s.O estágio anterior não remove um avanço ou um resultado final
0
(porque eles não têm um avanço de linha antes e depois deles), portanto, nós os removemos explicitamente.fonte
Python 2,
216210196175 bytesAqui está um código levemente golfe que eu vou jogar ainda mais quando tiver tempo. Ele usa análise de strings.
Explicação
Portanto, a entrada é separada em uma parte inteira e decimal. Depois, existe uma compreensão da lista de loop for. Na parte inteira, o comprimento da sequência após um caractere no decimal é multiplicado por "0" para obter tantos zeros no final, se esse caractere.
Para a parte decimal, o índice do caractere atual é o número de zeros antes dele e, portanto, essa parte é simples.
A tentativa e a exceção são usadas para determinar se ela possui uma parte decimal ou não (usando um erro).
O resultado final é acompanhado por sinais de mais.
Experimente aqui!
fonte
o if o else ["0"]
pode sero or["0"]
.o=[(...)] for
,e(I) if
,e(i[1]) if
,print "+"
, e o parêntese exterioro=[(...)
, bem como, na verdade. Finalmente, você pode tirar o condicional final da função de junção da seguinte maneira:print"+".join(o)or"0"
porque o join retornará uma lista vazia seo
estiver vazia; portanto, o condicional avaliará da mesma maneira que economiza um byte.Pitão, 30 bytes
Suíte de teste
A solução básica aqui é substituir todos os dígitos da entrada por e
0
, em seguida, inserir cada dígito no local apropriado, avaliar, filtrar os zeros e juntar-se às vantagens. Infelizmente, a função de avaliação de Pyth não aceita zeros à esquerda atualmente. Eu vou trabalhar para corrigir isso.Para superar esse problema, adicionei uma função auxiliar
y
, que tenta recursivamente a avaliação até que nenhum erro seja gerado, removendo o primeiro dígito toda vez. Observe que esta função fará um loop infinito na entrada inválida.Além disso, era necessário um caso especial para a entrada
0
.Em suma, acho que o código é muito bom, mas as instalações de idiomas podem ser melhores. Quem quer erros?
fonte
Python 3, 138
Isso é vagamente baseado na abordagem de TanMath / Ogaday de ler o número como uma string e analisá-lo dessa maneira. Eu tenho que usar a atribuição de estrelas
i
para que ele manipule corretamente números inteiros.fonte
Python,
141132128 bytesEste ainda é relativamente legível. Converta em string e manipule os
>1
dígitos separadamente dos<1
dígitos. Também temos um caso especial para zero. Eu poderia remover mais dois espaços abaixo, mas eu gosto de mantê-lo bonito.A desvantagem é que ele será dividido em carros alegóricos com mais de 9 casas decimais.
Abaixo está o original. A primeira edição foi encurtar o caso especial zero, a segunda edição foi remover o 0 antes do decimal, a terceira foi remover alguns parênteses e espaços extras.
Explicação:
fonte
Mathematica, 81 bytes
Caso de teste:
fonte
CJam, 44 bytes
Experimente aqui.
Ele falha no último caso de teste e gera o seguinte:
Mas digamos que seja muito preciso que o CJam não possa lidar com isso.
Explicação
fonte
Python 3,
187180173154 bytesConsegui jogar uns bons 19 bytes de golfe graças às sugestões de @Thomas Kwa acima
result or['0']
, além de reorganizar uma álgebra ( 154 bytes ):Minha melhor tentativa até agora( 173 bytes ). Com base na nova abordagem, consulte o final da postagem:reduziu o meu original até 180 bytes :
Eu aprendi um novo recurso de idioma hoje fazendo isso! Condicionais via indexação booleana. Eu posso ter exagerado um pouco.
Tentei abstrair as compreensões, mas não consegui reduzi-las ( 196 bytes ):
(Inverter sequências é caro!)
Enquanto o meu é mais curto por agora, acho que TanMath pode golfe seu baixo para coincidir com o meu: Usando
e=enumerate
, substituindopass
com0
, e usar'0'
no lugar de['0']
na instrução de retorno deve salvar 4 + 3 + 2 = 9 bytes! Levando-o para 187. Tenho certeza de que mais alguns bytes podem ser removidos em algum lugar ...editar Nova abordagem ( 156 bytes ). No entanto, ele só pode lidar com precisão de até 6dp, semelhante à entrada CJam de @ jimmy23013, por isso falha no teste final. Não consegui forçá-lo a imprimir mais 0s, talvez alguém possa. Em vez disso, usei-o como base da minha melhor tentativa até o momento, veja top (Além disso, essa abordagem imprime o 0 antes da casa decimal, mas isso também parece válido.).
try:... except:...
Adotou a abordagem do TanMath:fonte
festa pura, 210
ou
Teste:
fonte
Python, 131 bytes
Uma função recursiva muito, muito bagunçada, provavelmente não é a melhor maneira de fazer isso. Entrada como
f("10.0203")
.fonte
C,
155153161 bytes+2 para vincular na biblioteca de matemática (a fonte em si é 159).
Ungolfed
fonte
Dyalog APL , 47 bytes
Toma número na forma de vetor de caracteres, por exemplo
'123'
.Exemplos:
Notas:
○ O motivo do último exemplo modificado é que o APL, como alguns dos outros envios, por padrão mudará para notação científica para números tão extremos.
○ A frase
↑⍕¨f¨,¨
é necessária apenas para processar todos os exemplos de uma só vez.fonte
Retina, 113 bytes
Atualmente muito mais tempo que a solução de Martin, mas usa um método diferente, então decidi publicá-la.
Experimente online aqui.
fonte
perl, 132 bytes
131 +1 para
-p
switch.Isso é baseado na minha
sed
resposta anterior :Suíte de teste:
fonte
Powershell -
172166193 bytesTudo em uma única linha:
Ungolfed:
Casos de teste, mais um adicional:
fonte
$args = 0
. Aqui está uma correção de bug simples que também salva 3 bytesPerl, 248 bytes
Ei, eu sou noobish no golfe Perl.
Experimente aqui.
fonte
5
, retorne50
.Java,
284244243 bytesInfelizmente, não foi possível encontrar uma maneira mais curta de criar Strings repetidas do que:construir umchar[]
do comprimento necessáriouseArrays.fill
para definir os caracteresusenew String
para que possa ser concatenadoCom inspiração de @Khaled A Khunaifer, eu poderia economizar 40 bytes.
Edit:
indexOf
leva um int, então eu poderia substituir'.'
por46
. Infelizmente, isso não parece ser possível comreplace
.fonte
.replace('\0','0')
função substituirString
não esperarchar
, deve ser.replace("\0","0")
Python, 125 bytes
Depois de excluir minha primeira resposta (sry!), Que não conseguia lidar com pequenos números devido a problemas de epsilon da máquina, encontrei uma solução diferente. Ele lida com float e números inteiros, zeros à direita (!) E é escrito como função.
Obrigado ao @ogaday pelas dicas úteis e pela compacta correção '0'!
Golfe:
Ungolfed:
Uso:
fonte
f('0')
No entanto, falha no caso de teste e, quando copio e colo diretamente no meu intérprete, recebo a notação científica (que acho que está bem). Além disso,list(c)
é mais curto. Se você concatenar o'.'
antes de transformá-lo em uma lista, também não precisará adicionar[]
. Usar emfind
vez do índice na cadeia de caracteres antes de transformá-la em uma lista, depois de adicionar,'.'
também economiza um byte. Reordenar a desigualdade também permite que você remova um espaço adicional:def f(x):x+='.';i=x.find('.');z=list(x);del z[i];return"+".join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if"0"<o])or'0'
CoffeeScript, 144 bytes
Solução direta:
Executável:
Mostrar snippet de código
fonte
Stax , 18 bytes
Execute e depure
Descompactado, não jogado e comentado, parece com isso.
Execute este
Como muitas das outras soluções postadas, ela produz
9000000+9e-7
para o último caso de teste. De acordo com o precedente estabelecido, isso é permitido porque o caso de teste é muito preciso para o idioma.fonte
Lua, 350 bytes
Eu acho que há duas maneiras de jogar ainda mais:
Eu poderia fazer uso de
macro.define
para substituir algumas expressões comuns (não posso testar agora e não tenho certeza se isso me faria ganhar alguns bytes)Use divisão no ponto em vez de iterar em toda a cadeia. Mais uma vez, não tenho certeza se isso reduziria o tamanho dessa função, pois manipular string em lua é bastante doloroso.
Explicações
Você pode testar o lua online e usar o seguinte código-fonte para executá-lo com alguns casos de teste
fonte
C, 253 bytes
Nota:
putchar(8)
deve executar um backspace.Detalhado , tente aqui
fonte
sed,
136128 bytesReduzido em 8 caracteres, largando espaços e inútil
0
.Casos de teste:
fonte
JavaScript (ES7), 114 bytes
Funciona com números arbitrários de comprimento, porque usa manipulação de strings por toda parte.
Sem a compreensão da matriz (122 bytes):
Ungolfed:
fonte
R - 133 bytes
Robusto, ignora o Machine Epsilon e funciona também com zeros à direita.
a) Golfe:
Ungolfed:
Uso:
fonte