C, 208 206 201 200 199 196 194 193 194 193 188 185 183 180 176 Octets
(si les retours à la ligne sont supprimés):
main(int u,char**b){
for(int v,x,y,S=v=**++b-48;--v>-S;putchar(10))
for(u=-S;++u<S;){
x=u;y=v;v>-u^v<u?:(x=v,y=u);
x=4*y*y-x-y+1+2*(v<u)*(x-y);
for(y=1;x%++y;);
putchar(y^x?32:42);}}
Compilé avec
> gcc -std=c99 -o ulam ulam.c
Avertissement. Ce programme est lent, car il est en fait une division de première instance jusqu'à 2^31. Mais ne produit pas de sortie requises:
* *
* *
* * *
* * *
* ** *
* *
* *
* *
* *
Dans bien formaté C et la redondance de l' #comprend:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int u,v,x,y,d,S = atoi(argv[1]);
/* v is the y coordinate of grid */
for (v=S; v>=-S; --v)
/* u is the x coordinate. The second operand (!putchar...) of the boolean or
* is only ececuted a a end of a x line and it prints a newline (10) */
for (u=-S; u<=S || !putchar(10); ++u) {
/* x,y are u,v after "normalizing" the coordintes to quadrant 0
normalizing is done with the two comparisions, swapping and and
an additional term later */
d = v<u;
x=u;
y=v;
if (v<=-u ^ d) {
x=v;
y=u;
}
/* reuse x, x is now the number at grid (u,v) */
x = 4*y*y -x-y+1 +2*d*(x-y);
/* primality test, y resused as loop variable, won't win a speed contest */
for (y=2; y<x && x%y; ++y)
;
putchar(y!=x?' ':'*');
}
}
Il fonctionne en transformant les coordonnées de la grille sur le numéro approprié et puis en effectuant le test de primalité, intead de dessin dans un serpent de la même manière. Les différentes équations pour les quatre quadrants" peuvent être regroupés en un seul, avec la permutation de x et y et un autre terme pour "arrière de comptage".