Created
December 27, 2019 05:21
-
-
Save vznvzn/aa437427be645fb0c1d5110b113e7c59 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def f2(n) | |
return n.odd? ? (n * 3 + 1) / 2 : n / 2 | |
end | |
def outin2() | |
l = File.open('out2.txt').readlines.map { |x| Kernel.eval(x) } | |
return l | |
end | |
def lenx(ns, p) | |
l = ns.split(p) | |
l = [] if (l.nil?) | |
l.shift if (l[0] == '') | |
return l.map { |x| x.length } | |
end | |
def len01x(ns) | |
return lenx(ns, /0+/), lenx(ns, /1+/) | |
end | |
def seq(n) | |
n1 = n | |
l = [n1] | |
while (n != 1) | |
l << n | |
n = f2(n) | |
end | |
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(ns) | |
return len01x(ns).flatten.size.to_f / ns.length | |
end | |
def dp(l, b) | |
c = c1 = c2 = 0 | |
l.each \ | |
{ | |
|x| | |
d = d(x) | |
d1 = d < 0.5 ? 0 : 1 | |
x1 = x[-1, 1].to_i | |
c += 1 if (d1 == x1) | |
c1 += d1 | |
c2 += x1 | |
} | |
return {"dp#{b}" => c1.to_f / l.size} | |
end | |
def outa(f, l, a = {}, t = '') | |
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 key top right opaque; set title '#{t}'; ") | |
f.puts("set ytics nomirror; set y2tics;") | |
f.puts("plot \\") | |
k.each \ | |
{ | |
|x| | |
next if (a.member?(x) && a[x].nil?) | |
f.puts("'$dat' using (column('#{x}')) with line #{a.fetch(x, '')} lw 2,\\") | |
} | |
f.puts | |
# f.puts("reset; pause -1;") | |
end | |
def sum(l) | |
return l.inject { |t, x| t + x } | |
end | |
def avg(l) | |
return l.empty? ? 0 : sum(l).to_f / l.size | |
end | |
def avgs1(l) | |
ks = l[0].keys | |
a = {} | |
ks.each \ | |
{ | |
|k| | |
a[k] = avg(l.map { |x| x[k] }) | |
} | |
return a | |
end | |
def data(l, w) | |
l3 = [] | |
r = -w..-1 | |
100.times \ | |
{ | |
|i| | |
x = l[-i] | |
l1 = x['l'] | |
l2 = l1.map { |x| x.to_s(2) } | |
cm = x['cm'] | |
cg = x['cg'] | |
sl1 = l2[0...cm] | |
sr1 = l2[cm..-1] | |
sl = sl1.select { |x| x[-1,1] == '1'}.map { |x| x[r] }.join | |
sr = sr1.select { |x| x[-1,1] == '1'}.map { |x| x[r] }.join | |
dl = d(sl) | |
dr = d(sr) | |
drl = dr - dl | |
el = e(sl) | |
er = e(sr) | |
erl = er - el | |
a = {} | |
a = a.merge({'dl' => dl, 'dr' => dr, 'drl' => drl}) | |
a = a.merge({'el' => el, 'er' => er, 'erl' => erl}) | |
l3 << a | |
} | |
$stderr.puts(w) | |
return avgs1(l3) | |
end | |
l = outin2() | |
l.sort_by! { |x| x['cg'] } | |
mn = l.map { |x| x['l'][0..x['cg']].map { |x1| x1.to_s(2).length }.min }.min | |
$stderr.puts({'ls' => l.size, 'mn' => mn}.inspect) | |
l3 = [] | |
l3 += (1..mn).map { |w| data(l, w) } | |
outa(f = File.open('gnuplot.cmd', 'w'), l3, {'drl' => 'axes x1y2', 'erl' => 'axes x1y2 lt 7'}) | |
f.close | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment