Sequência de Kuznetsov
(I made the name up, don't bother with Wikipedia or Google)
Dado qualquer número n > 0
, vamos r
representar o reverso do número n
. Itere até que o resultado final seja zero, passando o resultado de cada iteração de volta para a função usando recursão ou uma metodologia de sua escolha, executando a operação abaixo:
- Se,
r > n
para essa iteração, o resultado forr % n
. - Se,
n > r
para essa iteração, o resultado forn % r
. - Se
n % r = 0
our % n = 0
, você encerra a iteração.
Pegue o resultado intermediário de cada execução e armazene-os em uma matriz para a resposta final. O número inicial n
não faz parte da sequência, nem é 0
; os exemplos devem tornar tudo um pouco mais óbvio.
Vamos percorrer um exemplo de onde n=32452345
.
54325423 % 32452345 = 21873078 # r > n, uses r % n
87037812 % 21873078 = 21418578 # r > n, uses r % n
87581412 % 21418578 = 1907100 # r > n, uses r % n
1907100 % 17091 = 9999 # n > r, uses n % r
9999 % 9999 = 0 # r % n = n % r = 0, terminated
Result: [21873078, 21418578, 1907100, 9999]
Outro exemplo n=12345678
:
87654321 % 12345678 = 1234575 # r > n, uses r % n
5754321 % 1234575 = 816021 # r > n, uses r % n
816021 % 120618 = 92313 # n > r, uses n % r
92313 % 31329 = 29655 # n > r, uses n % r
55692 % 29655 = 26037 # r > n, uses r % n
73062 % 26037 = 20988 # r > n, uses r % n
88902 % 20988 = 4950 # r > n, uses r % n
4950 % 594 = 198 # n > r, uses n % r
891 % 198 = 99 # r > n, uses r % n
99 % 99 = 0 # r % n = n % r = 0, terminated
Result: [1234575, 816021, 92313, 29655, 26037, 20988, 4950, 198, 99]
Um exemplo final n=11000
:
11000 % 11 = 0 # n % r = 0, terminated
Result: []
São as vitórias mais baixas em contagem de bytes do code-golf .
Respostas:
05AB1E , 11 bytes
Usa a codificação CP-1252 . Experimente online!
fonte
PowerShell v2 +, 89 bytes
Solução iterativa. Longo, porque não há uma maneira fácil de reverter uma matriz, por isso, a caracterizamos e a indexamos para trás para armazenar
$r
. Em seguida, um pseudo-ternário para retirar o módulo apropriado e guardar novamente$n
para a próxima rodada. No entanto, se o resultado for zero, significa que!($n...)
será$true
, então, emexit
vez de$n
. Os números são deixados no pipeline e (implicitamente) retornados como uma matriz, mas sem um pipeline de encapsulamento ou salvando os resultados em uma variável, o padrãoWrite-Output
adere a uma nova linha.Experimente online! (Sim, é sério.) O
PowerShell agora está no TIO! Você tem que dar-lhe um segundo ou dois, porque PowerShell é uma besta de inicialização, mas agora você, sim você , pode verificar PowerShell direito código no seu navegador!
fonte
Perl,
4338 + 1 = 39 bytesCorra com a
-n
bandeiraExperimente online! Inclui os dois exemplos não vazios.
Quadro explicativo
-n
: Envolve o programa inteiro nowhile(<>){ ... ;}
. Isso transforma o código acima para a seguinte linha:while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}
. Observe que um ponto-e-vírgula foi adicionado ao final$
, tornando-se agora uma instância da variável$;
. Na condição de umwhile
loop,<>
lê automaticamente uma linha de entrada e a salva na$_
variável. Então agora vamos ver o que o intérprete lê dentro dowhile
loop externo :Código original, salvo para a posteridade: 43 + 1 = 44 bytes
fonte
$%>$_?$%%$_:$_%$%
Você escolheu a$%
variável de propósito apenas para esta linha?Pitão,
1312 bytesGraças a @TheBikingViking.
Experimente online: Demonstração
Meu código antigo:
Experimente online: Demonstração
Explicação:
fonte
t.u|%F_S,s_<backtick>
. TesteGeléia ,
15 1413 bytesTryItOnline
Quão?
fonte
Geléia ,
1312 bytesEste é um link / função monádica que imprime em STDOUT.
Experimente online!
Como funciona
fonte
Python 2,
9287817361 bytesSolução recursiva:
Experimente online
Solução iterativa: (também 61 bytes )
Experimente online
fonte
while n:
. Caso contrário, você pode fazê-lo com 61 bytes .MATL , 16 bytes
Experimente online!
Explicação
fonte
PHP, 78 bytes
fonte
Lote, 140 bytes
Recebe entrada em STDIN e gera a sequência em linhas separadas. O lote possui instruções condicionais (que são um tanto detalhadas), mas nenhuma expressão condicional, portanto, é mais fácil (apesar de ter que citar os
%
) calcularr%n%r
(que é igual ar%n
sen<r
ou zero sen>r
) en%r%n
(que é igual an%r
sen>r
ou zero sen<r
) e adicionar eles juntos.fonte
Mathematica, 68 bytes
Graças a Greg Martin por sugerir que eu use, em
FixedPointList
vez deNestWhileList
:O mais curto possível com minha solução original
FixedPointList
foi 73 bytes:fonte
11000
). Você pode contornar isso mudando para a técnica descrita em seu último parágrafo. Mas não vejo como me livrarRest
ouMost
dessa maneira. Por outro lado,FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &
são apenas 68 bytes depois que os espaços são removidos (gera alguns erros, nbd).{a,b,c,d}[[2;;-4]]
daria um erro em vez da lista vazia (provavelmente usei uma vírgula em vez de;;
). Aprendi alguma coisa.Sort
:FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
JavaScript,
7270 bytesEditado:
-2 bytes : O operador de propagação aguarda a concatenação da string.
fonte
R,
126117 bytesInfelizmente, reverter um número (
as.double(paste(rev(el(strsplit(c(x,""),""))),collapse="")))
) é bastante prolixo. Descansar é bem fácil. Usasort
para verificar indiretamente qual é mais alto.O resto é direto, continua em loop até
x=0
e imprime todas as etapas.fonte
C, 87 bytes
t
é temporário para reversão. O loop interno deslocar
1 dígito para a esquerda e adiciona o último dígito det
até que esteja esgotado. A saída ocorre após a primeira iteração e somente se for diferente de zero para impedir que o primeiro e o último item sejam exibidos.Ungolfed e uso:
fonte
Mathematica, 64 bytes
O código acima representa uma função pura que recebe uma única entrada e retorna a sequência kuznetsovs. O mais bonito do mathematica é que você pode colocar camadas e mais camadas de funções puras ... Permita-me explicar o código;)
Cada termo na própria sequência é calculado com a função abaixo, que recebe uma entrada e retorna o próximo termo.
O código
IntegerReverse@#
apenas gera r, o valor invertido. O código#2~If[#<=#2,Mod,#0]~#&
é uma função que recebe duas entradas e faz a operação mod, ou reverte as entradas e chama a si mesma novamente. Outra maneira de escrever éIf[#<=#2, Mod, #0][#2, #]&
ou pode ser escrita como uma função regular como esta:k[a_, b_] := If[a <= b, Mod, k][b, a]
fonte
Raquete 180 bytes
Ungolfed:
Teste:
Ouput:
fonte