Tarefa:
Dado um número inteiro no sistema de números decimais, reduza-o para um único dígito decimal da seguinte maneira:
- Converta o número em uma lista de dígitos decimais.
- Encontre o maior dígito, D
- Remova D da lista. Se houver mais de uma ocorrência de D, escolha a primeira da esquerda (na posição mais significativa), todas as outras devem permanecer intactas.
- Converta a lista resultante em um número decimal e multiplique por D.
- Se o número for maior que 9 (tem mais de 1 dígito decimal), repita todo o procedimento, inserindo o resultado nele. Pare quando você obtiver um resultado de um dígito.
- Exibe o resultado.
Exemplo:
26364 ->
1. 2 6 3 6 4
2. The largest digit is 6, so D=6
3. There are two occurrences or 6: at positions 1 and 3 (0-based). We remove the left one,
at position 1 and get the list 2 3 6 4
4. we convert the list 2 3 6 4 to 2364 and multiply it by D:
2364 * 6 = 14184
5. 14184 is greater than 9 so we repeat the procedure, feeding 14184 into it.
Continuamos repetindo o procedimento para 14184 e assim por diante e passamos pelos seguintes resultados intermediários, chegando finalmente a 8:
11312
3336
1998
1782
1376
952
468
368
288
224
88
64
24
8
Portanto, o resultado para 26364 é 8.
Entrada: um número inteiro / uma sequência que representa um número inteiro
Saída: um único dígito, o resultado da redução aplicada ao número.
Casos de teste:
9 -> 9
27 -> 4
757 -> 5
1234 -> 8
26364 -> 8
432969 -> 0
1234584 -> 8
91273716 -> 6
Isso é código-golfe , então as respostas mais curtas em bytes em cada idioma vencem.
code-golf
arithmetic
integer
Galen Ivanov
fonte
fonte
10 -> 10
?Respostas:
05AB1E , 6 bytes
Código:
Usa a codificação 05AB1E . Experimente online!
Explicação
fonte
JavaScript (ES6), 49 bytes
Recebe entrada como uma representação de seqüência de caracteres de um número inteiro, como
f("26364")
.Casos de teste
Mostrar snippet de código
fonte
Gelatina , 13 bytes
Experimente online!
-1 graças a um truque que encontrei na resposta de Jonathan Allan .
Programa completo.
fonte
Pitão , 16 bytes
Recebe entrada como uma String. Experimente aqui! (Alternativa:
.WtH`*s.-ZeSZseS
)Pitão , 18 bytes
Recebe a entrada como um número inteiro. Experimente aqui!
Como funciona
16 byter
18 byter
Estar tão próximo de Jelly nesse tipo de desafio é muito bom para Pyth IMO :-)
fonte
Casca ,
141312 bytesObrigado Zgarb por economizar 1 byte.
Experimente online!
Explicação:
fonte
R ,
99bytes 95Experimente online!
Uma função recursiva. A adição
f(number)
no rodapé pode ser usada para testar outros valores denumber
. Implementação direta,d
é a lista de dígitos e10^(n:2-2)%*%d[-M]
calcula o número com o maior dígito removido.fonte
Python 2 , 72 bytes
Experimente online!
fonte
432969
. "ValueError: literal inválido para int () com base 10: ''"n
fosse 0,n*(n<=9)
ele ainda seria avaliado como um valor falso, 0, fazendo a recursão continuar e causando um erro, enquanto a string'0'
é um valor verdadeiro e, portanto, a recursão é interrompida.Ruby , 59 bytes
Experimente online!
Função lambda recursiva chamada like
f[26364]
.fonte
Gelatina , 15 bytes
Experimente online! ou veja a suíte de testes .
Quão?
fonte
Haskell ,
706766 bytesGuardado
34 bytes graças a nimi!Experimente online!
fonte
until
. Experimente online! ....span=<<(>).maximum...
.C # (.NET Core) , 126 bytes
Experimente online!
fonte
if(n<10)return n;...return F(...);
a um único retorno com ternário-se, assim:int F(int n){var x=(n+"").ToList();var m=x.Max(d=>d);x.RemoveAt(x.IndexOf(m));return n<10?n:F(int.Parse(string.Concat(x))*(m-48));}
( 131 bytes )using System.Linq;
(18 bytes) no bytecount.APL (Dyalog) ,
363533 bytes-1 devido a especificações de OP atualizadas. -2 graças a ngn.
Função de prefixo tácito anônimo. Leva inteiro como argumento.
Experimente online!
{
…}
Uma função em que⍵
está o argumento:⍵>9:
se o argumento for maior que 9, então:⍕⍵
formatar (stringify) o argumento⍎¨
executar (avaliar) cada um (isso nos dá os dígitos como números)(
…)
Aplique a seguinte função tácita naqueles⌈/
o maior dígito×
vezes10⊥
a decodificação de base 10 de (coleta dígitos)⊂
todos os dígitos⌷⍨¨
indexado por cada um⍳∘≢
os i ndices do número de dígitos≠
é diferente de⊢⍳⌈/
o maior de dígitos i NDEX em toda a lista de dígitos∇
recursar (ou seja, chamar a si próprio)⋄
outro⍵
retornar o argumento não modificadofonte
>10
ser>9
?>9
salvaria um byte.Perl 6 ,
4541 bytesTeste-o
Teste-o
Expandido:
fonte
Retina , 67 bytes
Experimente online! O link inclui os casos de teste com rapidez suficiente para não prejudicar o servidor de Dennis. Explicação:
Para números de dois dígitos, isso duplica o número com um
;
separador, prefixando 1 para a duplicata. Para números de um dígito, esse prefixo1;
é o número.Classifique os dígitos da duplicata. (Para números de um dígito, isso não tem efeito.)
Encontre a primeira ocorrência do dígito maior e exclua-o, e também os outros dígitos na duplicata e o 1 extra que foi adicionado anteriormente. (Para números de um dígito, a correspondência falha, então isso não faz nada.)
Multiplique o número pelo dígito. Para números de um dígito, isso resulta no número original e o loop termina. Caso contrário, o programa será repetido até que um único dígito seja alcançado.
fonte
C # (.NET Core) ,
177164 + 18 bytesGuardado 13 bytes graças a @raznagul!
Experimente online!
fonte
s.Length<2
paran<10
. Além disso, você pode remover o operador ternário ereturn f(y)
no final, pois o caso é tratadoif
na próxima etapa da recursão.Java 8,
126104 bytes-22 bytes graças a @ OlivierGrégoire .
Explicação:
Experimente aqui.
fonte
n>9
e reverta as condições em vez den<10
).Jq 1.5 , 86 bytes
Expandido
Experimente online!
fonte
Perl 5 , 41 + 1 (
-p
) = 42 bytesExperimente online!
fonte
9
. :( mas consertou um pouco e conseguiu obter 41 bytes com uma correção: Experimente online!Lua,
137108 bytesAgradecimentos a Jonathan S por jogar fora 29 bytes.
Experimente online!
fonte
D ,
188186185 bytesExperimente online!
Eu odeio tanto a avaliação preguiçosa. Todas as dicas são bem-vindas!
fonte
Lua, 154 bytes
Eu deveria ter algumas maneiras de jogar isso, estou experimentando agora.
Experimente online!
Explicações
fonte
PowerShell , 123 bytes
Experimente online!
Ooof. As matrizes do PowerShell são imutáveis; portanto, precisamos usar a
[Collections.ArrayList]
conversão longa aqui para podermos ligar.remove()
mais tarde.Recebe entrada
$args
, converte-a em uma string, depois emchar
-array e, em seguida, em umArrayList
. Armazena isso em$a
. Em seguida, fazemos umwhile
loop até estarmos abaixo ou abaixo9
. A cada iteração, estamos chamando.remove
o maior elemento de$a
(feitosort
e recebendo o último elemento[-1]
), armazenando o maior elemento$b
ao mesmo tempo. Isso funciona porque os valores ASCII são classificados da mesma maneira que os dígitos literais.Em seguida, recalculamos
$a
, novamente como umachar
matriz -e (ArrayList
implicitamente), convertendo nossa$b
(que atualmente é achar
) para uma string, depois um int com+
e multiplicando isso para$a
-join
ed em uma string (implicitamente convertida em int). Isso satisfaz a parte "multiplicar por D" do desafio.Finalmente, uma vez que estamos fora do circuito, colocamos
$a
no pipeline e a saída está implícita.fonte
Pip ,
2221 bytesRecebe entrada como um argumento de linha de comando. Verifique todos os casos de teste: Experimente online!
Explicação
Ungolfed, com comentários:
Na versão golfed, o corpo do loop é condensado em uma única expressão:
fonte
C
103,95, 90 bytesExperimente online!
fonte
Java 8: 115 bytes
-10 bytes graças a Jo King
Infelizmente, você não pode chamar uma função lambda recursivamente, portanto, são necessários 11 bytes extras para o cabeçalho do método. Estou ciente de que há uma resposta Java mais curta que faz um loop, mas decidi criar isso sozinha.
Experimente online
fonte
-48
do mapa para o final dam
definição. Experimente online! Você também tem um espaço em branco extra no seu link TIOJ, 40 bytes
Experimente online!
explicação
fonte
PowerShell , 230 bytes
Experimente online!
Desperdiçou demais com todo o tipo de elenco.
fonte
PHP,
8277 + 1 bytesExecute como pipe
-nR
ou experimente online .fonte
dc ,
9885 bytesMuito obrigado a esta resposta pela idéia de utilizar
~
na extração de dígitos de um número, resultando em dois bytes salvos sobre a versão original do código.Este foi um pouco para concluir em
dc
com seus recursos inexistentes de manipulação de strings.Experimente online!
fonte
Bash, 80 bytes
Usa os pacotes Utilitários Principais (para
sort
etail
) egrep
.Como funciona?
fonte