¡La "hormiga principal" es un animal obstinado que navega por los enteros y los divide hasta que solo quedan números primos!
Inicialmente, tenemos una matriz infinita A que contiene todos los enteros> = 2: [2,3,4,5,6,.. ]
Deje p
ser la posición de la hormiga en la matriz. Inicialmente p = 0
(la matriz está indexada en 0)
Cada turno, la hormiga se moverá de la siguiente manera:
- si
A[p]
es primo, la hormiga se mueve a la siguiente posición:p ← p+1
- de lo contrario, si
A[p]
es un número compuesto,q
sea su divisor más pequeño> 1. DividimosA[p]
entreq
y sumamosq
aA[p-1]
. La hormiga se mueve a la posición anterior:p ← p-1
Aquí están los primeros movimientos para la hormiga:
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 ...
^
Su programa debería mostrar la posición de la hormiga después de los n
movimientos. (puedes asumir n <= 10000
)
Casos de prueba:
0 => 0
10 => 6
47 => 9
4734 => 274
10000 => 512
Editar. también puede usar listas indexadas 1, es aceptable mostrar los resultados 1, 7, 10, 275, 513 para el caso de prueba anterior.
Este es el código de golf, por lo que gana el código con el código más corto en bytes.
n
(o si el caso compuesto podría empujar la hormiga a la izquierda de la inicial2
).1,7,10,275,513
si se indica 1 indexación? O aún tendrían que coincidir con sus resultados.Respuestas:
Alice , 45 bytes
Pruébalo en línea!
Implementación principalmente directa.
Los
n
tiempos de bucle en Alice generalmente se realizan presionando losn-1
tiempos de una dirección de retorno y luego regresando al final de cada iteración conk
. La última vez a través del ciclo, lak
instrucción no tiene a dónde volver, y la ejecución continúa.Este programa usa la misma
k
instrucción para detenerse temprano cuando el número es primo. Como resultado, la iteración final siempre moverá la hormiga a la izquierda. Para compensar este error, hacemosn+1
iteraciones en una matriz indexada en 1, lo que da exactamente el resultado que queremos (y da el cason=0
de forma gratuita).fuente
Python 2 , 120 bytes
Pruébalo en línea!
Ah, el raro
for
-else
lazo! Laelse
cláusula solo se ejecuta si no se sale delfor
cuerpo a través de . En nuestro caso, esto significa que verificamos todos los correos electrónicos y no encontramos ninguno para dividir .break
q
p
fuente
Octava ,
10910310194 bytesPruébalo en línea!
Este código generará la posición en 1 indexación, por lo que las salidas para casos de prueba son:
Esta versión utiliza algunas optimizaciones de octava, por lo que no es compatible con MATLAB. El siguiente código es una versión compatible con MATLAB.
MATLAB,
130 123 118117 bytesUtiliza la indexación 1 como con la versión Octave. Lo probé en todos los casos de prueba en MATLAB. Como ejemplo, la salida en 100000 es 3675 (una indexación).
Una versión comentada del código anterior:
Como cuestión de interés, esta es la posición de las hormigas frente al número de iteraciones para los primeros 10000 valores de n.
Parece probable que la hormiga tenderá al infinito, pero quién sabe, la apariencia puede ser engañosa.
for
lugar dewhile
y eliminando corchetes deif
- Gracias @Giuseppe\=
y+=
operaciones - Gracias @Giuseppei++
yi--
- Gracias @LuisMendofuente
end
para que coincida con la firma de la funciónend
es opcional.end
es opcional en Octave. Aquí solo es necesario porque tiene código después de la funciónJavaScript (ES6), 91 bytes
Manifestación
Nota: es posible que deba aumentar el tamaño de pila predeterminado de su motor para que pase todos los casos de prueba.
Pruébalo en línea!
fuente
Haskell ,
10810694 bytesPruébalo en línea! Ejemplo de uso:
([0]#[2..]!!) 10
rendimientos6
(indexados a 0).La función
#
opera en dos listas, el frente invertido de la matriz[p-1, p-2, ..., 1]
y el resto infinito de la matriz[p, p+1, p+2, ...]
. Construye una lista infinita de posiciones, desde la cualn
se devuelve la posición th dada una entradan
.El patrón se
((a:b)#(p:q))
unep
al valor de la posición actual de la hormiga ya
al valor a la posición anterior.b
es el prefijo de la matriz desde la posición 1 ap-2
yq
el descanso infinito a partir de la posiciónp+1
.Construimos una lista de llamadas recursivas de la siguiente manera: observamos cada divisor
d
dep
(que es mayor que uno y menor quep
) en orden ascendente y sumamosb#(a+d:div p d:q)
para cada uno de ellos, es decir, el valor actualp
se divide pord
y la hormiga se mueve un paso a la izquierda donded
se agregaa
. Luego anexamos(p:a:b)#q
al final de esta lista, que indica que la hormiga se mueve un paso hacia la derecha.Luego tomamos la primera de esas llamadas recursivas de la lista y anteponemos la posición actual, que coincide con la longitud de la lista de prefijos
b
. Debido a que los divisores están en orden ascendente, elegir el primero de la lista de llamadas recursivas garantiza que usemos el más pequeño. Además, como(p:a:b)#q
se agrega al final de la lista, solo se selecciona si no hay divisores y, porp
lo tanto, es primo.Ediciones:
-2 bytes cambiando la lista de funciones de orden descendente a ascendente.
-12 bytes gracias a la idea de Zgarb de indexar en una lista infinita en lugar de manejar un contador, y cambiando a indexación 0.
fuente
TI-BASIC,
10810310298 bytesLa entrada y la salida se almacenan en
Ans
. La salida está indexada en 1.fuente
fPart(∟A(P)/F:
confPart(F¹∟A(P:
. Lo mismo en la siguiente línea.not(fPart(7⁻¹7
es 0 peronot(fPart(7/7
es 1.MATL , 41 bytes
La salida está basada en 1. El programa agota el tiempo para el último caso de prueba en el intérprete en línea.
Pruébalo en línea!
Explicación
El programa aplica el procedimiento como se describe en el desafío. Para hacerlo, hace un uso inusualmente intenso de los portapapeles manuales y automáticos de MATL.
El divisor más pequeño se obtiene como la primera entrada en la descomposición del factor primo.
La actualización "brecha" se realiza sobrescribiendo la entrada correspondiente de la matriz A . La actualización "agregar" se realiza mediante la adición de elementos a A una matriz que contiene ceros, excepto en la posición deseada.
fuente
Pyth - 44 bytes
Implementación procesal directa.
Test Suite .
fuente
PARI / GP, 87 bytes
Bastante autoexplicativo (no tan golfista). Si no cuenta la
f(n)=
parte, son 82 bytes. También puede comenzar porn->
(85 bytes).Es un lenguaje 1 indexado.
Editar: la modificación
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á una ilustración de la caminata de la hormiga (dado un terminal lo suficientemente ancho). Por ejemploillustrate(150,25)
, dará los primeros 150 pasos en 25 columnas, así:fuente
Python 2 ,
142127bytesPruébalo en línea!
fuente
P(n)
n<=4
Mathematica,
118103bytesPruébalo en línea!
Martin Ender ahorró 15 bytes
fuente
Divisors
, puedes usar notación infija paraDo
, y puedes regresar ent
lugar det-1
(resultado basado en 1).Python 3 ,
158149133 bytesEsta es una implementación de procedimiento sencilla con una o dos peculiaridades para asegurarse de que el código funcione para todos los casos de prueba. Lo uso
[*range(2,n+9)]
para asegurarme de que A sea lo suficientemente grande (excepton<3
,n+9
es más que suficiente) Laelse
cláusula divide lo antiguoA[p]
pord
decrementosp
y luego se agregad
a lo nuevoA[p]
, lo que definitivamente es una mala práctica de codificación. De lo contrario, bastante sencillo. Sugerencias de golf bienvenidas!Editar: -9 bytes sin
sympy
gracias a Halvard Hummel. -14 bytes de Felipe Nardi Batista, -6 bytes de algunas señales de la respuesta Python 2 de Jonathan FrechPruébalo en línea!
fuente
if d-m:A[p]...
yelse:p+=1
para salvar un byteelse
declaraciónelse
declaración, no hay diferencia en bytes para la versión de la funciónPHP, 102 + 1 bytes
Ejecutar como tubería
-R
o probarlo en línea .Salida vacía para entrada
0
; insertar+
despuésecho
para un literal0
o use esta versión indexada 1 (103 + 1 bytes):
fuente
R , 123 bytes
Una implementación sencilla. Se proporciona como una función, que toma el número de movimientos como entrada y devuelve la posición p.
Se repite sobre la secuencia y mueve el puntero hacia adelante y hacia atrás según las reglas. La salida está basada en 0.
Una nota: para encontrar el factor primo más pequeño de un número x, calcula el módulo de x en relación con todos los enteros de 0 a x. Luego extrae los números con un módulo igual a 0, que siempre son [0,1, ..., x]. Si el tercer número no es x, entonces es el factor primo más pequeño de x.
Pruébalo en línea!
fuente
C (gcc),
152148 bytesMinified
Formado con algunos comentarios.
Función principal para probar
Por mostrar cada paso
Declarar display () dentro de f ()
Pantalla de llamada()
Pantalla de llamada()
fuente
Clojure, 185 bytes
Ay, editar un "estado" no es ideal en Clojure. Deberá aumentar el exponente para entradas más grandes.
fuente
loop
? Debería poder perder algunos bytes sin eso.first
cosa a unasome
declaración.recur
dos veces, una para cadaif-let
rama. También(dec i)
sería duplicado.some
necesita un predicado, podría usarlo+
ya que estamos tratando con números, pero este es un carácter más largo quefirst
. CMIIWJava 8,
138135 bytesExplicación:
Pruébalo aquí.
fuente
Clojure,
198193191 bytesEsto necesita ser severamente golfizado ...
Golf 1 : guardado 5 bytes cambiando
(first(filter ...))
a(some ...)
Golf 2 : guardado 2 bytes cambiando
(zero? ...)
a(= ... 0)
Uso:
Código sin golf:
fuente