Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created October 13, 2016 02:48
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/f25aeb1d0786c07db9b0285a0a4d8e1d to your computer and use it in GitHub Desktop.
Save vznvzn/f25aeb1d0786c07db9b0285a0a4d8e1d to your computer and use it in GitHub Desktop.
def d(s)
c = s.split('').select { |x| x == '1' }.size
d = c.to_f / s.length
return d
end
def f(n)
return n * 3 + 1 if (n.odd?)
return n /= 2
end
def f2(n)
n = (n * 3 + 1) / 2 while (n.odd?)
n /= 2 while (n.even?)
return n
end
def adv(x)
n1 = n = x['n']
x['d'] = d(n.to_s(2))
d2 = 0
c = 0
l = []
while (n >= n1 && n != 1)
d = d(n.to_s(2)) - 0.5
l << c if (d2 * d < 0)
d2 = d
n = f(n) # f2(n)
c += 1
end
g = (1...l.size).map { |x| l[x] - l[x - 1] }.max
x['g'] = g.nil? ? 0 : g
return x
end
def next2(z)
l = [z]
p = z['p'] + 1
l << adv({'n'=>z['n'] + 2**p, 'p'=>p})
l << z.merge({'p'=>p})
return l
end
def test()
l = File.open('db.txt').readlines.map { |x| Kernel.eval(x) }
l.each \
{
|x|
puts([x['n'].to_s(2).length, adv({'n' => x['n']})['g']].join("\t"))
}
end
# test(); exit
l = [next2({'n'=>1, 'p'=>0})]
8000.times \
{
|i|
$stderr.puts(i) if (i % 100 == 0)
l = l.sort_by! { |x| [x[1]['g'], x[1]['d']] }
l.reverse!
j = rand([l.size, 50].min)
z = l.delete_at(j)
l << next2(z[1])
l << next2(z[2])
puts([l.size, z[1]['n'].to_s(2).length, z[1]['g']].join("\t"))
$stdout.flush
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment