Babylonian spiral: Difference between revisions

Content added Content deleted
m (→‎{{header|Raku}}: rephrase logic, less bracketing)
Line 486: Line 486:
<syntaxhighlight lang="raku" line>sub babylonianSpiral (\nsteps) {
<syntaxhighlight lang="raku" line>sub babylonianSpiral (\nsteps) {
my @squareCache = (0..nsteps).hyper.map: *²;
my @squareCache = (0..nsteps).hyper.map: *²;
my @dxys = [[0, 0], [0, 1]];
my @dxys = [0, 0], [0, 1];
my $dsq = 1;
my $dsq = 1;


Line 495: Line 495:
until @candidates.elems {
until @candidates.elems {
$dsq++;
$dsq++;
for @squareCache.kv -> \i, \a {
for @squareCache.kv -> \i, \a {
last if a > $dsq / 2;
last if a > $dsq/2;
for reverse (0 .. $dsq.sqrt.ceiling) -> \j {
for reverse 0 .. $dsq.sqrt.ceiling -> \j {
last if ( a + my \b = @squareCache[j] ) < $dsq;
last if $dsq > (a + my \b = @squareCache[j]);
if ((a + b) == $dsq) {
next if $dsq != a + b;
@candidates.append: [ [i, j], [-i, j], [i, -j], [-i, -j],
@candidates.append: [i, j], [-i, j], [i, -j], [-i, -j],
[j, i], [-j, i], [j, -i], [-j, -i] ]
[j, i], [-j, i], [j, -i], [-j, -i]
}
}
}
}
}