Quando eu era criança, e queria contar as notas de dólar em minhas economias, eu contava em voz alta:
um dois três quatro cinco seis sete oito nove dez;
onze, doze, treze, quatorze, quinze, dezesseis, dezessete, dezoito, dezenove, vinte;
vinte e um, vinte e dois, vinte e três, vinte e quatro, vinte e cinco ...
Por fim, cansei de pronunciar cada um desses números com várias sílabas. Sendo matemático, criei um método muito mais eficiente de contar:
um dois três quatro cinco seis sete oito nove dez;
um, dois, três, quatro, cinco, seis, sete, oito, nove, vinte;
um, dois, três, quatro, cinco, seis, sete, oito, nove, trinta ...
Como você pode ver, eu pronunciaria apenas os dígitos que foram alterados em relação ao número anterior. Isso tem a vantagem adicional de ser consideravelmente mais repetitivo do que os nomes em inglês para números e, portanto, requer menos inteligência para ser computado.
Desafio
Escreva um programa / função que receba um número inteiro positivo e produza / retorne como eu contaria: ou seja, o dígito diferente de zero e o zero à direita.
Exemplos
1 1
2 2
10 10
11 1
29 9
30 30
99 9
100 100
119 9
120 20
200 200
409 9
1020 20
Uma lista completa de casos de teste não deve ser necessária. Este é o A274206 no OEIS.
Regras
- Teoricamente, sua entrada deve funcionar para todos os números inteiros positivos, ignorando problemas de precisão e memória.
- A entrada e a saída devem estar em decimal.
- Você pode optar por receber entrada e / ou saída como um número, uma sequência ou uma matriz de dígitos.
- A entrada é garantida como um número inteiro positivo. Sua entrada pode fazer qualquer coisa para entrada inválida.
Isso é código-golfe , então o código mais curto em bytes vence.
[1,0,2,0]
->[2,0]
para o último caso de teste? (Não estou claro na frase "matriz de item único").Respostas:
Python 2 , 28 bytes
Experimente online!
Uma fórmula recursiva funciona muito bem. Se o último dígito for diferente de zero, faça a saída. Caso contrário, remova o zero final, calcule a saída para isso e multiplique por 10.
fonte
Gelatina ,
63 bytes-3 bytes, tendo E / S como uma lista decimal de dígitos .
Conjunto de testes em Experimente online!
Quão?
Se não pudéssemos obter listas decimais, um byter de 6 é:
Que você pode ver aqui .
Isso faz a mesma coisa, mas converte um número inteiro em uma lista decimal anteriormente e depois converte novamente em um número inteiro.
fonte
C,
302927 bytesOrgulhoso disso, porque eu abusei de dois exploits C para melhorar isso (descrito no final do post); Isto é especificamente para C (GCC)
3)
b=10;f(a){a=a%b?:b*f(a/b);}
// 27 bytes2)
// 29 bytesb;f(a){b=a=a%10?:10*f(a/10);}
1)
// 30 bytesf(i){return i%10?:10*f(i/10);}
Experimente online (versão de 27 bytes)
Primeira tentativa (30 bytes): Abusa do fato de que, no GCC, se nenhum valor for declarado em nível ternário, o valor condicional será retornado. Por isso, meu operador ternário está em branco para o valor de retorno da verdade.
Segunda tentativa (29 bytes): Abusa do bug de memória no GCC, onde, até onde eu entendi, se uma função não tem valor de retorno, quando mais de duas variáveis foram utilizadas significativamente na função, o último valor definido da primeira variável de argumento será retornado.
(Editar: mas esse "valor definido" deve ser definido de determinadas maneiras, por exemplo, definir uma variável com
=
ou+=
funciona, mas configurá-la com%=
não funciona; estranho)Terceira tentativa (27 bytes): Como devo utilizar de maneira significativa a segunda variável (b) para abusar adequadamente do erro de memória mencionado acima, também posso usá-lo como uma variável real para "10" para substituição.
(Nota: Eu deveria ser capaz de trocar
a=a%b
coma%=b
para salvar outro byte mas infelizmente isso faz com que o bug de memória explorar acima para stop "de trabalho", então eu não posso)fonte
Retina ,
76 bytesExperimente online (todos os casos de teste)
Correspondências de saída de um dígito seguidas por zeros no final da sequência de entrada. Embora não seja obrigatório, isso também funciona
0
.fonte
[1-9]
(ou[^0]
) seria necessário em vez de\d
. Eu acho que a ganância*
garante sempre a saída correta.*
mas com o fato de que as correspondências são pesquisadas da esquerda para a direita.\d0*?$
também funcionaria..0*$
deve funcionar # 12.0*
Cubix , 18
32bytesAcho que vou ter que gastar algum tempo nisso mais tarde e ver se consigo comprimir um pouco. Mas, por enquanto, aqui está.Acontece que eu estava pensando sobre isso totalmente da maneira errada. Agora, o processo aplica incrementalmente um mod (1,10,100,1000, ...) ao número inteiro de entrada e imprime o primeiro que não é zero. Um pouco mais chato, mas mais curto.
Experimente aqui
fonte
JavaScript, 21 bytes
Casos de teste
Mostrar snippet de código
fonte
Javascript
1918 bytesGraças à ETHproductions por jogar fora um byte e Patrick Roberts por jogar fora dois bytes
Retorna uma matriz de cadeias que corresponde ao regex de estar no final da cadeia de entrada com qualquer caractere seguido pelo maior número possível de zeros.
Experimente Online
fonte
g
, pois há apenas uma partida para encontrar.x=>x.match`.0*$`
Bash + coreutils, 12
Experimente online .
fonte
Grime , 5 bytes
Experimente online!
Explicação
fonte
Braquilog , 2 bytes
Experimente online!
O sufixo interno
a₁
, para números inteiros, é implementado como:O Brachylog gosta de poder tratar números inteiros como listas de dígitos e, para isso, usa o predicado de utilitário personalizado
integer_value/2
. O interessanteinteger_value/2
aqui é que, como ele deve ser capaz de traduzir corretamente uma lista de dígitos com zeros à esquerda, ele também pode traduzir um número inteiro para uma lista de dígitos com zeros à frente, portanto predicados que não querem que isso acontecem (a maioria deles, especialmente os que não são do tipo eternoa
) proíbem que as cabeças de suas listas de dígitos sejam 0. Portanto, emboraa₁
gere os sufixos mais curtos primeiro para listas e seqüências de caracteres, ignora qualquer sufixo de um número inteiro com um 0 inicial, que em Além de remover duplicatas, também significa que o primeiro sufixo gerado é o dígito diferente de zero à direita com todos os zeros à direita.fonte
Flacidez Cerebral , 74 bytes
Experimente online!
Imprime apenas o último não-0 e todos os 0s à direita.
Explicação:
fonte
Vim, 19 bytes
Duas versões, ambas com 19 bytes:
Além de um retorno de carro à direita em cada um.
Verifique todos os casos de teste online! (Um byte adicionado para testar em várias linhas)
fonte
TI-Basic, 18 bytes
fonte
R, 33 bytes
Implementado como uma função sem nome
Isso aplica um mod de 10 ^ 0 a 10 ^ 99.
rle
é usado para reduzir os resultados, para que o segundo item seja sempre o resultado que queremos.Experimente online!
fonte
Zsh ,
1816 bytesExperimente online!Experimente online!Bash , 25 bytes
Experimente online!
Os shells precisam chamar programas externos para usar o regex, então temos que nos contentar com globbing.
A
${1%[^0]*}
expansão corresponde ao sufixo mais curto, começando com um caractere diferente de zero, e o remove.(M)
sinalizador faz com que o sufixo correspondente seja mantido em vez de removido.${1% }
expansão remove como prefixo o que resta.fonte
GNU sed ,
1714 + 1 (sinalizador r) = 15 bytesEdit: 2 bytes a menos, graças a Riley
Ele funciona excluindo tudo até o dígito diferente de zero, à direita, que é impresso juntamente com os zeros à direita existentes. O script pode manipular vários testes em uma execução, cada um em uma linha separada.
Experimente online! (todos os exemplos de teste)
fonte
Mathematica, 26 bytes
Função pura que pega uma lista de dígitos e gera uma lista de dígitos:
Explicação
Isso funciona, pois encontra a correspondência mais à esquerda para
x
, que deve ser o elemento diferente de zero à direita da lista, pois é seguida por uma sequência de zero ou mais0
se o final da lista.fonte
Java 8, 47 bytes
esta é uma expressão lambda atribuível a
IntUnaryOperator
:explicação: multiplique m por 10 até que
x%m
não seja 0.return x%m*m/10
requer a divisão porque m é uma ordem de magnitude maior que o resultado desejado.fonte
Perl 6 , 10 bytes
Solução regex trivial. Insere e gera um número.
fonte
MATL ,
107 bytes3 bytes salvos graças a @B. Mehta!
Entrada e saída são uma matriz de dígitos.
Experimente online!
Ou verifique todos os casos de teste .
Explicação
fonte
48-
3 bytes inteiros, economizando: Experimente online!C #,
3028 bytesCom base nesta resposta JavaScript , suponho que todos os créditos sejam para ele.
Golfe
()
ao redora
graças a Emignafonte
i
para que isso funcione enquanto você está usando a recursão.i
, não será declarado para a chamada recursiva).a
não são necessários de qualquer maneira.J, 27 bytes
É baseado na fórmula do xnor, então credita a ele.
fonte
Kotlin, 49 bytes
lambda, atribuível a
(List<Int>) -> List<Int>
it
emindexOfLast
..
para construção de faixasfonte
Perl 5, 12 bytes
11, mais 1 para em
-nE
vez de-e
fonte
05AB1E , 9 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
Japonês , 6 bytes
Experimente online!
fonte
Stax , 5 bytes
Execute e depure
Procedimento:
fonte
05AB1E , 4 bytes
E / S como uma lista de dígitos.
Experimente online ou verifique todos os casos de teste (o conjunto de testes contém uma junção para melhor legibilidade).
Explicação:
fonte
Pyke,
131110 bytesExperimente aqui!
11 bytes:
Experimente aqui!
13 bytes:
Experimente aqui!
fonte
Haskell 57 Bytes
fonte