Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created April 22, 2015 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vznvzn/1066d8654be976683c09 to your computer and use it in GitHub Desktop.
Save vznvzn/1066d8654be976683c09 to your computer and use it in GitHub Desktop.
def f(n)
n2 = n
s = ''
while (n >= n2)
p = n % 2
n = (p == 0) ? n / 2 : (n * 3 + 1) / 2
s << p.to_s
end
return s
end
def suffixes(s)
l = []
s.size.times \
{
|i|
l << s[i..-1]
}
return l.sort
end
def compress(s, l1, l2)
l3 = suffixes(s)
s0 = ''
t0 = nil
l1.each_with_index \
{
|x, t|
l4 = suffixes(x)
i = j = 0
while (i < l3.size && j < l4.size)
s3, s4 = l3[i], l4[j]
c = 0
m = [s3.length, s4.length].min
c += 1 while (s3[c, 1] == s4[c, 1] && c < m)
s0, t0 = s3[0...c], t if (c > s0.length)
z = s3 <=> s4
i += 1 if ([-1, 0].member?(z))
j += 1 if ([0, 1].member?(z))
end
}
return s0, t0.nil? ? nil : l2[t0]
end
fn = 'out2.txt'
l1 = []
l2 = []
n = 3
s = nil
f = File.open(fn, 'w')
loop \
{
s = s0 = f(n)
if (!l1.empty?) then
l = []
while (s != '')
s1, n1 = compress(s, l1, l2)
l << n1
s = s.sub(s1, '')
end
f.puts([n, l[0], l.size].join("\t"))
f.flush
end
l1 << s0
l2 << n
n += 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment