Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created April 21, 2015 17:42
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/bfd6c7fd6961a4f1d76e to your computer and use it in GitHub Desktop.
Save vznvzn/bfd6c7fd6961a4f1d76e to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby1.8
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 match(s, l1, l2)
j = 0
j += 1 while (j < s.length && s[j, 1] == '0')
return [j, 0, s[0...j], s[j..-1]] if (j > 0)
m = [0, nil, '', s]
l1.each_with_index \
{
|s2, i|
j = 0
j += 1 while (j < s.length && j < s2.length && s[j, 1] == s2[j, 1])
m = [j, l2[i], s[0...j], s[j..-1]] if (j > m[0])
}
return m
end
n = 3
l1 = []
l2 = []
m = 0
i = 0
loop \
{
s0 = s = f(n)
l = []
l3 = []
while (s != '')
j, x, s1, s2 = match(s, l1, l2)
if (s1 == '') then
l << s2
l3 << -1
break
end
l << s1
l3 << x
s = s2
end
z = l3.select { |x| x != 0}.size
m = z if (z > m)
if (i % 100 == 0) then
puts([n, l3[0], m].join("\t"))
m = 0
$stdout.flush
end
# p([n, s0, l3, l])
raise if (l.join != s0)
l1 << s0
l2 << n
n += 4
i += 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment