Anonymous user
Railway circuit: Difference between revisions
→{{header|Python}}: Reorganized code to be faster and to handle angles other than 30 degrees
(→{{header|Python}}: Reorganized code to be faster and to handle angles other than 30 degrees) |
|||
Line 1,378:
import numpy as np
from numpy import sin, cos, pi
# ANGDIV can't be 2, though
ANGDIV = 12
ANG = 2*pi/ANGDIV
def draw_all(sols):
Line 1,387 ⟶ 1,391:
for d in s:
x0, y0 = xend[-1], yend[-1]
a = turn*
cs, sn = cos(a), sin(a)
ang = a + d*pi/2
cx, cy = x0 + cos(ang), y0 + sin(ang)
da = np.linspace(ang, ang + d*
xs = cx - cos(da)
ys = cy - sin(da)
Line 1,404 ⟶ 1,408:
ax.set_aspect(1)
ls = len(sols)
if ls == 0: return▼
for w, h
for w
for w in range(1, ls + 1)))[1:]▼
▲ return
w = h = 1▼
ax = [[ax]]▼
for i, s in enumerate(sols):
draw_track(ax[i//w
plt.show()
def match_up(this, that, equal_lr, seen):
r_lo, r_hi = 0, 0▼
▲ l_lo, l_hi, r_lo, r_hi = 0, 0, 0, 0
l_n, r_n = len(this), len(that)
tol = 1e-3
Line 1,444 ⟶ 1,458:
for a in this[l_lo:l_hi]:
m_left = a[-2]<<n
for b in that[r_lo:r_hi]:
if
record(int(f'{m:b}'[::-1], base=2))
yield(a[-1] + b[-1])
l_lo, r_lo = l_hi, r_hi
def track_combo(left, right):
n = (left + right)//2
n1 = left + right - n
res = [[] for i in range(right + 1)]▼
def half_track(m, n):▼
▲ alphas = np.exp(1j*np.pi/6*np.arange(12))
▲ def half_track(m):
turns = tuple(1 - 2*(m>>i & 1) for i in range(n))
rcnt = np.cumsum(turns)%
asum = np.sum(alphas[rcnt])
want = asum/alphas[rcnt[-1]]
return np.abs(asum), asum, want, m, turns
for i in range(1<<n):
b = i.bit_count()
if b <= right:
res[b].append(half_track(i, n))
for v in res: v.sort()
res1 = [[] for _ in range(right + 1)]
for i in range(1<<n1):
b = i.bit_count()
res1[b].append(half_track(i, n1))
for v in res: v.sort()
return res, res1
def railway(n):
seen = {}
▲ def record(s):
▲ for _ in range(len(q)):
▲ seen[q] = True
▲ q = q[1:] + q[:1]
for l in range(n//2, n + 1):
r = n - l
if (l - r)%
for i, this in enumerate(
if 2*i < r: continue
that =
for s in match_up(this, that, l == r, seen):
▲ if s in seen: continue
yield s
▲ record(s)
▲ if l == r:
▲ record(tuple(-a for a in s))
sols = []
Line 1,507 ⟶ 1,521:
sols.append(s)
draw_all(sols[:40])</lang>
|