Railway circuit: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(17 intermediate revisions by 5 users not shown)
Line 41:
Count the number of circuits   '''Cn,m'''   with   '''n'''   same as above and   '''m''' = 2  to  8
<br><br>
 
=={{header|11l}}==
{{trans|Kotlin}}
 
<syntaxhighlight lang="11l">
-V
RIGHT = 1
LEFT = -1
STRAIGHT = 0
 
F normalize(tracks)
V a = tracks.map(tr -> ‘abc’[tr + 1]).join(‘’)
 
V norm = a
L 0 .< tracks.len
I a < norm
norm = a
a = a[1..]‘’a[0]
 
R norm
 
F full_circle_straight(tracks, nStraight)
I nStraight == 0
R 1B
 
I sum(tracks.map(i -> Int(i == :STRAIGHT))) != nStraight
R 0B
 
V straight = [0] * 12
V i = 0
V idx = 0
L i < tracks.len & idx >= 0
I tracks[i] == :STRAIGHT
straight[idx % 12]++
idx += tracks[i]
i++
 
R !(any((0.<6).map(i -> @straight[i] != @straight[i + 6]))
& any((0.<8).map(i -> @straight[i] != @straight[i + 4])))
 
F full_circle_right(tracks)
I sum(tracks) * 30 % 360 != 0
R 0B
 
V rTurns = [0] * 12
V i = 0
V idx = 0
L i < tracks.len & idx >= 0
I tracks[i] == :RIGHT
rTurns[idx % 12]++
idx += tracks[i]
i++
 
R !(any((0.<6).map(i -> @rTurns[i] != @rTurns[i + 6]))
& any((0.<8).map(i -> @rTurns[i] != @rTurns[i + 4])))
 
T PermutationsGen
[Int] indices, choices
carry = 0
 
F (numPositions, choices)
.indices = [0] * numPositions
.choices = copy(choices)
 
F next()
.carry = 1
 
V i = 1
L i < .indices.len & .carry > 0
.indices[i] += .carry
.carry = 0
I .indices[i] == .choices.len
.carry = 1
.indices[i] = 0
i++
 
R .indices.map(i -> @.choices[i])
 
F has_next()
R .carry != 1
 
F get_permutations_gen(nCurved, nStraight)
assert((nCurved + nStraight - 12) % 4 == 0, ‘input must be 12 + k * 4’)
 
V trackTypes = [:RIGHT, :LEFT]
I nStraight != 0
I nCurved == 12
trackTypes = [:RIGHT, :STRAIGHT]
E
trackTypes = [:RIGHT, :LEFT, :STRAIGHT]
 
R PermutationsGen(nCurved + nStraight, trackTypes)
 
F report(sol, numC, numS)
print("\n#. solution(s) for C#.,#. ".format(sol.len, numC, numS))
I numC <= 20
L(tracks) sorted(sol.values())
L(track) tracks
print(‘#2 ’.format(track), end' ‘’)
print()
 
F circuits(nCurved, nStraight)
[String = [Int]] solutions
 
V gen = get_permutations_gen(nCurved, nStraight)
L gen.has_next()
V tracks = gen.next()
I !full_circle_straight(tracks, nStraight)
L.continue
I !full_circle_right(tracks)
L.continue
solutions[normalize(tracks)] = tracks
 
report(solutions, nCurved, nStraight)
 
L(n) (12..24).step(4)
circuits(n, 0)
circuits(12, 4)
</syntaxhighlight>
 
{{out}}
<pre>
 
1 solution(s) for C12,0
1 1 1 1 1 1 1 1 1 1 1 1
 
1 solution(s) for C16,0
1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 -1
 
6 solution(s) for C20,0
1 1 1 1 -1 1 1 1 1 -1 1 1 1 1 -1 1 1 1 1 -1
1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 -1
1 1 1 1 1 1 -1 1 1 -1 1 1 1 1 1 1 -1 1 1 -1
1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 -1 1 -1
1 1 1 1 1 1 1 -1 1 1 -1 1 1 1 1 1 1 1 -1 -1
1 1 1 1 1 1 1 1 -1 -1 1 1 1 1 1 1 1 1 -1 -1
 
40 solution(s) for C24,0
 
4 solution(s) for C12,4
1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0
1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0
1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0
1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0
</pre>
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="scheme">
;; R is turn counter in right direction
;; The nb of right turns in direction i
Line 146 ⟶ 291:
(printf "Number of circuits C%d,%d : %d" maxn straight (vector-length *circuits*)))
(when (< (vector-length *circuits*) 20) (for-each writeln *circuits*)))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 183 ⟶ 328:
=={{header|Go}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 382 ⟶ 527:
}
circuits(12, 4)
}</langsyntaxhighlight>
 
{{out}}
Line 412 ⟶ 557:
1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0
</pre>
 
=={{header|J}}==
Implementation (could be further optimized0:<syntaxhighlight lang="j">NB. is circuit valid?
vrwc=: {{ */1=({:,1++/)*/\^j.1r6p1*y }}"1
 
NB. canonical form for circuit:
crwc=: {{ {.\:~,/(i.#y)|."0 1/(,|.)y,:-y }}"1
 
NB. all valid railway circuits with y 30 degree curves
rwc=: {{
r=. EMPTY
h=. -:y
sfx=. (]/.~ 2|+/"1)#:i.2^h
for_pfx. (-h){."1 #:i.2^_3+h do. p=.2|+/pfx
r=. r,~.crwc (#~ vrwc) _1^pfx,"1 p{sfx
end.
'SLR'{~~.r
}}
 
NB. all valid railway circuits with y 30 degree curves and x straight segments
rwcs=: {{
r=. EMPTY
h=. -:y+x
sfx=. (h#3)#:i.3^h
for_pfx. sfx do.
r=. r,~.crwc (#~ vrwc) (#~ x= 0 +/ .="1]) 0 1 _1{~pfx,"1 sfx
end.
'SLR'{~~.r
}}</syntaxhighlight>
 
Task examples:<syntaxhighlight lang="j"> rwc 12
LLLLLLLLLLLL
rwc 16
LLLLLLLRLLLLLLLR
rwc 20
LLLLLLLLRRLLLLLLLLRR
LLLLLLLRLLRLLLLLLLRR
LLLLLLLRLRLLLLLLLRLR
LLLLLLRLLRLLLLLLRLLR
LLLLLRLLLRLLLLLRLLLR
LLLLRLLLLRLLLLRLLLLR
#rwc 24
40
#rwc 28
293
#rwc 32
2793
4 rwcs 12
LLLLLLSSLLLLLLSS
LLLLLSLSLLLLLSLS
LLLLSLLSLLLLSLLS
LLLSLLLSLLLSLLLS</syntaxhighlight>
 
Symbols:
R: right (-1)
L: left ( 1)
S: straight ( 0)
 
=={{header|Java}}==
{{works with|Java|8}}
<langsyntaxhighlight lang="java">package railwaycircuit;
 
import static java.util.Arrays.stream;
Line 576 ⟶ 778:
return carry != 1;
}
}</langsyntaxhighlight>
<pre>1 solution(s) for C12,0
1 1 1 1 1 1 1 1 1 1 1 1
Line 607 ⟶ 809:
 
=={{header|Julia}}==
[[File:Railway_circuit_examples.png|320px]]
<lang ruby>
<syntaxhighlight lang="julia">
<pre>
#=
Exhautive search for complete railway (railroad track) circuits. A valid circuit begins and ends at the
Exhaustive search for complete railway (railroad track) circuits. A valid circuit begins and ends at the
same point faciing in the same direction. Track are either right handed or left handed 30 degree
curves or are straight track that can be placed at -90, 0, or 90 degree angles from starting points.
Line 623 ⟶ 826:
So, the equivalence group is composed: (rotational permutations) X (scalar multiplication by -1)
 
There is another factor in equivalence groups not mentioned in the task as of June 2022: <em>vector__vector reversal</em>reversal__.
If vector__vector reversalreversal__ is included, (1 -1 1 1 1 -1 -1) is considered to group with (-1 -1 1 1 1 -1 1).
 
Furthermore, if chosen, reversal of the turns vector (not mentioned as a source of symmetry in the task)
Line 638 ⟶ 841:
 
Graphic displays of solutions are via a Gtk app and Cairo graphics.
=#
</pre>
""" Rosetta Code task rosettacode.org/wiki/Railway_circuit. """
 
Line 840 ⟶ 1,043:
end
 
# Note 4:2:36 takes a long time, for shorter runs do 4:4:24 here for i
for i = 4:2:36, rev in false:true, str in false:true
str && i > 16 && continue
@time allvalidcircuits(i; verbose = !str && i < 28, reversals = rev, straight = str, graphic = i == 24)
end
</langsyntaxhighlight>{{out}}
<pre>
For N of 4 and curved track, including reversed curves:
Line 1,201 ⟶ 1,405:
588.433178 seconds (2.16 G allocations: 610.226 GiB, 19.45% gc time)
 
For N of 32 and icurvedqcurved track, including reversed curves: u
Found 2793 unique valid circuits.
1010.080701 seconds (8.84 G allocations: 2.703 TiB, 14.50% gc time)
Line 1,209 ⟶ 1,413:
1333.508776 seconds (8.73 G allocations: 2.669 TiB, 16.66% gc time)
 
For N of 34 and icurvedtcurved track, including reversed curves:
Found 1747797 unique valid circuits.
62246864.710332782575 seconds (36.46 G allocations: 11.141 TiB, 18.8728% gc time, 0.00% compilation time)
 
For N of 34 and curved track, excluding reversed curves:
Found 3975 unique valid circuits.
5092.741859 seconds (35.46 G allocations: 10.836 TiB, 18.86% gc time, 0.00% compilation time)
 
For N of 36 and curved track, including reversed curves:
Found 30117 unique valid circuits.
45086.603365 seconds (170.55 G allocations: 57.081 TiB, 22.00% gc time)
 
For N of 36 and curved track, excluding reversed curves:
Found 15391 unique valid circuits.
45082.100206 seconds (154.85 G allocations: 51.828 TiB, 21.72% gc time)
</pre>
 
Line 1,221 ⟶ 1,433:
{{trans|Java}}
It takes several minutes to get up to n = 32. I called it a day after that!
<langsyntaxhighlight lang="scala">// Version 1.2.31
 
const val RIGHT = 1
Line 1,348 ⟶ 1,560:
for (n in 12..32 step 4) circuits(n, 0)
circuits(12, 4)
}</langsyntaxhighlight>
 
{{out}}
Line 1,386 ⟶ 1,598:
It took about 2 min 25 s to get the result for a maximum of 32 and 41 min 15 s for a maximum of 36.
 
<langsyntaxhighlight Nimlang="nim">import algorithm, sequtils, strformat, strutils, sugar, tables
 
type
Line 1,513 ⟶ 1,725:
for n in countup(12, 36, 4):
circuits(n, 0)
circuits(12, 4)</langsyntaxhighlight>
 
{{out}}
Line 1,547 ⟶ 1,759:
{{trans|Raku}}
{{libheader|ntheory}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 1,617 ⟶ 1,829:
 
allvalidcircuits($_, True) for 12, 16, 20;
allvalidcircuits($_, True, True) for 4, 6, 8;</langsyntaxhighlight>
{{out}}
<pre>For N of 12 and curved track:
Line 1,656 ⟶ 1,868:
=={{header|Phix}}==
{{trans|Go}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<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>
Line 1,807 ⟶ 2,019:
<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>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,836 ⟶ 2,048:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">from itertools import count, islice
import numpy as np
from numpy import sin, cos, pi
Line 1,982 ⟶ 2,194:
sols.append(s)
 
draw_all(sols[:40])</langsyntaxhighlight>
 
=={{header|Racket}}==
Line 1,989 ⟶ 2,201:
Made functional, so builds the track up with lists. A bit more expense spent copying vectors, but this solution avoids mutation (except internally in <code>vector+=</code> . Also got rid of the maximum workload counter.
 
<langsyntaxhighlight lang="racket">#lang racket
 
(define-syntax-rule (vector+= v idx i)
Line 2,059 ⟶ 2,271:
(gen 20)
(gen 24)
(gen 12 4))</langsyntaxhighlight>
 
{{out}}
Line 2,093 ⟶ 2,305:
 
{{trans|Julia}}
<syntaxhighlight lang="raku" perl6line>#!/usr/bin/env raku
 
# 20200406 Raku programming solution
Line 2,145 ⟶ 2,357:
 
allvalidcircuits($_, $_ < 28) for 12, 16, 20; # 12, 16 … 36
allvalidcircuits($_, $_ < 12, True) for 4, 6, 8; # 4, 6 … 16;</langsyntaxhighlight>
{{out}}
<pre>For N of 12 and curved track:
Line 2,186 ⟶ 2,398:
{{trans|Kotlin}}
 
<langsyntaxhighlight lang="swift">enum Track: Int, Hashable {
case left = -1, straight, right
}
Line 2,361 ⟶ 2,573:
}
 
circuits(nCurved: 12, nStraight: 4)</langsyntaxhighlight>
 
{{out}}
Line 2,392 ⟶ 2,604:
 
=={{header|Wren}}==
{{trans|KotlinJulia}}
{{libheader|Wren-strseq}}
{{libheader|Wren-math}}
Terminal output only.
{{libheader|Wren-fmt}}
{{libheader|Wren-trait}}
Takes over 13.5 minutes to get up to n = 28. I gave up after that.
<lang ecmascript>import "/str" for Str
import "/math" for Nums
import "/fmt" for Fmt
import "/trait" for Stepped
 
A tough task for the Wren interpreter requiring about 7 minutes 48 seconds to run. Unlike the Julia example, I've not attempted the straight track for N = 16 (which I estimate would take about an hour in isolation) and have not tried to go beyond N = 24.
var RIGHT = 1
<syntaxhighlight lang="wren">import "./seq" for Lst
var LEFT = -1
import "./math" for Int, Nums
var STRAIGHT = 0
 
// Returns whether 'a' and 'b' are approximately equal within a tolerance of 'tol'.
var normalize = Fn.new { |tracks|
var IsApprox = Fn.new { |a, b, tol| (a - b).abs <= tol }
var size = tracks.count
var a = List.filled(size, null)
for (i in 0...size) a[i] = "abc"[tracks[i] + 1]
 
// Returns whether a1 < a2 where 'a1' and 'a2' are lists of numbers.
/* Rotate the array and find the lexicographically lowest order
var isLess = Fn.new { |a1, a2|
to allow the hashmap to weed out duplicate solutions. */
varfor norm(pair =in aLst.joinzip(a1, a2)) {
if (pair[0] > pair[1]) return false
(0...size).each { |i|
varif s(pair[0] =< a.join(pair[1]) return true
if (Str.lt(s, norm)) norm = s
var tmp = a[0]
for (j in 1...size) a[j - 1] = a[j]
a[size - 1] = tmp
}
return norma1.count < a2.count
}
 
// Represents a 2D point.
var fullCircleStraight = Fn.new { |tracks, nStraight|
class Point {
if (nStraight == 0) return true
construct new(x, y) {
_x = x
_y = y
}
 
x { _x }
// do we have the requested number of straight tracks
y { _y }
if (tracks.count { |t| t == STRAIGHT } != nStraight) return false
 
+(other) { Point.new(this.x + other.x, this.y + other.y) }
// check symmetry of straight tracks: i and i + 6, i and i + 4
 
var straight = List.filled(12, 0)
==(other) { IsApprox.call(this.x, other.x, 0.01) && IsApprox.call(this.y, other.y, 0.01) }
var i = 0
 
var idx = 0
toString { "(%(_x), %(_y))" }
while (i < tracks.count && idx >= 0) {
if (tracks[i] == STRAIGHT) straight[idx % 12] = straight[idx % 12] + 1
idx = idx + tracks[i]
i = i + 1
}
return !((0..5).any { |i| straight[i] != straight[i + 6] } &&
(0..7).any { |i| straight[i] != straight[i + 4] })
}
 
// A curve section 30 degrees is 1/12 of a circle angle or π/6 radians.
var fullCircleRight = Fn.new { |tracks|
var twelveSteps = List.filled(12, null)
// all tracks need to add up to a multiple of 360
for (a in 0..11) twelveSteps[a] = Point.new((Num.pi * (a+1)/6).sin, (Num.pi * (a+1)/6).cos)
if (Nums.sum(tracks.map { |t| t * 30 }) % 360 != 0) return false
 
// A straight section 90 degree angle is 1/4 of a circle angle or π/2 radians.
// check symmetry of right turns: i and i + 6, i and i + 4
var rTurnsfourSteps = List.filled(124, 0null)
for (a in 0..3) fourSteps[a] = Point.new((Num.pi * (a+1)/2).sin, (Num.pi * (a+1)/2).cos)
var i = 0
 
var idx = 0
// Returns whether 'turns' and 'groupMember' are in an equivalence group.
while (i < tracks.count && idx >= 0) {
var isInEquivalenceGroup = Fn.new { |turns, groupMember, reversals|
if (tracks[i] == RIGHT) rTurns[idx % 12] = rTurns[idx % 12] + 1
if (Lst.areEqual(groupMember, turns)) return true
idx = idx + tracks[i]
var iturns2 = i + 1turns.toList
for (i in 1...turns.count) {
if (Lst.areEqual(groupMember, Lst.rshift(turns2, 1))) return true
}
returnvar !((0invTurns = turns..5).anymap { |ie| rTurns[i](e !== rTurns[i0) +? 6]0 }: &&-e }.toList
if (Lst.areEqual(groupMember, invTurns)) return true
(0..7).any { |i| rTurns[i] != rTurns[i + 4] })
for (i in 1...invTurns.count) {
if (Lst.areEqual(groupMember, Lst.rshift(invTurns, 1))) return true
}
if (reversals) {
var revTurns = turns[-1..0]
if (Lst.areEqual(groupMember, revTurns)) return true
var revTurns2 = revTurns.toList
for (i in 1...revTurns.count) {
if (Lst.areEqual(groupMember, Lst.rshift(revTurns2, 1))) return true
}
invTurns = revTurns.map { |e| (e == 0) ? 0 : -e }.toList
if (Lst.areEqual(groupMember, invTurns)) return true
for (i in 1...invTurns.count) {
if (Lst.areEqual(groupMember, Lst.rshift(invTurns, 1))) return true
}
}
return false
}
 
// Returns the maximum member of the equivalence group containing 'turns'.
class PermutationsGen {
var maximumOfSymmetries = Fn.new { |turns, groupsFound, reversals|
construct new(numPositions, choices) {
var maxOfGroup = turns.toList
_indices = List.filled(numPositions, 0)
for (i in 0...turns.count) {
_sequence = List.filled(numPositions, 0)
_carryvar t = 0Lst.rshift(turns.toList, i)
_choicesgroupsFound[t.toString] = choicestrue
if (isLess.call(maxOfGroup, t)) maxOfGroup = t
}
var invTurns = turns.map { |e| (e == 0) ? 0 : -e }
 
for (i in 0...invTurns.count) {
next {
_carryvar t = 1Lst.rshift(invTurns.toList, i)
groupsFound[t.toString] = true
/* The generator skips the first index, so the result will always start
if (isLess.call(maxOfGroup, t)) maxOfGroup = t
with a right turn (0) and we avoid clockwise/counter-clockwise
}
duplicate solutions. */
if (reversals) {
var i = 1
whilevar (irevTurns <= _indicesturns[-1..count && _carry > 0) {]
for (i in 0...revTurns.count) {
_indices[i] = _indices[i] + _carry
_carryvar t = 0Lst.rshift(revTurns.toList, i)
if (_indicesgroupsFound[it.toString] == _choices.count) {true
if (isLess.call(maxOfGroup, t)) _carrymaxOfGroup = 1t
_indices[i] = 0}
var revInvTurns = revTurns.map { |e| (e == 0) ? 0 : -e }
for (i = iin +0...revInvTurns.count) 1{
var t = Lst.rshift(revInvTurns.toList, i)
groupsFound[t.toString] = true
if (isLess.call(maxOfGroup, t)) maxOfGroup = t
}
for (j in 0..._indices.count) _sequence[j] = _choices[_indices[j]]
return _sequence
}
return maxOfGroup
 
hasNext { _carry != 1 }
}
 
// Returns true if the path of 'turns' returns to starting point, and on that return is
var getPermutationsGen = Fn.new { |nCurved, nStraight|
// moving in a direction opposite to the starting direction.
if ((nCurved + nStraight - 12) % 4 != 0) Fiber.abort("input must be 12 + k * 4")
var isClosedPath = Fn.new { |turns, straight, start|
var trackTypes = (nStraight == 0) ? [RIGHT, LEFT] :
if ((Nums.sum(turns) % (straight ? 4 : 12)) != 0) return false
(nCurved == 12) ? [RIGHT, STRAIGHT] : [RIGHT, LEFT, STRAIGHT]
var angle = 0
return PermutationsGen.new(nCurved + nStraight, trackTypes)
var point = Point.new(start.x, start.y)
}
if (straight) {
for (turn in turns) {
var report = Fn.new { |sol, numC, numS|
var size angle = sol.countangle + turn
point = point + fourSteps[angle % 4]
Fmt.print("\n$d solution(s) for C$d,$d", size, numC, numS)
if (numC <= 20) {}
} else {
sol.values.each { |tracks|
for tracks.each { |t| Fmt.write("$2dturn ",in tturns) }{
System.print()angle = angle + turn
point = point + twelveSteps[angle % 12]
}
}
return point == start
}
 
// Finds and returns all valid circuits on the following basis.
var circuits = Fn.new { |nCurved, nStraight|
//
var solutions = {}
// Count the complete circuits by their equivalence groups. Show the unique
var gen = getPermutationsGen.call(nCurved, nStraight)
// highest sorting lists from each equivalence group if verbose.
while (gen.hasNext) {
//
var tracks = gen.next
// Use 30 degree curved track if straight is false, otherwise straight track.
if (!fullCircleStraight.call(tracks, nStraight)) continue
//
if (!fullCircleRight.call(tracks)) continue
// Allow reversed circuits if otherwise in another grouup if reversals is false,
solutions[normalize.call(tracks)] = tracks.toList
// otherwise do not consider reversed order lists unique.
var allValidCircuits = Fn.new { |n, verbose, straight, reversals|
var found = []
var groupMembersFound = {}
var t1 = straight ? "straight" : "curved"
var t2 = (reversals ? "excl" : "incl") + "uding reversed curves: "
System.print("\nFor N of %(n) and %(t1) track, %(t2)")
for (i in 0..(straight ? 3.pow(n)-1 : 2.pow(n)-1)) {
var turns
if (straight) {
var digs = Int.digits(i, 3)[-1..0]
if (digs.count < n) digs = digs + ([0] * (n - digs.count))
turns = digs.map { |d| (d == 0) ? 0 : ((d == 1) ? 1 : -1) }.toList
} else {
var digs = Int.digits(i, 2)[-1..0]
if (digs.count < n ) digs = digs + ([0] * (n - digs.count))
turns = digs.map { |d| (d == 0) ? 1 : -1 }.toList
}
if (isClosedPath.call(turns, straight, Point.new(0, 0)) &&
!groupMembersFound.containsKey(turns.toString)) {
if (found.isEmpty || found.all { |t| !isInEquivalenceGroup.call(turns, t, false) }) {
var canon = maximumOfSymmetries.call(turns, groupMembersFound, reversals)
if (verbose) System.print(canon)
found.add(canon)
}
}
}
System.print("Found %(found.count) unique valid circuit(s).")
report.call(solutions, nCurved, nStraight)
return found
}
 
var n = 4
for (n in Stepped.new(12..24, 4)) circuits.call(n, 0)
while (n <= 24) {
circuits.call(12, 4)</lang>
for (rev in [false, true]) {
for (str in [false, true]) {
if (str && n > 14) continue
allValidCircuits.call(n, !str, str, rev)
}
}
n = n + 2
}</syntaxhighlight>
 
{{out}}
Note that the solutions for C20,0 are in a different order to the Kotlin entry.
<pre>
For N of 4 and curved track, including reversed curves:
1 solution(s) for C12,0
Found 0 unique valid circuit(s).
1 1 1 1 1 1 1 1 1 1 1 1
 
For N of 4 and straight track, including reversed curves:
1 solution(s) for C16,0
Found 1 unique valid circuit(s).
1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 -1
 
For N of 4 and curved track, excluding reversed curves:
6 solution(s) for C20,0
Found 0 unique valid circuit(s).
1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 -1 1 -1
1 1 1 1 1 1 1 1 -1 -1 1 1 1 1 1 1 1 1 -1 -1
1 1 1 1 1 1 1 -1 1 1 -1 1 1 1 1 1 1 1 -1 -1
1 1 1 1 1 1 -1 1 1 -1 1 1 1 1 1 1 -1 1 1 -1
1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 -1
1 1 1 1 -1 1 1 1 1 -1 1 1 1 1 -1 1 1 1 1 -1
 
For N of 4 and straight track, excluding reversed curves:
40 solution(s) for C24,0
Found 1 unique valid circuit(s).
 
For N of 6 and curved track, including reversed curves:
243 solution(s) for C28,0
Found 0 unique valid circuit(s).
 
For N of 6 and straight track, including reversed curves:
4 solution(s) for C12,4
Found 1 unique valid circuit(s).
1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0
 
1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0
For N of 6 and curved track, excluding reversed curves:
1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0
Found 0 unique valid circuit(s).
1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0
 
For N of 6 and straight track, excluding reversed curves:
Found 1 unique valid circuit(s).
 
For N of 8 and curved track, including reversed curves:
Found 0 unique valid circuit(s).
 
For N of 8 and straight track, including reversed curves:
Found 7 unique valid circuit(s).
 
For N of 8 and curved track, excluding reversed curves:
Found 0 unique valid circuit(s).
 
For N of 8 and straight track, excluding reversed curves:
Found 7 unique valid circuit(s).
 
For N of 10 and curved track, including reversed curves:
Found 0 unique valid circuit(s).
 
For N of 10 and straight track, including reversed curves:
Found 23 unique valid circuit(s).
 
For N of 10 and curved track, excluding reversed curves:
Found 0 unique valid circuit(s).
 
For N of 10 and straight track, excluding reversed curves:
Found 15 unique valid circuit(s).
 
For N of 12 and curved track, including reversed curves:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Found 1 unique valid circuit(s).
 
For N of 12 and straight track, including reversed curves:
Found 141 unique valid circuit(s).
 
For N of 12 and curved track, excluding reversed curves:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Found 1 unique valid circuit(s).
 
For N of 12 and straight track, excluding reversed curves:
Found 95 unique valid circuit(s).
 
For N of 14 and curved track, including reversed curves:
Found 0 unique valid circuit(s).
 
For N of 14 and straight track, including reversed curves:
Found 871 unique valid circuit(s).
 
For N of 14 and curved track, excluding reversed curves:
Found 0 unique valid circuit(s).
 
For N of 14 and straight track, excluding reversed curves:
Found 465 unique valid circuit(s).
 
For N of 16 and curved track, including reversed curves:
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
Found 1 unique valid circuit(s).
 
For N of 16 and curved track, excluding reversed curves:
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
Found 1 unique valid circuit(s).
 
For N of 18 and curved track, including reversed curves:
[1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1]
Found 1 unique valid circuit(s).
 
For N of 18 and curved track, excluding reversed curves:
[1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1]
Found 1 unique valid circuit(s).
 
For N of 20 and curved track, including reversed curves:
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1]
Found 6 unique valid circuit(s).
 
For N of 20 and curved track, excluding reversed curves:
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1]
Found 6 unique valid circuit(s).
 
For N of 22 and curved track, including reversed curves:
[1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1]
Found 5 unique valid circuit(s).
 
For N of 22 and curved track, excluding reversed curves:
[1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1]
Found 4 unique valid circuit(s).
 
For N of 24 and curved track, including reversed curves:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1]
[1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1]
Found 40 unique valid circuit(s).
 
For N of 24 and curved track, excluding reversed curves:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1]
[1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1]
[1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1]
Found 27 unique valid circuit(s).
</pre>
 
=={{header|zkl}}==
{{trans|EchoLisp}}
<langsyntaxhighlight lang="zkl"> // R is turn counter in right direction
// The nb of right turns in direction i
// must be = to nb of right turns in direction i+6 (opposite)
Line 2,631 ⟶ 3,057:
else println("Number of circuits C%,d,%d : %d".fmt(maxn,straight,_circuits.len()));
if(_circuits.len()<20) _circuits.apply2(T(T("toString",*),"println"));
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">gen(12); println();
gen(16); println();
gen(20); println();
gen(24); println();
gen(12,4);</langsyntaxhighlight>
{{out}}
<pre>
9,479

edits