La spirale d'Ulam est un sujet vraiment fascinant, mais déroutant, en mathématiques. Comment cela fonctionne en détail peut être trouvé ici , mais un bref résumé peut être expliqué comme suit:
Je commence par en écrire un, puis j'écris deux à droite. Au-dessus des deux, j'écris trois, et à gauche j'en écris quatre. Je continue ce schéma de cercle autour de 1 (et de tout nombre entre moi et 1) à l'infini (ou jusqu'à ce qu'on lui dise d'arrêter), formant un motif en spirale. (voir l'exemple ci-dessous)
L'objectif
Créez un programme qui accepte n (sera toujours un nombre impair supérieur à zéro) comme entrée en corrélation avec le nombre de lignes, puis imprime les valeurs des nombres premiers ligne par ligne de la spirale Ulam. Le formatage peut être de n'importe quelle façon, mais doit être lisible par l'homme et évident.
Par exemple, étant donné l'entrée 3, votre programme devrait sortir 5,3,2,7
, car 3 lignes produisent la spirale suivante:
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
Comme c'est un golf de code, la réponse avec le moins d'octets gagne (peu importe son inefficacité)! Les failles standard ne sont pas acceptables.
Réponses:
Pyth, 20 octets
Essayez-le en ligne: Démonstration
Ce code génère la spirale entièrement d'Ulam, connecte toutes les lignes et filtres pour les nombres premiers.
Explication:
la source
MATLAB, 48
Fondamentalement, cela crée une spirale de la taille requise (demandée à l'utilisateur), puis l'organise de sorte qu'elle apparaisse dans le bon ordre de ligne. Ceci est stocké dans un fichier. Ensuite, il affiche toutes les valeurs de a qui sont premières.
Comme vous avez dit tout format lisible, j'ai enregistré un octet et j'ai opté pour la sortie par défaut de disp () qui est (dans votre cas de test, n = 3):
En prime, cela fonctionne pour tout n> 0, y compris les nombres pairs. Par exemple, la sortie pour n = 10 est:
la source
spiral
fonctionCJam,
4233 octetsEssayez-le en ligne
La dernière version comprend des améliorations substantielles suggérées par @Martin.
La méthode de construction de la spirale consiste, à chaque étape, à faire pivoter la matrice que nous avons jusqu'à présent de 90 degrés et à ajouter une ligne avec des nombres supplémentaires. C'est répété plusieurs
(n / 2) * 4
fois.Les valeurs de la matrice résultante sont ensuite filtrées pour être des nombres premiers.
Explication:
la source
2/4*
être remplacé par2*
, ou l'avez-vous laissé comme ça exprès?(2*
devrait être correct.Mathematica 223
Cela s'approprie le code de Kuba pour une spirale Ulam. C'est pourquoi je le soumets en tant que wiki communautaire. Je l'ai simplement joué au golf et sélectionné les nombres premiers, qui sont répertoriés par la ligne dans laquelle ils résident.
Exemple
Pour améliorer l'affichage:
la source
Mathematica, 118 octets
Cela génère la spirale Ulam sous forme linéaire en notant que la position de chaque nombre suivant peut être accumulée comme
c'est à dire partir du centre, puis se déplacer 1 à droite, 1 en haut, 2 à gauche, 2 en bas, 3 à droite, 3 en haut, ...
Production:
la source
Javascript,
516363304276243240 octetsMa solution ne crée pas une matrice dense avec la Spirale, au lieu de cela, elle retourne l'index qui correspond au nombre donné dans la matrice d'Ulam de l'ordre donné. Il parcourt donc les nombres entre 2 et M * M et crée un tableau de nombres premiers avec l'idx donné par le fn ulamIdx
Minified ressemble à ceci:
Pour l'entrée 15, la sortie est:
,,,,,,,,,,,,,,,, 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
la source