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 f3(n)
- return n.odd? ? (n * 3 + 1) : n / 2
- end
- def read(fn)
- l = (f = File.open(fn)).readlines.map { |x| Kernel.eval(x) }
- f.close
- $stderr.puts("#{fn} #{l.size}")
- return l
- end
- def d(s)
- c = s.split('').select { |x| x == '1' }.size
- d = c.to_f / s.length
- return d
- end
- def e(s)
- l = s.split(/1+/) + s.split(/0+/)
- return l.size.to_f / s.length
- end
- def c(l, f)
- c = 0
- de2 = 0.5
- l.each \
- {
- |x|
- de = f.call(x.to_s(2)) - 0.5
- c += 1 if (de * de2 < 0)
- de2 = de
- }
- return c.to_f / l.size
- end
- def de(n)
- n1 = n
- l = [n]
- while (n >= n1 && n != 1)
- n = $f.call(n)
- l << n
- end
- cm = (0...l.size).max_by { |x| l[x] }
- l1 = l[0..cm]
- l2 = l[cm..-1]
- d = lambda { |x| d(x) }
- e = lambda { |x| e(x) }
- t = l1.size + l2.size
- return {'d1' => c(l1, d), 'e1' => c(l1, e), 'd2' => c(l2, d), 'e2' => c(l2, e), 'l1' => l1.size, 'l2' => l2.size, 'l12' => t, 'l1r' => l1.size.to_f / t}
- 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?)
- x = l1.max_by { |x| x[1] }
- return {'n' => x[0], 'cg' => x[1]}
- 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 out(fn, l, a)
- f = File.open(fn, 'w')
- f.puts('$dat << eof')
- k = l[0].keys
- f.puts(k.join("\t"))
- l.each { |x| f.puts(x.values.join("\t")) }
- f.puts('eof')
- f.puts('set colors classic; set ytics nomirror; set y2tics; plot \\')
- k.each { |x| f.puts("'$dat' using (column('#{x}')) with line #{a.fetch(x, '')},\\") if (a.member?(x)) }
- f.puts
- f.close
- end
- tf = 1
- $f = [lambda { |x| f1(x) }, lambda { |x| f2(x) }, lambda { |x| f3(x) }][tf]
- l = read('mix19/mixdb.txt')
- a = {}
- l.each { |x| a[x['n']] = x }
- l = a.values
- l = (0...500).map { n2(dist_j(l)) }.compact
- l2 = l.map { |x| de(x['n']) }.sort_by { |x| x['l1'] }
- out('gnuplot1.cmd', l2, {'d1' => '', 'l1' => 'axes x1y2'})
- l2.sort_by! { |x| x['l2'] }
- out('gnuplot2.cmd', l2, {'l1' => '', 'l2' => 'lw 3', 'l12' => '', 'l1r' => 'axes x1y2'})
Add Comment
Please, Sign In to add comment