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 mx(n)
- ns = n.to_s(2)
- nl = ns.length
- l1 = ns.split(/0+/).map { |x| x.length }
- l0 = [ns.split(/1+/)[1..-1]].compact.flatten.map { |x| x.length }
- return l0.max, l1.max
- end
- def count(x, h1, h2, m, c)
- 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] }
- # $stderr.puts([cm, l.size].inspect)
- if (!c.nil?) then
- return 0 if (cm - c < 0 || cm + c >= l.size)
- r = (cm - c)..(cm + c)
- else
- r = 0...l.size
- end
- r.each \
- {
- |i|
- x = l[i]
- mx0, mx1 = mx(x)
- j = [mx0, mx1, [mx0, mx1].max][m]
- if (i < cm) then
- h1[j] = h1.fetch(j, []) + [cm - i]
- else
- h2[j] = h2.fetch(j, []) + [-(i - cm)]
- end
- }
- return 1
- end
- def d(s)
- c = s.split('').select { |x| x == '1' }.size
- d = c.to_f / s.length
- return d
- end
- def dist_j(l)
- z1 = rand(l.size)
- ns = l[z1]['n'].to_s(2)
- r = rand(ns.length) if (r.nil?)
- ns[r, 1] = (ns[r, 1].to_i ^ 1).to_s
- n = ns.to_i(2)
- return n
- end
- def seq(n)
- n1 = n
- l = [n]
- while (n >= n1 && n != 1)
- n = {'packed' => true, 'unpacked' => false}[$w] ? f1(n) : f2(n)
- l << n
- end
- return l
- end
- def disordered(l)
- l1 = []
- l.each_with_index \
- {
- |x, i|
- l1[i] = d(x.to_s(2)) - 0.5
- return i - 1 if (i >= 1 && l1[i] * l1[i - 1] < 0)
- }
- return
- end
- def glide(l, i)
- n1 = l[i]
- i += 1 while (l[i] >= n1 && i < l.size - 1)
- return i
- end
- def n2(n)
- l = seq(n)
- l1 = []
- mx = nil
- loop \
- {
- i = disordered(l)
- break if (i.nil? || (!mx.nil? && l.size < mx))
- l1 << [l[i], glide(l, i) - i]
- mx = l1.map { |x| x[1] }.max
- i += 1 if (i == 0)
- l = l[i..-1]
- }
- return if (l1.empty?)
- return {'n' => l1.max_by { |x| x[1] }[0]}
- end
- #$w = 'packed'
- $w = 'unpacked'
- l = File.open('mix19/mixdb.txt').readlines.map { |x| Kernel.eval(x) }
- l.shuffle!
- l = l.map { |x| n2(x['n']) }
- #l = (0...1000).map { n2(dist_j(l)) }.compact
- a = {}
- c = ['mx0', 'mx1', 'mx01']
- t = 80
- #t = nil
- [0, 1, 2].each \
- {
- |m|
- h1 = {}
- h2 = {}
- r = (0...l.size)
- n = 0
- l[r].each { |x| n += count(x, h1, h2, m, t) }
- $stderr.puts(n)
- l1 = h1.to_a
- l2 = h2.to_a
- a["#{c[m]}_a"] = h1
- a["#{c[m]}_d"] = h2
- }
- $stderr.puts(a.keys.inspect)
- x = 0
- a.each \
- {
- |k, a2|
- a2.sort.each \
- {
- |mx, l|
- l.each { |y| puts([x, y, mx].join("\t")) }
- x += 1
- }
- x += 5
- }
Add Comment
Please, Sign In to add comment