Параллельно пытаюсь разобраться сам, но вдруг кто-то знаком с языком. Я же гуглю каждый метод.
a = 2187
v = ->(x){(0..2).to_a.repeated_permutation(x)}
v[a].map do |r|
f,l = [-1],0
(1..2*a).each do |j|
i = f[j-l-1]
while i != -1 && r[j%a] != r[(l+i+1)%a]
l = j-i-1 if r[(l+i+1)%a] > r[j%a]
i = f[i]
end
if i == -1 && r[j%a] != r[(l+i+1)%a]
l = j if r[(l+i+1)%a] > r[j%a]
f[j-l] = -1
else
f[j-l] = i+1
end
end
r.rotate(l)
end.uniq.count do |r|
v[7].count{|s|(0...a).map{|l| r.rotate(l)[0,7]}.include?(s)} == a
end