O "primo sapo" é um animal estranho que salta entre números inteiros, até chegar aos 3 ou 19 anos ...
Seu programa deve aceitar um número inteiro n
como entrada e gerar o resultado do algoritmo abaixo ( 3
ou 19
).
Para um dado inteiro n >= 2
:
- Let
f
Ser a posição do sapo. É inicialmente definido comon
- se
f = 3
ouf = 19
: o sapo para de pular - interrompe o programa e a saídaf
. - se
f
for primo: o sapo pula para a posição2×f-1
. Volte para a etapa 2. - se
f
for composto:d
sejaf
o maior divisor principal de s. O sapo pula para a posiçãof-d
. Volte para a etapa 2.
Exemplos:
Um exemplo com n = 5
:
5 > 9 > 6 > 3 stop
O programa deve sair 3
.
Outro exemplo com n = 23
:
23 > 45 > 40 > 35 > 28 > 21 > 14 > 7 > 13 > 25 > 20 > 15 > 10 > 5 > 9 > 6 > 3 stop
Novamente, o programa deve sair 3
.
Casos de teste:
10 => 3
74 => 19
94 => 3
417 => 3
991 => 19
9983 => 19
Você pode assumir 1 < n < 1000000
(verifiquei o programa termina para esses valores).
3
ou19
, poderíamos alterar o item 2. no algoritmo para dizer que, se o sapo entrou em qualquer loop (encontrou uma posição que já havia visto antes), ele interrompe o salto e retorna o menor membro desse loop.Respostas:
Python 2 ,
101939290888785 bytesExperimente online!
fonte
while~16&n!=3
salva um byte.~16&n-3
até funciona!C (gcc),
8765 bytesExperimente online!
Explicação:
Versão portátil (72 bytes):
Experimente online!
Com nomes de variáveis mais apropriados:
Experimente online!
fonte
Retina ,
6362 bytesAgradecemos a Neil por economizar 1 byte.
Experimente online!
Entrada e saída em unário (o conjunto de testes usa decimal por conveniência). Essa solução fica incrivelmente lenta para entradas maiores. O
9983
caso de teste atinge o tempo limite no TIO.Explicação
Devido a isso
{
, os dois estágios do programa são simplesmente executados em um loop até que não afetem mais a string. Alternamos entre um estágio de processamento de compósitos e um estágio de processamento de primos. Isso nos permite evitar uma condicional real (que realmente não existe na Retina). Se o valor atual for do tipo errado para o estágio, o estágio simplesmente não fará nada.Isso processa compostos. Combinamos um divisor em potencial com
(11+)
, mas depois verificamos que ele não é composto(?<!^\2+(11+))
, portanto, consideramos apenas os fatores primos. Devido à ganância+
, isso prioriza o maior fator. Em seguida, verificamos que esse divisor em potencial é um divisor real , tentando combinar o restante da string com repetições(?=\1+$)
. Esse divisor é simplesmente removido da string, e é assim que você subtrai algo em unário.Este processo inicia, exceto 3 e 19 . O lookahead negativo garante que a entrada não seja composta, nem 3 e nem 19 . Em seguida, combinamos um único
1
e substituí-lo por toda a cadeia. Esta é uma forma unária de computação n - 1 + n , que obviamente é 2n-1 .Quando atingimos 3 ou 19 , nenhum estágio pode corresponder à corda e ela não será mais alterada.
fonte
1$'
o mesmo que$_
?Casca , 15 bytes
Experimente online!
Explicação
fonte
Gelatina , 12 bytes
Experimente online!
Como funciona
fonte
Língua Wolfram (Mathematica) , 65
66.68bytesExperimente online!
Inspirado pela dica . Basicamente, apenas recria o algoritmo.
//.
éRepeatedReplace
e/;
éCondition
. Portanto, o código substituirái_
(uma única quantidade) porIf[PrimeQ@i,2i-1,i-#&@@Last@FactorInteger@i]
, até seri!=3&&!=19
avaliadoTrue
.Referência:
fonte
10000000010
porquemaximum number of iterations is 2^16 (= 65536)
#//.i:Except[3|19]:>If[PrimeQ@i,2i-1,i-#&@@Last@FactorInteger@i]&
05AB1E ,
191817 bytesExperimente online!
Explicação
fonte
<ë
JavaScript (ES6),
737169 bytesCasos de teste
Mostrar snippet de código
Formatado e comentado
fonte
57%n
e emn%38
vez den==3|n==19
. Salvei 1 byte na minha resposta Java também, então obrigado!Geléia ,
2319 bytes-4 bytes de milhas . Ainda mais do que 05AB1E, no entanto.
Experimente online!
fonte
Ḥ’$_Æf$ÆP?Ṫµḟ3,19$¿
usando um loop while e algumas reordenaçõesPython 2 ,
110105103101 bytes-2 bytes graças a @Lynn
Experimente online!
Python 2 ,
116112105 bytesExperimente online!
fonte
…n*(n&~16==3)or…
economiza 2 bytes.MATL ,
2221 bytesObrigado a @ Giuseppe por remover 1 byte!
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Haskell - 154 bytes
Provavelmente faltando alguns truques de golfe aqui, esta é minha primeira tentativa no haskell golf.
fonte
1>0
naTrue
maioria das vezes, mas geralmente pode ser melhor usar uma tarefa, por exemploc<-z n
.[x|x<-[b-1,b-2..1],rem b x==0]
também é curto quereverse[x|x<-[1..(b-1)],b
remx==0]
.Neim ,
1716 bytesExplicação:
Experimente online!
fonte
Números R + ,
10299 bytesExperimente online!
R não é conhecido por embutidos curtos, e até os pacotes seguem o exemplo!
fonte
Java 8,
14013513494 bytes-5 bytes convertendo o método Java 7 recursivo em Java 8 lambda com loop.
-1 byte implícito graças à resposta JavaScript de @Arnauld alterando
n!=3&n!=19
ereturn n;
para57%n>0
ereturn n%38;
.Eu acho que deveria ser possível de alguma forma combinar os dois loops e verificar sen
é um primo e obter o maior fator primo ao mesmo tempo, mas ainda não consigo descobrir (ainda). Portanto, esta será a versão inicial por enquanto.-40 bytes impressionantes graças ao @Nevay, fazendo o que eu não podia fazer: combinando os loops para verificar se há primos e o maior fator primo de uma só vez.
Explicação:
Experimente aqui (executa mesmo
999999
em menos de 1 segundo).fonte
n=>
vez den->
. E, às vezes, em letras minúsculas / maiúsculas. ;)n->{for(int f,t,m=0;57%n>0;n=f>n?2*n-1:n-m)for(t=n,f=1;f++<t;)for(;t%f<1;)t/=m=f;return n%38;}
Bash, 73 bytes
Experimente online! Modificado ligeiramente para funcionar no TIO.
Recursivamente chama seu próprio arquivo de script usando
$0
, oque não funciona no TIO porque deve ser executado como. Aceita entrada como argumento da linha de comando../filename.sh
Usa o mesmo truque de módulo que a resposta JS de @ Arnauld .
Casos de teste
fonte
Python 3 , 97 bytes
Experimente online!
fonte
Pitão , 19 bytes
Verifique todos os casos de teste!
A resposta Husk me inspirou a economizar 2 bytes (
,3 19
paraP57
).Como isso funciona
fonte
PowerShell ,
150126 bytesExperimente online! (aviso: lento para números maiores)
Método iterativo. O PowerShell não possui nenhum fator de fatoração principal incorporado, portanto, isso empresta o código da minha resposta no Prime Factors Buddies .
Primeiro é o nosso
for
loop. A configuração é definida$n
como o valor de entrada, e a condicional mantém o loop ativo desde que57%$n
seja diferente de zero (graças a Arnauld por esse truque). Dentro do loop, primeiro obtemos uma lista dos fatores primos de$a
(definido como$n
). Este é o código emprestado da Prime Factors Buddies. Se a entrada$a
já estiver pronta, isso retornará apenas$a
(importante mais tarde). Isso (potencialmente apenas$a
) é armazenado$d
.Em seguida é um
if
/else
condicional. Para aif
parte, verificamos se$n
é-in
$d
. Se for, isso significa que$n
é primo, então tomamos$n=2*$n-1
ou$n+=$n-1
. Caso contrário, é composto, portanto, precisamos encontrar o maior fator primo. Isso significa que temos de tomar o último[-1]
de$d
e subtrair que a partir de$n
com$n-=
. Isso funciona porque estamos retornando2
e, portanto, o último elemento de$d
já será o maior.Quando terminamos o loop, colocamos
$n%38
(novamente, graças a Arnauld) no pipeline e a saída está implícita.fonte
APL (Dyalog Unicode) ,
1139059 bytesExperimente online!
O TIO trabalha com valores de até ~ 3200. Testado no meu PC para o último caso de teste. Para testar no TIO, basta adicionarNão se aplica mais, obrigado a @ Adám por apontar que meu algoritmo de verificação de primalidade era muito ruim e por me fornecer uma substituição; também para os 23 bytes salvos.f value
na parte inferior do código.Editado para corrigir a contagem de bytes.
Como funciona
fonte
Axioma, 93 bytes
teste:
Haveria função de 68 bytes
mas para n = 57991 (se bem me lembro), o espaço de pilha é reservado.
fonte
Python 2 , 93 bytes
Porta da resposta do TFeld sem bibliotecas externas.
Experimente online!
fonte