Railway circuit: Difference between revisions
Content added Content deleted
m (added whitespace and highlighting, corrected a typo, added an Oxford comma, aligned examples.) |
m (→{{header|Phix}}: syntax coloured) |
||
Line 1,195: | Line 1,195: | ||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
{{trans|Go}} |
{{trans|Go}} |
||
<lang Phix> |
<!--<lang Phix>(phixonline)--> |
||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
|||
left = -1, |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">right</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
straight = 0 |
|||
<span style="color: #000000;">left</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #000000;">straight</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
function fullCircleStraight(sequence tracks, integer nStraight) |
|||
if nStraight == 0 then return true end if |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">fullCircleStraight</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">nStraight</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">nStraight</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
-- check symmetry of straight tracks: i and i + 6, i and i + 4 |
|||
sequence straightTracks =repeat(0,12) |
|||
<span style="color: #000080;font-style:italic;">-- check symmetry of straight tracks: i and i + 6, i and i + 4</span> |
|||
integer idx = 0 |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">straightTracks</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;">12</span><span style="color: #0000FF;">)</span> |
|||
for i=1 to length(tracks) do |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">idx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
if tracks[i] == straight then |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
straightTracks[mod(idx,12)+1] += 1 |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">straight</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">stdx</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">idx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span> |
|||
idx += tracks[i] |
|||
<span style="color: #000000;">straightTracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">stdx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
if idx<0 then exit end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end for |
|||
<span style="color: #000000;">idx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
bool any = false |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">idx</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
for i=1 to 6 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
if straightTracks[i] != straightTracks[i+6] then |
|||
<span style="color: #004080;">bool</span> <span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span> |
|||
any = true |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span> |
|||
exit |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">straightTracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">straightTracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">6</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span> |
|||
end for |
|||
<span style="color: #008080;">exit</span> |
|||
if not any then return true end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
any = false |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
for i=1 to 8 do |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">any</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
if straightTracks[i] != straightTracks[i+4] then |
|||
<span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span> |
|||
any = true |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">8</span> <span style="color: #008080;">do</span> |
|||
exit |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">straightTracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">straightTracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> |
|||
end if |
|||
<span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span> |
|||
end for |
|||
<span style="color: #008080;">exit</span> |
|||
return not any |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #008080;">not</span> <span style="color: #000000;">any</span> |
|||
function fullCircleRight(sequence tracks) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
-- all tracks need to add up to a multiple of 360, aka 12*30 |
|||
integer tot := 0 |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">fullCircleRight</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">)</span> |
|||
for i=1 to length(tracks) do |
|||
<span style="color: #000080;font-style:italic;">-- all tracks need to add up to a multiple of 360, aka 12*30</span> |
|||
tot += tracks[i] |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">tot</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">0</span> |
|||
end for |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
if mod(tot,12)!=0 then |
|||
<span style="color: #000000;">tot</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
return false |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tot</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
<span style="color: #008080;">return</span> <span style="color: #004600;">false</span> |
|||
-- check symmetry of right turns: i and i + 6, i and i + 4 |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
sequence rTurns = repeat(0,12) |
|||
integer idx = 0 |
|||
<span style="color: #000080;font-style:italic;">-- check symmetry of right turns: i and i + 6, i and i + 4</span> |
|||
for i=1 to length(tracks) do |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">rTurns</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;">12</span><span style="color: #0000FF;">)</span> |
|||
if tracks[i] == right then |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">idx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
rTurns[mod(idx,12)+1] += 1 |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">right</span> <span style="color: #008080;">then</span> |
|||
idx += tracks[i] |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">rtdx</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">idx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span> |
|||
if idx<0 then exit end if |
|||
<span style="color: #000000;">rTurns</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rtdx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
bool any = false |
|||
<span style="color: #000000;">idx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> |
|||
for i=1 to 6 do |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">idx</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
if rTurns[i] != rTurns[i+6] then |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
any = true |
|||
<span style="color: #004080;">bool</span> <span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span> |
|||
exit |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">rTurns</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">rTurns</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">6</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> |
|||
end for |
|||
<span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span> |
|||
if not any then return true end if |
|||
<span style="color: #008080;">exit</span> |
|||
any = false |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
for i=1 to 8 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
if rTurns[i] != rTurns[i+4] then |
|||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">any</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
any = true |
|||
<span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span> |
|||
exit |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">8</span> <span style="color: #008080;">do</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">rTurns</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">rTurns</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> |
|||
end for |
|||
<span style="color: #000000;">any</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span> |
|||
return not any |
|||
<span style="color: #008080;">exit</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
integer carry = 0, lc, sdx, tStraight |
|||
<span style="color: #008080;">return</span> <span style="color: #008080;">not</span> <span style="color: #000000;">any</span> |
|||
sequence choices, indices, tracks |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
procedure next(integer nStraight) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">carry</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">lc</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">sdx</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">tStraight</span> |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">choices</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">indices</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">tracks</span> |
|||
/* The generator skips the first index, so the result will always start |
|||
with a right turn (0) and we avoid clockwise/counter-clockwise |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">next</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">nStraight</span><span style="color: #0000FF;">)</span> |
|||
duplicate solutions. */ |
|||
while true do |
|||
<span style="color: #000080;font-style:italic;">/* The generator skips the first index, so the result will always start |
|||
carry = 1 |
|||
with a right turn (0) and we avoid clockwise/counter-clockwise |
|||
for i=2 to length(indices) do |
|||
duplicate solutions. */</span> |
|||
integer ii = indices[i]+1 |
|||
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span> |
|||
if ii<=lc then |
|||
<span style="color: #000000;">carry</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> |
|||
indices[i] = ii |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">indices</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
tracks[i] = choices[ii] |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">ii</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">indices</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">1</span> |
|||
tStraight += (ii=sdx) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">ii</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">lc</span> <span style="color: #008080;">then</span> |
|||
carry = 0 |
|||
<span style="color: #000000;">indices</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ii</span> |
|||
exit |
|||
<span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">choices</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ii</span><span style="color: #0000FF;">]</span> |
|||
end if |
|||
<span style="color: #000000;">tStraight</span> <span style="color: #0000FF;">+=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">ii</span><span style="color: #0000FF;">=</span><span style="color: #000000;">sdx</span><span style="color: #0000FF;">)</span> |
|||
indices[i] = 1 |
|||
<span style="color: #000000;">carry</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
tracks[i] = choices[1] |
|||
<span style="color: #008080;">exit</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
tStraight -= 1 |
|||
<span style="color: #000000;">indices</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> |
|||
end if |
|||
<span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">choices</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
end for |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">sdx</span> <span style="color: #008080;">then</span> |
|||
if carry or (tStraight=nStraight) then exit end if |
|||
<span style="color: #000000;">tStraight</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span> |
|||
end while |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end procedure |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">carry</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">tStraight</span><span style="color: #0000FF;">=</span><span style="color: #000000;">nStraight</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
procedure circuits(integer nCurved, nStraight) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
atom t0 = time() |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
integer seen = new_dict() |
|||
sequence solutions = {} |
|||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">circuits</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">nCurved</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nStraight</span><span style="color: #0000FF;">)</span> |
|||
integer nCS = nCurved+nStraight |
|||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">solutions</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> |
|||
if mod(nCS-12,4)!=0 then |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">seen</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">new_dict</span><span style="color: #0000FF;">(),</span> |
|||
crash("input must be 12 + k * 4") |
|||
<span style="color: #000000;">nCS</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">nCurved</span><span style="color: #0000FF;">+</span><span style="color: #000000;">nStraight</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nCS</span><span style="color: #0000FF;">-</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
switch nStraight do |
|||
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"input must be 12 + k * 4"</span><span style="color: #0000FF;">)</span> |
|||
case 0: choices = {right, left} |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
case 12: choices = {right, straight} |
|||
<span style="color: #008080;">switch</span> <span style="color: #000000;">nStraight</span> <span style="color: #008080;">do</span> |
|||
default: choices = {right, left, straight} |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">choices</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">right</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">left</span><span style="color: #0000FF;">}</span> |
|||
end switch |
|||
<span style="color: #008080;">case</span> <span style="color: #000000;">12</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">choices</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">right</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">straight</span><span style="color: #0000FF;">}</span> |
|||
lc = length(choices) |
|||
<span style="color: #008080;">default</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">choices</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">right</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">left</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">straight</span><span style="color: #0000FF;">}</span> |
|||
sdx = find(straight,choices) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span> |
|||
tStraight = 0 |
|||
<span style="color: #000000;">lc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">choices</span><span style="color: #0000FF;">)</span> |
|||
indices := repeat(1, nCS) |
|||
<span style="color: #000000;">sdx</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">straight</span><span style="color: #0000FF;">,</span><span style="color: #000000;">choices</span><span style="color: #0000FF;">)</span> |
|||
tracks := repeat(right, nCS) |
|||
<span style="color: #000000;">tStraight</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
carry := 0 |
|||
<span style="color: #000000;">indices</span> <span style="color: #0000FF;">:=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nCS</span><span style="color: #0000FF;">)</span> |
|||
while carry=0 do |
|||
<span style="color: #000000;">tracks</span> <span style="color: #0000FF;">:=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">right</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nCS</span><span style="color: #0000FF;">)</span> |
|||
next(nStraight) |
|||
<span style="color: #000000;">carry</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">0</span> |
|||
if fullCircleStraight(tracks, nStraight) |
|||
<span style="color: #008080;">while</span> <span style="color: #000000;">carry</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">do</span> |
|||
and fullCircleRight(tracks) then |
|||
<span style="color: #000000;">next</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nStraight</span><span style="color: #0000FF;">)</span> |
|||
if getd_index(tracks,seen)=0 then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">fullCircleStraight</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nStraight</span><span style="color: #0000FF;">)</span> |
|||
solutions = append(solutions,tracks) |
|||
<span style="color: #008080;">and</span> <span style="color: #000000;">fullCircleRight</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> |
|||
-- mark all rotations seen |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">getd_index</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">,</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
for i=1 to nCS do |
|||
<span style="color: #000000;">solutions</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">solutions</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">)</span> |
|||
setd(tracks,true,seen) -- (data (=true) is ignored) |
|||
<span style="color: #000080;font-style:italic;">-- mark all rotations seen</span> |
|||
tracks = tracks[2..$]&tracks[1] |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">nCS</span> <span style="color: #008080;">do</span> |
|||
end for |
|||
<span style="color: #7060A8;">setd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">,</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (data (=true) is ignored)</span> |
|||
end if |
|||
<span style="color: #000000;">tracks</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]&</span><span style="color: #000000;">tracks</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end while |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
destroy_dict(seen) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
integer ls := length(solutions) |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span> |
|||
string s = iff(ls=1?"":"s") |
|||
<span style="color: #7060A8;">destroy_dict</span><span style="color: #0000FF;">(</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)</span> |
|||
printf(1,"\n%d solution%s for C%d,%d \n", {ls, s, nCurved, nStraight}) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">ls</span> <span style="color: #0000FF;">:=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">solutions</span><span style="color: #0000FF;">)</span> |
|||
if nCurved <= 20 then |
|||
<span style="color: #004080;">string</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ls</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #008000;">""</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"s"</span><span style="color: #0000FF;">)</span> |
|||
pp(solutions,{pp_Nest,1}) |
|||
<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;">"\n%d solution%s for C%d,%d \n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">ls</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nCurved</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nStraight</span><span style="color: #0000FF;">})</span> |
|||
end if |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">nCurved</span> <span style="color: #0000FF;"><=</span> <span style="color: #000000;">20</span> <span style="color: #008080;">then</span> |
|||
end procedure |
|||
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">solutions</span><span style="color: #0000FF;">,{</span><span style="color: #004600;">pp_Nest</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">})</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
for n=12 to 28 by 4 do |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
circuits(n,0) |
|||
end for |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">12</span> <span style="color: #008080;">to</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">JS</span><span style="color: #0000FF;">?</span><span style="color: #000000;">20</span><span style="color: #0000FF;">:</span><span style="color: #000000;">28</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">by</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span> |
|||
circuits(12,4)</lang> |
|||
<span style="color: #000000;">circuits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
<span style="color: #000000;">circuits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span> |
|||
<!--</lang>--> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |