Posting recursive ajax call data on HTML(Angularjs) - html

I am doing recursive ajax call and receiving server data. For each call, I receive some chunk of data. I want to show up that data on the front end. How do I do so that each received part of data is one below another. I hope this is clear.
for example
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
Suppose I received first 10 lines on first ajax call, next 5 in next and so on, I want to show up as it is shown above, without wiping out first received data and showing 2nd received data. By the way I am using Angularjs for front end.
Added code snippet on Gaurav request.
callOnReq(requestId);
function callOnReq(requestId) {
console.log('Request ID sent')
$http.post('/py/recvData',{'requestId':requestId}).
success(function(data, status, headers, config) {
console.log('Data after request ID')
$scope.recdData data.output;
if (data.output != ""){
callOnReq(requestId);
}else if (data.output == ""){
console.log('Data receiving over');
}
}).
error(function(data, status, headers, config) {
console.log(status);
});
};
Thanks in advance.

Declare a variable in scope.
$scope.responseList=[];
Then push the response text in that
If response data is list then you have to concate it
$scope.responseList=$scope.responseList.concat(data);
If response data single objecth then you have to push it
$scope.responseList.push(data);
Sample code
$http({
// code
}).then(function(result){
// data is list then you have to concate it
$scope.responseList=$scope.responseList.concat(data);
// data is single objecth then you have to push it
$scope.responseList.push(data);
})
Then display responseList in the view.

Related

Internet transfer taking ages for elastic beanstalk environment, with traceroute showing strange output

I have an EBS environment set up in AWS us-east-1, and I'm calling it from Australia via http. There is a DNS set up in front of it on route 53, and I'm calling it via that. I'm aware that having the infra in us-east-1 should add some latency impact in terms of the internet speed.
However, the latency increase seems to be way more than normal. My analysis has shown that it takes 200ms for the endpoint to return a response, the response being 6000 characters of text, but then 900ms end-to-end for the data to hit my computer. That means the data transfer time over the internet is taking 700ms.
This latency is much less (about 100ms for data transfer) if i return for example just 20 characters. I've tried other endpoints in us-east-1 and they transfer the data a lot faster, so my internet connection is unlikely to be the issue. I tried doing a traceroute and here was the output. I'm not skilled at reading traceroute so im not sure if this is misconfigured:
1 mymodem (192.168.0.1) 5.515 ms 4.140 ms 4.416 ms
2 gateway.vb09.melbourne.asp.telstra.net (58.162.26.201) 13.920 ms 18.528 ms 14.207 ms
3 ae10.lon-ice301.melbourne.telstra.net (203.50.61.129) 15.245 ms
ae10.win-ice301.melbourne.telstra.net (203.50.61.145) 14.800 ms 13.342 ms
4 bundle-ether25.exi-core30.melbourne.telstra.net (203.50.61.128) 15.015 ms 15.545 ms
bundle-ether25.win-core10.melbourne.telstra.net (203.50.61.144) 15.603 ms
5 bundle-ether2.cla-core30.melbourne.telstra.net (203.50.13.124) 15.580 ms 15.727 ms 15.234 ms
6 bundle-ether19.chw-core10.sydney.telstra.net (203.50.13.144) 26.375 ms
bundle-ether3.hay-core30.sydney.telstra.net (203.50.13.132) 26.279 ms 27.283 ms
7 bundle-ether1.oxf-gw11.sydney.telstra.net (203.50.6.93) 25.961 ms
bundle-ether19.ken-core10.sydney.telstra.net (203.50.13.146) 26.221 ms 26.505 ms
8 203.50.13.98 (203.50.13.98) 27.733 ms
bundle-ether1.pad-gw11.sydney.telstra.net (203.50.6.61) 26.582 ms
203.50.13.98 (203.50.13.98) 26.650 ms
9 203.50.13.98 (203.50.13.98) 180.096 ms
203.50.13.90 (203.50.13.90) 26.194 ms 27.483 ms
10 203.50.13.90 (203.50.13.90) 165.233 ms 162.661 ms 163.185 ms
11 i-73.paix-core02.telstraglobal.net (202.84.247.45) 185.490 ms 181.710 ms 179.565 ms
12 i-92.paix02.telstraglobal.net (202.84.247.41) 180.893 ms
i-92.eqnx03.telstraglobal.net (202.84.247.17) 160.601 ms 161.498 ms
13 gtt-peer.paix02.pr.telstraglobal.net (134.159.61.98) 327.221 ms 183.915 ms
64.86.160.0 (64.86.160.0) 163.227 ms
14 ae11.cr7-dal3.ip4.gtt.net (213.200.115.26) 240.476 ms
ae12.cr7-dal3.ip4.gtt.net (213.200.120.106) 242.111 ms
64.86.160.5 (64.86.160.5) 220.202 ms
15 ip4.gtt.net (209.120.154.162) 213.780 ms 293.630 ms 308.845 ms
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
31 * * *
32 * * *
33 * * *
34 * * *
35 * * *
36 * * *
37 * * *
38 * * *
39 * * *
40 * * *
41 * * *
42 * * *
43 * * *
44 * * *
45 * * *
46 * * *
47 * * *
48 * * *
49 * * *
50 * * *
51 * * *
52 * * *
53 * * *
54 * * *
55 * * *
56 * * *
57 * * *
58 * * *
59 * * *
60 * * *
61 * * *
62 * * *
63 * * *
64 * * *
I also tried pinging the endpoint and got the following
.Request timeout for icmp_seq 240
If anyone could let me know if this is misconfigured or point me to what I should test/analyse to improve the data transfer latency that would be so useful.
There are indeed disturbingly many hops within Telstra's network! But Internet was designed to be resilient, rather than efficient.
AWS offers more optimal routing through its own private network with Global Accelerator, if your use case calls for a global service out of a single AWS region. Otherwise it may be cheaper to run replication across several AWS regions close to your users, and there are quite a few possible architectures with different tradeoffs between latency and cost, which will have to be considered in the context of your specific application.
Finally, to let the ping through to your instance, you will need to enable inbound rule for Custom ICMP - IPv4 traffic in your security group.

passing longitude and latitude and distance as parameters in node js mysql query

Hello I wrote this long mysql query that takes user longitude ,latitude and meters as input and shows the locations within 100 meters.
However I always get a mysql error near ? when I type http://localhost:3002/closest/20.8877387/5.847748474/100 in the browser. Could someone give me a hint?
app.get('/closest/:lat/:lon/meters', (request, response) => {
const lat = request.params.lat;
const lon = request.params.lon;
pool.query('SELECT *, ( ( ( Acos(Sin(( WHERE lat =? * Pi() / 180 )) * Sin(( map.lat* Pi() / 180 )) + Cos (( WHERE lat =? * Pi() / 180 )) * Cos(( map.lat* Pi() / 180 )) * Cos (( ( WHERE lon = ? - map.lon ) * Pi() / 180 ))) ) * 180 / Pi () ) * 60 * 1.1515 * 1.609344 * 1000 ) AS `METERS` FROM base.map WHERE "METERS" <= ?',lat,lon, (error, result) => {
if (error) throw error;
response.send(result);
});
});
You don't seem to set the values of your ? parameters. You need to provide them as an array as the second parameter to .query(sqlStatement, parameterArray, callback). You have four ?s in your query, so the array you provide must have four elements. [lat, lat, lon, radius] correspond to the purpose of your four ?s. The ? in your query represent conditional parameters. You want
Your query says something like this.
SELECT bigFatFormula AS METERS FROM tbl WHERE METERS < someDistance
That WHERE clause doesn't work. You have to say
SELECT * FROM
(SELECT bigFatFormula AS METERS FROM tbl) result
WHERE METERS < someDistance
In your query's WHERE clause, your METERS alias isn't in scope. The nested query puts it in scope.
Your query contains a mess of nested WHERE clauses. That doesn't work.
Your get handler's first line needs to say this, with a colon on meters.
app.get('/closest/:lat/:lon/:meters', (request, response) => {
So, you want something like this.
const lat = Number(request.params.lat);
const lon = Number(request.params.lon);
const radius = Number(request.params.meters);
var q = '
SELECT * FROM (
SELECT *, ( ( ( Acos(Sin(( ? * Pi() / 180 ))
* Sin(( map.lat* Pi() / 180 ))
+ Cos (( lat =? * Pi() / 180 )) *
Cos(( map.lat* Pi() / 180 )) *
Cos ((( ? - map.lon ) * Pi() / 180 ))) )
* 180 / Pi () ) * 60 * 1.1515 * 1.609344 * 1000 )
AS METERS
FROM base.map
) resultset WHERE METERS <= ?';
pool.query(q, [lat, lat, lon, radius], (error, result) => {
I haven't debugged this.
Pro tip: Your query will be very slow if you have lots of rows in your table. Read this for a suggestion.
Pro tip: You might want to use a stored function for your lat/lng - to - distance function, to make your query easier to read for the next person. Here's a stable function.
Pro tip: It's often a good idea to debug complex queries like this using a SQL client program before trying to embed them into programs.

MySQL - MOD() return 1 instead of 0

I have the following MySQL code that according to me should return 0:
mod( mod((180 / (30.4166666667 * 24 * 60)),1) * 30.4166666667,1) * 24 as HoursWorked
=> return 3.000
mod(mod(mod((180 / (30.4166666667 * 24 * 60)),1) * 30.4166666667,1) * 24,1) as ModHoursWorked
=> return 1
What am I missing?
the division must be floored
select mod(mod(mod(( floor(180 / (30.4166666667 * 24 * 60)) ),1) * 30.4166666667,1) * 24,1) ;
This worked:
SELECT truncate(mod(mod(mod((180 / (30.4166666667 * 24 * 60)),1) * 30.4166666667, 1) * 24, 1), 0) AS ModHoursWorked; => return 0

Correct Sql Script for Formula

Can anyone help me write SQL script for the following formula?
If DEP = 1
If DROP 1
PLV = 334.86 * exp(0.3541 * ACTIVE_DAYS) + 0.25 * DROP + 20 * DEP
Else
If DROP < 0
PLV = DROP + 70 * ACTIVE_DAYS
Else
PLV = 0.25 * DROP + 70 * ACTIVE_DAYS
The SQL script which I have is the following
SELECT IF(dep=1, if(dep=1, (334.86 * exp(0.3541 * act_days)) +
(0.25 * 'drop') + (20 * dep),
if('drop'<0, 'drop' + (70 * act_days), (0.25 * 'drop') + (70 * act_days))),'0')
as PLV
But the above query is not right as something is missing where the formula says
Else
PLV = 0.26 * DROP
Thanks,
How about this:
CASE "DEP"
WHEN 1
THEN CASE
WHEN "DROP" = 1 THEN 334.86 * exp(0.3541 * "ACTIVE_DAYS") + 0.25 * "DROP" + 20 * "DEP"
WHEN "DROP" < 0 THEN "DROP" + 70 * "ACTIVE_DAYS"
ELSE 0.25 * "DROP" + 70 * "ACTIVE_DAYS"
END
END

Code Golf: Ulam Spiral

Locked. This question and its answers are locked because the question is off-topic but has historical significance. It is not currently accepting new answers or interactions.
The Challenge
The shortest code by character count to output Ulam's spiral with a spiral size given by user input.
Ulam's spiral is one method to map prime numbers. The spiral starts from the number 1 being in the center (1 is not a prime) and generating a spiral around it, marking all prime numbers as the character '*'. A non prime will be printed as a space ' '.
alt text http://liranuna.com/junk/ulam.gif
Test cases
Input:
2
Output:
* *
*
*
Input:
3
Output:
* *
* *
* **
*
*
Input:
5
Output:
* *
* *
* * *
* * *
* ** *
* *
* *
* *
* *
Code count includes input/output (i.e full program).
Python - 203 Characters
_________________________________________________________
/x=input();y=x-1;w=x+y;A=[];R=range;k,j,s,t=R(4) \
| for i in R(2,w*w): |
| A+=[(x,y)]*all(i%d for d in R(2,i)) |
| if i==s:j,k,s,t=k,-j,s+t/2,t+1 |
| x+=j;y+=k |
| for y in R(w):print"".join(" *"[(x,y)in A]for x in R(w)) |
\_________________________________________________________/
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
x=input();y=x-1;w=x+y
A=[];R=range;k,j,s,t=R(4)
for i in R(2,w*w):
A+=[(x,y)]*all(i%d for d in R(2,i))
if i==s:j,k=k,-j;s,t=s+t/2,t+1
x+=j;y+=k
for y in R(w):print"".join(" *"[(x,y)in A]for x in R(w))
How it works
The idea is to fill A with x,y coords that need to be printed as '*'
The algorithm starts at the cell corresponding to 2, so the special case of testing 1 for primality is avoided.
x,y is the cell of interest
j,k keep track of whether we need to inc or dec x or y to get to the next cell
s is the value of i at the next corner
t keeps track of the increment to s
all(i%d for d in R(2,i)) does the primality check
The last line is rather clumsy. It iterates over all the cells and decides whether to place a space or an asterisk
MATLAB: 182 167 156 characters
Script ulam.m:
A=1;b=ones(1,4);for i=0:(input('')-2),c=b(4);b=b+i*8+(2:2:8);A=[b(2):-1:b(1);(b(2)+1:b(3)-1)' A (b(1)-1:-1:c+1)';b(3):b(4)];end;disp(char(isprime(A)*10+32))
And formatted a little nicer:
A = 1;
b = ones(1,4);
for i = 0:(input('')-2),
c = b(4);
b = b+i*8+(2:2:8);
A = [b(2):-1:b(1); (b(2)+1:b(3)-1)' A (b(1)-1:-1:c+1)'; b(3):b(4)];
end;
disp(char(isprime(A)*10+32))
Test cases:
>> ulam
2
* *
*
*
>> ulam
3
* *
* *
* **
*
*
>> ulam
5
* *
* *
* * *
* * *
* ** *
* *
* *
* *
* *
Golfscript - 92 Characters
~.(:S+,:R{S\-:|;R{S-:$|>' *'1/[|$.|]2/#:d|~)$<!^=~:$;:y.*4*$-y-)2d*$y-*+:$,{)$\%!},,2==}%n}%
97 characters
~.(:S+,:R{S\-:|;R{S-:$|>' *'1/[|$.|]2/#:d|~)$<!^=~:$;:y.*4*$-y-)2d*$y-*+.1=3*+:$,2>{$\%!},!=}%n}%
99 characters
~.(:S+,{S-}%:R{~):|;R{:$|>' *'1/[|$.|]2/#:d|~)$<!^=~:$;:y.*4*$-y-)2d*$y-*+.1=3*+:$,2>{$\%!},!=}%n}%
100 characters
~:S.(+,{S(-}%:R{~):|;R{:$|>' *'1/[|$.|]2/#:d|~)$<!^=~:$;:y.*4*$-y-)2d*$y-*+.1=3*+:$,2>{$\%!},!=}%n}%
101 characters
~:S.(+,{S(-}%:R{~):v;R{:$v>:d;' *'1/[v$.v]2/v~)$<!d^=~:$;:y.*4*$-y-)2d*$y-*+.1=3*+:$,2>{$\%!},!=}%n}%
C, 208 206 201 200 199 196 194 193 194 193 188 185 183 180 176 Bytes
(if newlines are removed):
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);}}
Compiled with
> gcc -std=c99 -o ulam ulam.c
Warning. This program is slow, because is does a trial division up to 2^31. But is does produce the required output:
* *
* *
* * *
* * *
* ** *
* *
* *
* *
* *
In nicely formatted C and with redundant #includes:
#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?' ':'*');
}
}
It works by transforming the coordinates of the grid to the appropriate number and then performing the primality test, intead of drawing in a snake-like manner. The different equations for the four "quadrants" can be collapsed into one with swapping x and y and an additional term for "backward counting".
Ruby 1.8.7, 194 chars
n=2*gets.to_i-1
r=n**2
l,c=[nil]*r,r/2
r.times{|i|l[c]=i+1;c=i==0||l[c-n]&&!l[c+1]?c+1:l[c-1]&&!l[c-n]?c-n:l[c+n]?c-1:c+n}
r.times{|i|print"1"*l[i]!~/^1?$|^(11+?)\1+$/?'*':' ',i%n==n-1?"\n":''}
For some reason, ruby1.9 wants another space on line 4:
r.times{|i|l[c]=i+1;c=i==0||l[c-n]&&!l[c+1]?c+1:l[c-1]&&!l[c-n]?c-n :l[c+n]?c-1:c+n}
Python - 171
drhirsch's C ported to python.
S=input();R=range(-S+1,S)
for w in R:
p="";v=-w
for u in R:d=v<u;x,y=[(u,v),(v,u)][(w>=u)^d];x=4*y*y-x-y+1+2*d*(x-y);p+=" *"[(x>1)*all(x%f for f in range(2,x))]
print p
echo 20 |python ulam.py
* * * * * *
* * * * * *
* * * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* * * * * * *
* * * * * * *
* * * * *
* * * * * * * *
* * * * * * *
* * * * *
* * * * * *
* * * * * * * * *
* * *
* * * * * * * * * *
* * * * * * * * * *
* * * *
* * ** * * * * * *
* * * *
* *
* * * * * * * * * * *
* * * * * * * *
* *
* * * * * * * *
* * * * * * *
* * * * *
* * * * * *
* * * * * * * * *
* * * *
* * * * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * *
* * * * * *
* *
* * * * * *
MATLAB, 56 characters
based on #gnovice solution, improved by using MATLAB's spiral function :)
disp(char(isprime(flipud(spiral(2*input('')-1)))*10+32))
Test Cases:
>> disp(char(isprime(flipud(spiral(2*input('')-1)))*10+32))
2
* *
*
*
>> disp(char(isprime(flipud(spiral(2*input('')-1)))*10+32))
3
* *
* *
* **
*
*
>> disp(char(isprime(flipud(spiral(2*input('')-1)))*10+32))
5
* *
* *
* * *
* * *
* ** *
* *
* *
* *
* *
J solution: 197 173 165 161 bytes (so far)
this does not use the method mentioned in the comments to the OP
p=:j./<.-:$g=:1$~(,])n=:<:+:".1!:1]3
d=:j.r=:1
(m=:3 :'if.y<*:n do.if.0=t=:<:t do.d=:d*0j1[t=:<.r=:r+0.5 end.m>:y[g=:y(<+.p=:p+d)}g end.')t=:2
1!:2&2(1 p:g){' *'
My first code golf!
Ruby, 309 301 283 271 265 characters
s=gets.to_i;d=s*2-1;a=Array.new(d){' '*d}
e=d**2;p='*'*e;2.upto(e){|i|2.upto(e/i){|j|p[i*j-1]=' '}};p[0]=' '
s.times{|i|k=s-i-1;l=2*i;m=l+1;o=l-1
m.times{|j|n=j+k;a[k][n]=p[l**2-j];a[n][k]=p[l**2+j];a[k+l][n]=p[m**2-m+j]}
l.times{|j|a[j+k][k+l]=p[o**2+o-j]}}
puts a
Python 2.x, 220C 213C 207C 204C 201C 198C 196C 188C
Special thanks to gnibbler for some hints in #stackoverflow on Freenode. Output includes a leading and trailing newline.
import math
v=input()*2
w=v-1
a=['\n']*w*v
p=w*v/2
for c in range(1,w*w):a[p]=' *'[(c>1)*all(c%d for d in range(2,c))];x=int(math.sqrt(c-1));p+=(-1)**x*((x*x<c<=x*x+x)*w+1)
print''.join(a)
(Python 3 compatibility would require extra chars; this uses input, the print statement and / for integer division.)
Ruby - 158 Characters
Same algorithm as this one, just the prime test is different
p=(v=(w=gets.to_i*2)-1)*w/2-1
a='
'*v*w
d=0
(v*v).times{|i|a[p]="1"*(i+1)!~/^1?$|^(11+?)\1+$/?42:32;d=(a[p+(z=[w,-1,-w,1])[d-1]]<32)?(d-1):d%4;p+=z[d]}
puts a
Haskell - 224 characters
(%)=zipWith(++)
r x=[x]
l 1=r[1]
l n=r[a,a-1..b]++(m r[a+1..]%l s%m r[b-1,b-2..])++r[d-s*2..d]where{d=(n*2-1)^2;b=d-s*6;a=d-s*4;s=n-1}
p[_]='*'
p _=' '
i n=p[x|x<-[2..n],n`mod`x==0]
m=map
main=interact$unlines.m(m i).l.read
i'm not the best at haskell so there is probably some more shrinkage that can occur here
output from echo 6 | runghc ulam.hs
* *
* *
* * * *
* * *
* * *
* ** *
* * *
* *
* * * *
* *
*
this is a different algorithm (similar to #drhirsch's) unfortunately i cannot seem to get it below 239 characters
p[_]='*'
p _=' '
main=interact$unlines.u.read
i n=p[x|x<-[2..n],n`mod`x==0]
u(n+1)=map(map(i.f.o).zip[-n..n].replicate((n+1)*2-1))[n,n-1..(-n)]
f(x,y,z)=4*y*y-x-y+1+if z then 2*(x-y)else 0
o(u,v)=if(v> -u)==(v<u)then(v,u,v<u)else(u,v,v<u)
First post! (oh wait, this isn't SlashDot?)
My entry for Team Clojure, 685 528 characters.
(defn ulam[n] (let [z (atom [1 0 0 {[0 0] " "}])
m [[0 1 1 0][2 -1 0 -1][2 0 -1 0][2 0 0 1][2 0 1 0]]
p (fn [x] (if (some #(zero? (rem x %)) (range 2 x)) " " "*"))]
(doseq [r (range 1 (inc n)) q (range (count m)) [a b dx dy] [(m q)]
s (range (+ (* a r) b))]
(let [i (inc (first #z)) x (+ dx (#z 1)) y (+ dy (#z 2))]
(reset! z [i x y (assoc (last #z) [x y] (p i))])))
(doseq [y (range (- n) (inc n))] (doseq [x (range (- n) (inc n))]
(print ((last #z) [x y]))) (println))))
(ulam (dec (.nextInt (java.util.Scanner. System/in))))---
Input:
5
Output:
* *
* *
* * *
* * *
* ** *
* *
* *
* *
* *
Input:
10
Output:
* * * *
* * *
* * *
* * *
* * * *
* * *
* * * * * *
* * * * *
* * *
* * ** * * *
* * *
* *
* * * * * *
* * * *
* *
* * * * *
* *
* * *
* * * *
Not as beautiful as the previous C entry, but here's mine.
note: I'm posting because it takes a different approach than the previous one, mainly
there's no coordinate remapping
it gives the same results as the tests
it works with input > 9 (two digits - no -47 trick)
enum directions_e { dx, up, sx, dn } direction;
int main (int argc, char **argv) {
int len = atoi(argv[1]);
int offset = 2*len-1;
int size = offset*offset;
char *matrix = malloc(size);
int startfrom = 2*len*(len-1);
matrix[startfrom] = 1;
int next = startfrom;
int count = 1;
int i, step = 1;
direction = dx ;
for (;; step++ )
do {
for ( i = 0 ; i < step ; i++ ) {
switch ( direction ) {
case dx:
next++;
break;
case up:
next = next - offset;
break;
case sx:
next--;
break;
case dn:
next = next + offset;
}
int div = ++count;
do {
div--;
} while ( count % div );
if ( div > 1 ) {
matrix[next] = ' ';
}
else {
matrix[next] = '*';
}
if (count >= size) goto dontusegoto;
}
direction = ++direction % 4;
} while ( direction %2);
dontusegoto:
for ( i = 0 ; i < size ; i++ ) {
putchar(matrix[i]);
if ( !((i+1) % offset) ) putchar('\n');
}
return 0;
}
which, adequately translated in unreadable C, becomes 339 chars.
compile with: gcc -o ulam_compr ulam_compr.c works on osx
i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465)
and debian Lenny.
main(int a,char**v){
int l=atoi(v[1]),o=2*l-1,z=o*o,n=2*l*(l-1),c=1,i,s=1,d;
char*m=malloc(z);
m[n]=1;
for(;;s++)do{
for(i=0;i<s;i++){
if(d==0)n++;
else if(d==1)n-=o;
else if(d==2)n--;
else n+=o;
int j=++c;
while(c%--j);
if(j>1)m[n]=' ';else m[n]='*';
if(c>=z)goto g;
}d=++d%4;}while(d%2);
g:for(i=0;i<z;i++){
putchar(m[i]);
if(!((i+1)%o))putchar('\n');
}
}
Here is some output:
$ ./ulam_compr 3
* *
* *
* **
*
*
$ ./ulam_compr 5
* *
* *
* * *
* * *
* ** *
* *
* *
* *
* *
Python - 176
This one starts with a big long list of newline characters and replaces all of them except for the ones that are needed at the end of the lines.
Starting at the centre, the algorithm peeps around the lefthand corner at each step. If there is a newline character there, turn left otherwise keep going forward.
w=input()*2;v=w-1;a=['\n']*v*w;p=w/2*v-1;d=0;z=[w,-1,-w,1]
for i in range(v*v):a[p]=' *'[i and all((i+1)%f for f in range(2,i))];d=d%4-(a[p+z[d-1]]<' ');p+=z[d]
print"".join(a)
Python - 177
Using a string avoids "join" but ends up one byte longer since the string is immutable
w=input()*2;v=w-1;a='\n'*v*w;p=w/2*v-1;d=0;z=[w,-1,-w,1]
for i in range(v*v):a=a[:p]+' *'[i and all((i+1)%f for f in range(2,i))]+a[p+1:];d=d%4-(a[p+z[d-1]]<' ');p+=z[d]
print a
Python, 299 characters:
from sys import *
def t(n):
if n==1:return ' '
for i in range(2,n):
if n%i==0:return ' '
return '*'
i=int(stdin.readline())
s=i*2-1
o=['\n']*(s+1)*s
c=1
g=2
d=0
p=(s+2)*(i-1)
for n in range(s**2):
o[p]=t(n+1);p+=[1,-s-1,-1,s+1][d%4];g-=1
if g==c:d+=1
if g==0:d+=1;c+=1;g=2*c
print ''.join(o)
Lua, 302 characters
s=...t={" "}n=2 function p()for j=2,n-1 do if n%j==0 then n=n+1 return" "end
end n=n+1 return"*"end for i=2,s do for k=#t,1,-1 do t[k+1]=t[k]..p()end
t[1]=""for k=1,i*2-1 do t[1]=p()..t[1]end for k=2,#t do t[k]=p()..t[k]end
t[#t+1]=""for k=1,i*2-1 do t[#t]=t[#t]..p()end end print(table.concat(t,"\n"))
Output from lua ulam.lua 6:
* *
* *
* * * *
* * *
* * *
* ** *
* * *
* *
* * * *
* *
*
Python 284 266 256 243 242 240 char
I wanted to try recursion, I'm sure it may be heavily shortened:
r=range
def f(n):
if n<2:return[[4]]
s=2*n-1;z=s*s;c=[r(z-2*s+2,z-3*s+2,-1)];e=1
for i in f(n-1):c+=[[c[0][0]+e]+i+[c[0][-1]-e]];e+=1
c+=[r(z-s+1,z+1)];return c
for l in f(input()):print''.join(' *'[all(x%f for f in r(2,x))]for x in l)
edited under suggestion in comments
Mathematica 243
l = Length; t = Table; f = Flatten;
h#m_ := With[{x = l#m[[1]], y = l#m}, f[{{Reverse#t[w + y + (x y), {w, x + 2}]},
t[f[{(x y) + x + y + 2 + w, m[[w]], (x y) + y - w + 1}], {w, y}],
{t[2 + y + x + y + w + (x y), {w, x + 2}]}}, 1]];
m_~g~z_ := Nest[h, m, z] /. {_?PrimeQ -> "\[Bullet]", _Integer -> ""};
Grid[{{1}}~g~#, Frame -> All] &
Usage
13 windings:
Grid[{{1}}~g~#, Frame -> All] &[13]