La espiral de Ulam es un tema realmente fascinante, pero desconcertante, en matemáticas. Aquí se puede encontrar cómo funciona en detalle , pero se puede explicar un breve resumen de la siguiente manera:
Comienzo escribiendo un uno, luego escribo dos a la derecha. Sobre los dos, escribo un tres, y a la izquierda escribo cuatro. Continúo este patrón de dar vueltas alrededor de 1 (y cualquier número entre yo y 1) infinitamente (o hasta que se me indique que pare), formando un patrón en espiral. (ver ejemplo a continuación)
El objetivo
Haga un programa que acepte n (siempre será un número impar mayor que cero) como una entrada que se correlaciona con el número de filas, luego imprime los valores de los primos fila por fila de la espiral de Ulam. El formato puede ser de cualquier manera, pero debe ser legible y obvio.
Por ejemplo, dada la entrada 3, su programa debería salir 5,3,2,7
, porque 3 filas producen la siguiente espiral:
5 4 3 <-- first row has the primes 5 and 3
6 1 2 <-- second row has the prime 2
7 8 9 <-- third row has the prime 7
Como se trata de un código de golf, ¡la respuesta con la menor cantidad de bytes gana (no importa cuán ineficiente)! Las lagunas estándar no son aceptables.
Respuestas:
Pyth, 20 bytes
Pruébelo en línea: demostración
Este código genera la espiral completa de Ulam, conecta todas las líneas y filtros para primos.
Explicación:
fuente
MATLAB, 48
Básicamente, esto crea una espiral del tamaño requerido (solicitado por el usuario), luego lo organiza de modo que aparezca en el orden de fila correcto. Esto se almacena en a. A continuación, muestra todos los valores en a que son primos.
Como dijiste en cualquier formato legible, guardé un byte y busqué la salida predeterminada de disp () que es (en tu caso de prueba, n = 3):
Como una ventaja adicional, esto funciona para cualquier n> 0, incluidos los números pares. Por ejemplo, la salida para n = 10 es:
fuente
spiral
funciónCJam,
4233 bytesPruébalo en línea
La última versión incluye mejoras sustanciales sugeridas por @Martin.
El método para construir la espiral es, en cada paso, rotar la matriz que tenemos hasta ahora en 90 grados, y agregar una fila con números adicionales. Esto se repite
(n / 2) * 4
veces.Los valores en la matriz resultante se filtran para ser primos.
Explicación:
fuente
2/4*
ser reemplazado por2*
, o lo ha dejado así a propósito?(2*
Debe ser correcto.Mathematica 223
Esto se apropia del código de Kuba para una espiral de Ulam. Es por eso que lo envío como wiki comunitario. Simplemente lo jugué y seleccioné los números primos, que se enumeran por la fila en la que residen.
Ejemplo
Para mejorar la pantalla:
fuente
Mathematica, 118 bytes
Esto genera la espiral de Ulam en forma lineal al observar que la posición de cada número posterior se puede acumular como
es decir, comenzar desde el centro, luego moverse 1 derecha, 1 arriba, 2 izquierda, 2 abajo, 3 derecha, 3 arriba, ...
Salida:
fuente
Javascript,
516363304276243240 BytesMi solución no crea una matriz densa con la espiral, sino que devuelve el índice que corresponde al número dado en la matriz de Ulam del orden dado. Por lo tanto, itera a través de los números entre 2 y M * M y crea una matriz de primos con el idx dado por el fn ulamIdx
Minified se ve así:
Para la entrada 15, la salida es:
,,,,,,,,,,,,,,,, 197 ,,,, 193`` 191 ,,,,,,,,,,,,,,,, 139 ,, 137 ,,,,, 199, 101 ,,,, 97 ,,,,,,,, 181 ,,,,,,,, 61,, 59 ,,,, 131 ,,,, 103,, 37 ,,,,,, 31, 89, 179, 149, 67, 17 ,,,, 13 ,,,,,,,,,,,, 5, 3, 29 ,,,,,, 151 ,,, , 19 ,,, 2,11,, 53,, 127 ,,, 107,, 41,, 7 ,,,,,,,,,,,, 71 ,,,, 23 ,,,,,,, ,,, 109 ,, 43 ,,,, 47 ,,,, 83 ,, 173 ,,,, 73 ,,,,,, 79 ,,,,,,,,,, 113 ,,,,,,, ,,,,, 157 ,,,,,, 163 ,,,, 167 ,,,, 211 ,,,,,,,,,,,, 223
fuente