Smallest square that begins with n: Difference between revisions
Content added Content deleted
(→{{header|Perl}}: prepend Free Pascal version. Extreme reduced runtime.) |
m (→{{header|Phix}}: use pygments, added trans Pascal (neat answer, btw)) |
||
Line 2,174: | Line 2,174: | ||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
<!-- |
<!--(phixonline)--> |
||
⚫ | |||
<span style="color: #008080;">constant</span> <span style="color: #000000;">lim</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">49</span> |
|||
with javascript_semantics |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lim</span><span style="color: #0000FF;">)</span> |
|||
constant lim = 50 |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">found</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
sequence res = repeat(0,lim) |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">found</span><span style="color: #0000FF;"><</span><span style="color: #000000;">lim</span> <span style="color: #008080;">do</span> |
|||
integer n = 1, found = 0 |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">n2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">*</span><span style="color: #000000;">n</span> |
|||
while found<lim do |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">n2</span> <span style="color: #008080;">do</span> |
|||
integer n2 = n*n |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">n2</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">lim</span> <span style="color: #008080;">and</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">n2</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
while n2 do |
|||
<span style="color: #000000;">found</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
if n2<=lim and res[n2]=0 then |
|||
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">n2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span> |
|||
found += 1 |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
res[n2] = n |
|||
<span style="color: #000000;">n2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n2</span><span style="color: #0000FF;">/</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
n2 = floor(n2/10) |
|||
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
end while |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
n += 1 |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lim</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">sq_power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">,{{</span><span style="color: #008000;">"(%d^2)"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})})</span> |
|||
end while |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Smallest squares that begin with 1..%d:\n%s\n"</span><span style="color: #0000FF;">,</span> |
|||
res = columnize({tagset(lim),sq_power(res,2),apply(true,sprintf,{{"(%d^2)"},res})}) |
|||
<span style="color: #0000FF;">{</span><span style="color: #000000;">lim</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join_by</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">,{{</span><span style="color: #008000;">"%2d: %5d %-8s"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">res</span><span style="color: #0000FF;">}),</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)})</span> |
|||
printf(1,"Smallest squares that begin with 1..%d:\n%s\n", |
|||
⚫ | |||
{lim,join_by(apply(true,sprintf,{{"%2d: %5d %-8s"},res}),10,5)}) |
|||
</syntaxhighlight> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 2,207: | Line 2,209: | ||
10: 100 (10^2) 20: 2025 (45^2) 30: 3025 (55^2) 40: 400 (20^2) |
10: 100 (10^2) 20: 2025 (45^2) 30: 3025 (55^2) 40: 400 (20^2) |
||
</pre> |
</pre> |
||
{{trans|Pascal}} |
|||
Same output as the Pascal entry, slight tidy |
|||
<syntaxhighlight lang="phix"> |
|||
with javascript_semantics |
|||
function LowSquareStartN(integer n) |
|||
-- Find lowest square that matches n |
|||
atom sqrtN = sqrt(n), |
|||
sqrtN_10 = sqrt(n*10) |
|||
do |
|||
for res in {trunc(sqrtN),trunc(sqrtN_10)} do |
|||
for k=0 to 1 do |
|||
atom mySqr := res*res |
|||
while mySqr>n do mySqr = floor(mySqr/10) end while |
|||
if mySqr = n then return res end if |
|||
res += 1 |
|||
end for |
|||
end for |
|||
sqrtN *= 10; |
|||
sqrtN_10 *= 10; |
|||
until sqrtN > 10*n; |
|||
?9/0 |
|||
end function |
|||
procedure SquareStartsN() |
|||
-- Find smallest square that begins with N |
|||
integer t |
|||
printf(1,"Test 1 .. 49\n") |
|||
for i=1 to 49 do |
|||
t := LowSquareStartN(i) |
|||
printf(1,"%7d%n",{t*t,mod(i,10)=0}) |
|||
end for |
|||
printf(1,"\n\nTest 999,991 .. 1,000,000\n") |
|||
for i=999991 to 1000*1000 do |
|||
t := LowSquareStartN(i) |
|||
printf(1,"%10d:%10d->%14d\n",{i,t,t*t}) |
|||
end for |
|||
puts(1,"\n") |
|||
end procedure |
|||
SquareStartsN() |
|||
</syntaxhighlight> |
|||
=={{header|Picat}}== |
=={{header|Picat}}== |