Nous avons eu deux des défis sur la spirale d' Ulam. Mais cela ne suffit pas.
Dans ce défi, nous allons tracer une spirale Ulam triangulaire (par opposition à la spirale Ulam carrée habituelle). Voici un croquis de ce à quoi ressemble la spirale.
Comme nous le savons, la spirale Ulam organise tous les nombres naturels dans une spirale extérieure et ne marque que ceux qui sont premiers. Ainsi, dans l'esquisse ci-dessus, seuls les nombres qui apparaissent en noir (les nombres premiers) seraient affichés.
Le défi
Acceptez un nombre N en entrée et affichez la spirale triangulaire d'Ulam jusqu'à ce nombre.
- L'entrée peut être stdin ou un argument de fonction.
- La spirale doit tourner dans le sens positif (c'est-à-dire dans le sens antihoraire), comme dans la figure ci-dessus.
- N'importe lequel des virages à 120 degrés de la figure ci-dessus serait valide, et le virage peut être différent pour différentes entrées. Mais le côté le plus bas des triangles implicites doit être horizontal, car les seuls virages autorisés sont (multiples de) 120 degrés.
- Le code doit s'exécuter théoriquement (avec suffisamment de temps et de mémoire) pour tout N jusqu'à ce qui est autorisé par les calculs intermédiaires que vous effectuez avec votre type de données par défaut.
double
est assez; pas besoin de grands types entiers. - Toutes les fonctions intégrées sont autorisées.
- Je n'accepterai pas ma propre réponse (pas que je pense que ce serait la plus courte de toute façon ...).
Formats de sortie
Choisissez l'une des options suivantes.
Affichez un graphique avec un marqueur (point, cercle, croix, tout ce que vous préférez) aux nombres premiers, et rien aux nombres non premiers. Il n'est pas nécessaire que l'échelle soit la même pour les deux axes. Autrement dit, les triangles implicites n'ont pas besoin d'être équilatéraux. Les axes, les lignes de grille et les étiquettes d'axe sont facultatifs. Seuls les marqueurs aux nombres premiers sont requis.
Un exemple de sortie pour N = 12 serait le suivant (comparer avec le croquis ci-dessus). Le deuxième graphique est un exemple plus intéressant, correspondant à N = 10000.
- Produisez un fichier image avec ce qui précède, dans n'importe quel format d'image bien connu (tel que png, tiff, bmp).
Affichez la spirale en tant qu'art ASCII , en utilisant un seul caractère de votre choix pour les nombres premiers et un espace vide pour les non-nombres premiers, avec un espace vide pour séparer les positions numériques dans la même ligne. Les espaces de début ou de fin ou les nouvelles lignes sont autorisés. Par exemple, le cas N = 12 utilisant
o
comme caractère seraito · · · o · o · · · o · o
où bien sûr, seule la
o
marque aux nombres premiers serait effectivement affichée. Le·
at non-prime est présenté ici à titre de référence uniquement.
Critère gagnant
La récompense réelle est de voir par vous-même ces modèles incroyables Code golf, le code le plus court gagne.
la source
Réponses:
CJam,
4942 octetsEntrez comme un entier unique dans STDIN. Sortie sous forme de grille ASCII avec
0
des nombres premiers. La rotation de la spirale n'est pas cohérente: le plus grand nombre de la spirale sera toujours sur la rangée inférieure.Testez-le ici.
Explication
L'idée de base est de représenter le triangle comme un tableau 2D irrégulier lors du calcul. Vous obtenez ce tableau en inversant les lignes et en alignant toutes les lignes vers la gauche:
Serait représenté comme
Puisque nous avons mis en miroir la ligne, nous voulons enrouler la spirale dans le sens horaire . C'est pratique, car tout ce que nous devons faire est de faire pivoter le triangle dans le sens inverse des aiguilles d'une montre et d'ajouter la prochaine sous-liste dans l'ordre. Nous pouvons faire pivoter le tableau irrégulier en inversant toutes les lignes et en le transposant:
Voici donc le code. Un détail sur lequel je voudrais attirer l'attention est le dernier morceau qui crée la disposition triangulaire. Je pense que c'est plutôt chouette. :)
la source
MATL ,
4836 octetsUtilise la version actuelle (9.3.0) .
Essayez-le en ligne!
Aucune idée de la façon dont le compilateur en ligne parvient à traduire la sortie graphique en ASCII, mais il le fait.Cela produit un tracé ASCII approximatif grâce à une fonction Octave prise en charge par le compilateur en ligne!Edit (4 avril 2016): la fonction
Y[
a été renomméek
depuis la version 13.0.0. Le lien vers le compilateur en ligne intègre cette modification, afin que le code puisse être testé.Exemple
produit la sortie graphique (version MATLAB montrée):
Explication
Le code utilise des nombres complexes pour tracer le chemin suivi par la spirale. Comme le montre la première figure du défi, chaque jambe droite de la spirale est un segment de longueur croissante 1, 2, 3, 4 ... et d'orientation cycliquement croissante de 120 degrés, 240 degrés, 0 dégressif, 120 dégressifs. ..
Le code génère d'abord les déplacements complexes individuels de chaque nombre entier au suivant. Ces déplacements complexes ont une magnitude 1 et un angle
2*pi/3
,4*pi/3
ou0
(en radians). Ainsi, ils peuvent être facilement générés sous forme d'exponentielles imaginaires. Pour cela, la séquence entière 0,1,2,2,3,3,3,4,4,4,4 ... est utilisée en premier.Cette séquence entière est presque comme la séquence "n apparaît n fois" ( OEIS A002024 ), et peut être obtenue comme
floor(sqrt(2*n)+.5)
oùn
est 0,1,2,3, .... La multiplication par2j*pi/3
, oùj
est l'unité imaginaire, produit les déplacements complexes souhaités.Les déplacements sont cumulés pour calculer les positions correspondant aux nombres entiers dans la spirale. Le premier nombre entier dans la spirale, qui est
1
, est situé arbitrairement à une position1
dans le plan complexe.Enfin, les positions correspondant aux nombres non premiers sont rejetées et les autres sont tracées dans le plan complexe.
la source
.png
fichier qui sera montré par la page Web @AlexAplot(1:5)
) et cela produit une sortie texte-graphique !! matl.tryitonline.net/#code=NTpYRw&input= @AlexA. Comment c'est??Le dessin doit être fait avec
LaTeX / PGF, 527
594octets527 octets est le document complet comme ci-dessus, c'est-à-dire incluant le préambule et le paramètre (ici 4000, donc ~ 523 sans paramètre). Produit un fichier PDF.
Idée de base: eh bien, dessinez. Utilise une transformation matricielle pour une grille triangulaire. Le seul problème est que les points sont également affectés (et étirés) par la transformation. J'ai donc choisi des marqueurs d'ellipse :) ce que je veux dire par là est clair dans la deuxième image (n = 250, 5pt).
Autre mise en garde: ne peut gérer qu'un peu moins de 5000 en raison de la taille de pile maximale de TeX. La première image est pour n = 4000. Apparemment, il est possible d'augmenter la taille de la pile , je ne l'ai pas essayé.
Utilise les PGF
isprime()
.Non golfé:
la source
lualatex
ou un autre compilateur à allocation dynamique devrait vous permettre de contourner la taille de la pile, si je comprends bien votre commentaire correspondant. Ce n'est donc pas une limitation de votre réponse, juste de la plupart des implémentations où vous l'exécuteriez.Mathematica, 94 octets
Résultat
la source
Python, 263 octets
Étant nouveau sur Python, il y a sûrement matière à amélioration :)
Exemple:
la source
s=[];X=[];Y=[];i=1;x=0;y=0
às=X=Y=[];i=1;x=y=0;
x=y=0
.R, 137 octets
Utilise uniquement les fonctions intégrées, même pour les nombres premiers. Compte tenu de son approche vectorisée au lieu d'itérative, il est rapide, mais ne peut pas gérer de grands nombres.
Golfé:
Non golfé:
Exemple:
la source