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>constant right = 1,
<!--<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]
if sdx then
<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>