Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def f1(n)
- n = (n * 3 + 1) / 2 while (n.odd?)
- n /= 2 while (n.even?)
- return n
- end
- def f2(n)
- return n.odd? ? (n * 3 + 1) / 2 : n / 2
- end
- def avg(l)
- return 0 if (l.empty?)
- t = 0
- l.each { |x| t += x }
- return t.to_f / l.size
- end
- def total(l)
- t = 0
- l.each { |x| t += x }
- return t
- end
- def h(n, l0, l1, m, s)
- ns = n.to_s(2)
- nl = s ? ns.length : 1.0
- l1.concat(ns.split(/0+/).map { |x| x.length.to_f / nl }.select { |x| x >= m})
- l0.concat([ns.split(/1+/)[1..-1]].compact.flatten.map { |x| x.length.to_f / nl }.select { |x| x >= m})
- end
- def count(x)
- n = n1 = x['n']
- l = [n]
- while (n >= n1 && n != 1)
- n = {'packed' => true, 'unpacked' => false}[$w] ? f1(n) : f2(n)
- l << n
- end
- cm = (0...l.size).max_by { |x| l[x] }
- return l[0..cm]
- end
- def uniq(l)
- a = {}
- l.each { |x| a[x['n']] = x }
- $stderr.puts({'ls1' => l.size, 'ls2' => a.size}.inspect)
- return a.values
- end
- # $w = 'packed'
- $w = 'unpacked'
- l = uniq(File.open('tmp/mixdb.txt').readlines.map { |x| Kernel.eval(x) })
- l = l.sort_by { |x| x['cm'] }.reverse
- l1 = []
- s, m = [false, 9]
- s, m = [true, 1.0 / 20]
- count(l[ARGV[0].to_i]).each_with_index \
- {
- |n, c|
- h(n, [], l1, m, s)
- l1.sort!
- l1.each_with_index \
- {
- |x, j|
- puts([j.to_f / (l1.size - 1), x, c].join("\t"))
- }
- puts
- }
Add Comment
Please, Sign In to add comment