Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created July 23, 2016 00:53
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/5034a9e902de21ee36ca55ba60b35f1a to your computer and use it in GitHub Desktop.
Save vznvzn/5034a9e902de21ee36ca55ba60b35f1a to your computer and use it in GitHub Desktop.
def f1(n)
n = (n * 3 + 1) / 2 while (n % 2 == 1)
n /= 2 while (n % 2 == 0)
return n
end
def seq2(n)
l = [n]
n1 = n
begin
l << (n = f1(n))
end while (n >= n1 && n != 1)
return l
end
def d(s)
c = s.split('').select { |x| x == '1' }.size
d = c.to_f / s.length
return (0.5 - d).abs
end
def mx2(n)
l = seq2(n)
ls = l.size
l2 = [l]
c = 0
mx = nil
while (!l2.empty?)
c += 1
l = l2.shift
mx = [mx, l2.size].compact.max
loop \
{
break if (l.size <= 2)
m = (0...l.size).max_by { |x| l[x] }
if (m == 0) then
l.shift
next
end
if (m == l.size - 1) then
l.pop
next
end
l2.push(l[0...m])
l2.push(l[(m+1)..-1])
break
}
end
case ARGV[0].to_i
when 1
m = c
when 2
m = mx
end
d = d(n.to_s)
return {'by' => [-m, d], 'fmt' => [c, mx, ls, n.to_s(2).length].join("\t")}
end
def mx_(n)
return mx2(n)
end
def hard(c)
l = [{'n' => 1, 'p' =>0}.merge(mx_(1))]
loop \
{
l.sort_by! { |x| x['by'] }
fmt = l[0]['fmt']
return l[0] if (l.size == c)
x = l.delete_at(rand([l.size, 50].min))
p = x['p'] + 1
n = x['n']
x1 = x.dup
x1['p'] = p
l.push(x1)
x2 = {}
n |= (1 << p)
x2['n'] = n
x2['p'] = p
x2.merge!(mx_(n))
l.push(x2)
$f.puts([l.size, fmt, x2].join("\t"))
$f.flush
}
end
$f = File.open("out#{ARGV[0]}.txt", 'w')
z = hard(10000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment