Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created November 18, 2015 22:02
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/e7006085744806d68008 to your computer and use it in GitHub Desktop.
Save vznvzn/e7006085744806d68008 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby1.8
def f(x, y)
lo = [lambda { |n| n * 3 + 1 }, lambda { |n| (n * 3 + 1) / 2 },
lambda { |n| n = (n * 3 + 1) / 2 while (n.odd?); n }]
le = [lambda { |n| n / 2 }, lambda { |n| n /= 2 while (n.even?); n }]
return lambda \
{
|n|
n = lo[x].call(n) if (n.odd?)
n = le[y].call(n) if (n.even?)
n
}
end
def test()
n = n1 = rand(2 ** 50) | 1
l = []
150.times { n2 = $f.call(n); l << [n, n2, n2 - n]; n += 2 }
loop \
{
break if ((c = l.select { |x| x[0] < n1 }.size) == l.size)
p(c)
l2 = (0...l.size).sort_by { |x| l[x][2] }
l1 = [l2[-1]]
d = l[l1[0]][2]
if (d > 0) then
j = 0
while (l[l2[j]][2] < 0 && d > 0)
d += l[l2[j]][2]
l1 << l2[j]
j += 1
end
return if (d > 0)
end
d2 = 0
l1.sort.reverse.each \
{
|j|
x, n, z = l.delete_at(j)
d2 += z
n2 = $f.call(n)
l << [n, n2, n2 - n] if (n != 1)
}
}
return n1
end
$f = f(-1, -1)
n = nil
c = 0
loop \
{
n = test()
break if (!n.nil?)
c += 1
}
p([n, c])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment