A "formiga principal" é um animal obstinado que navega pelos números inteiros e os divide até restarem apenas números primos!
Inicialmente, temos uma matriz infinita A contendo todos os números inteiros> = 2: [2,3,4,5,6,.. ]
Let p
Ser a posição da formiga na matriz. Inicialmente, p = 0
(a matriz é indexada em 0)
A cada turno, a formiga se moverá da seguinte maneira:
- se
A[p]
for primo, a formiga passa para a próxima posição:p ← p+1
- caso contrário, se
A[p]
for um número composto,q
seja seu divisor menor> 1. DividimosA[p]
porq
e adicionamosq
aA[p-1]
. A formiga se move para a posição anterior:p ← p-1
Aqui estão os primeiros movimentos da formiga:
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 7 3 7 8 9 ...
^
Seu programa deve exibir a posição da formiga após os n
movimentos. (você pode assumir n <= 10000
)
Casos de teste:
0 => 0
10 => 6
47 => 9
4734 => 274
10000 => 512
Editar. você também pode usar listas indexadas em 1; é aceitável exibir os resultados 1, 7, 10, 275, 513 para o caso de teste acima.
Isso é código-golfe, então o código com o código mais curto em bytes vence.
n
(ou se o caso composto poderia empurrar a formiga para a esquerda da inicial2
).1,7,10,275,513
se a indexação 1 for declarada? Ou eles ainda precisam corresponder às suas saídas.Respostas:
Alice , 45 bytes
Experimente online!
Implementação principalmente direta.
Os
n
tempos de looping em Alice normalmente são feitos pressionando umn-1
horário de endereço de retorno e retornando no final de cada iteração comk
. Na última vez em que o loop ék
transmitido , a instrução não tem para onde retornar e a execução prossegue.Este programa usa a mesma
k
instrução para parar mais cedo quando o número for primo. Como resultado, a iteração final sempre moverá a formiga para a esquerda. Para compensar esse bug, fazemosn+1
iterações em uma matriz indexada em 1, que fornece exatamente o resultado que queremos (e fornece o cason=0
de graça).fonte
Python 2 , 120 bytes
Experimente online!
Ah, o raro
for
-else
laço! Aelse
cláusula é executada apenas se ofor
corpo não for retirado viabreak
. No nosso caso, isso significa que verificamos todos osq
se não encontramos nenhum deles para dividirp
.fonte
Oitava ,
109 103 10194 94 bytesExperimente online!
Este código produzirá a posição na indexação 1, portanto, as saídas para casos de teste são:
Esta versão usa algumas otimizações do Octave, portanto não é compatível com o MATLAB. O código abaixo é uma versão compatível com MATLAB.
MATLAB,
130 123 118117 bytesUsa a indexação 1 como na versão Octave. Eu testei em todos os casos de teste no MATLAB. Como exemplo, a saída em 100000 é 3675 (uma indexação).
Uma versão comentada do código acima:
Por uma questão de interesse, essas são as posições das formigas versus o número de iterações para os primeiros 10000 valores de n.
Parece provável que a formiga provavelmente tenderá ao infinito, mas quem sabe a aparência pode enganar.
for
vez dewhile
e removendo colchetes deif
- Obrigado @ Giuseppe\=
e+=
operações - Obrigado @ Giuseppei++
ei--
- Obrigado @LuisMendofonte
end
para coincidir com a função de assinaturaend
é opcional.end
é opcional no Octave. Aqui só é necessária porque você tem o código após a funçãoJavaScript (ES6), 91 bytes
Demo
Nota: pode ser necessário aumentar o tamanho da pilha padrão do seu mecanismo para que ele passe em todos os casos de teste.
Experimente online!
fonte
Haskell ,
10810694 bytesExperimente online! Exemplo de uso:
([0]#[2..]!!) 10
rendimentos6
(indexado 0).A função
#
opera em duas listas, a frente invertida da matriz[p-1, p-2, ..., 1]
e o resto infinito da matriz[p, p+1, p+2, ...]
. Ele constrói uma lista infinita de posições, a partir da qual an
quinta posição é retornada, dada uma entradan
.O padrão
((a:b)#(p:q))
se ligap
ao valor da posição atual da formiga ea
ao valor da posição anterior.b
é o prefixo da matriz da posição 1 parap-2
eq
o resto infinito começando da posiçãop+1
.Construímos uma lista de chamadas recursivas da seguinte maneira: Observamos cada divisor
d
dep
(que é maior que um e menor quep
) em ordem crescente e adicionamosb#(a+d:div p d:q)
para cada um deles, ou seja, o valor atualp
é dividido pord
e a formiga se move um passo à esquerda em qued
é adicionadoa
. Em seguida, anexamos(p:a:b)#q
ao final desta lista, que indica a formiga se movendo um passo para a direita.Em seguida, pegamos a primeira dessas chamadas recursivas da lista e acrescentamos a posição atual, que coincide com o tamanho da lista de prefixos
b
. Como os divisores estão em ordem crescente, escolher o primeiro da lista de chamadas recursivas garante que usamos o menor. Além disso, como(p:a:b)#q
é adicionado ao final da lista, ele é selecionado apenas se não houver divisores e,p
portanto, é primo.Edita:
-2 bytes, alternando a lista de funções de ordem decrescente para crescente.
-12 bytes, graças à idéia de Zgarb de indexar em uma lista infinita, em vez de manipular um contador e alternar para a indexação 0.
fonte
TI-BASIC,
10810310298 bytesEntrada e saída são armazenadas em
Ans
. A saída é indexada em 1.fonte
fPart(∟A(P)/F:
comfPart(F¹∟A(P:
. A mesma coisa na próxima linha.not(fPart(7⁻¹7
é 0, masnot(fPart(7/7
é 1.MATL , 41 bytes
A saída é baseada em 1. O programa atinge o tempo limite para o último caso de teste no intérprete online.
Experimente online!
Explicação
O programa aplica o procedimento conforme descrito no desafio. Para fazer isso, faz uso extraordinariamente pesado das pranchetas manuais e automáticas do MATL.
O menor divisor é obtido como a primeira entrada na decomposição do fator primo.
A actualização de "clivagem" é feito através da substituição da entrada correspondente da matriz Uma . A atualização "add" é feita adicionando-se a A um elemento que contém zeros, exceto na posição desejada.
fonte
Pitão - 44 bytes
Implementação processual direta.
Conjunto de Teste .
fonte
PARI / GP, 87 bytes
Bastante auto-explicativo (nem tanto assim). Se você não contar a
f(n)=
parte, isso é 82 bytes. Você também pode começar porn->
(85 bytes).É um idioma indexado 1.
Edit: A modificação
illustrate(n,m)=A=[2..m+1];p=1;for(i=1,n,for(j=1,m,printf("%5s",if(j==p,Str(">",A[j],"<"),Str(A[j]," "))));print();q=factor(A[p])[1,1];if(A[p]!=q,A[p]/=q;p--;A[p]+=q,p++))
imprimirá uma ilustração da caminhada da formiga (dado um terminal suficientemente amplo). Por exemplo,illustrate(150,25)
você fornecerá as primeiras 150 etapas em 25 colunas, assim:fonte
Python 2 ,
142127 bytesExperimente online!
fonte
P(n)
n<=4
Mathematica,
118103 bytesExperimente online!
Martin Ender salvou 15 bytes
fonte
Divisors
, pode usar a notação infix paraDo
e pode simplesmente retornar emt
vez det-1
(resultado baseado em 1).Python 3 ,
158149133 bytesEsta é uma implementação processual direta com uma ou duas peculiaridades para garantir que o código funcione para todos os casos de teste. Eu uso
[*range(2,n+9)]
para garantir que A seja grande o suficiente (exceton<3
,n+9
é mais que suficiente). Aelse
cláusula divide o antigoA[p]
pord
, diminuip
e depois adicionad
ao novoA[p]
, o que é definitivamente uma prática ruim de codificação. Caso contrário, bem direto. Sugestões de golfe são bem-vindas!Edit: -9 bytes sem
sympy
agradecimentos a Halvard Hummel. -14 bytes de Felipe Nardi Batista, -6 bytes de algumas pistas da resposta Python 2 de Jonathan FrechExperimente online!
fonte
if d-m:A[p]...
eelse:p+=1
salvar um byteelse
instruçãoelse
declaração, não há diferença em bytes para a versão funçãoPHP, 102 + 1 bytes
Execute como pipe
-R
ou experimente online .Saída vazia para entrada
0
; inserir+
depoisecho
para um literal0
ou use esta versão indexada em 1 (103 + 1 bytes):
fonte
R , 123 bytes
Uma implementação direta. É fornecida como uma função, que recebe o número de movimentos como entrada e retorna a posição p.
Ele percorre a sequência e move o ponteiro para frente e para trás de acordo com as regras. A saída é baseada em 0.
Uma observação: para encontrar o menor fator primo de um número x, ele calcula o módulo de x em relação a todos os números inteiros de 0 a x. Em seguida, extrai os números com módulo igual a 0, que são sempre [0,1, ..., x]. Se o terceiro número não for x, então é o menor fator primo de x.
Experimente online!
fonte
C (gcc),
152148 bytesMinificado
Formado com alguns comentários
Função principal para teste
Para mostrar cada passo
Declarar display () dentro de f ()
Tela de ligação()
Tela de ligação()
fonte
Clojure, 185 bytes
Ai, editar um "estado" não é ideal no Clojure. Você precisará aumentar o expoente para entradas maiores.
fonte
loop
? Você poderá perder alguns bytes sem isso.first
coisa para umasome
declaração.recur
duas vezes, uma para cadaif-let
ramo. Também(dec i)
seria duplicado.some
precisa de um predicado, eu poderia usar,+
pois estamos lidando com números, mas esse é um caractere maior quefirst
. CMIIWJava 8,
138135 bytesExplicação:
Experimente aqui.
fonte
Clojure,
198193191 bytesIsso precisa ser severamente jogado ...
Golfe 1 : salvou 5 bytes mudando
(first(filter ...))
para(some ...)
Golf 2 : salvou 2 bytes mudando
(zero? ...)
para(= ... 0)
Uso:
Código não destruído:
fonte