Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created November 5, 2020 23:35
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/d8b9a468dceffb5945d6202eff856336 to your computer and use it in GitHub Desktop.
Save vznvzn/d8b9a468dceffb5945d6202eff856336 to your computer and use it in GitHub Desktop.
def f2(n)
return n.odd? ? (n * 3 + 1) / 2 : n / 2
end
def seq(n)
l = [n]
while (n != 1)
n = f2(n)
l << n
end
return l
end
def d1(s)
c = s.split('').select { |x| x == '1' }.size
return c
end
def d(s)
d = c.to_f / s.length
return d1(s).to_f / s.length
end
def outin(fn)
l = (f = File.open(fn)).readlines
f.close
raise if (l.shift.chop != '$dat << eof')
k = l.shift.split
i = l.index("eof\n")
raise if (i.nil?)
l[i..-1] = []
l2 = l.map { |x| Hash[[k, x.split.map { |x| Kernel.eval(x) }].transpose] }
return l2
end
def load()
l = []
(1..6).each \
{
|i|
l.concat(outin("gnuplot#{i}-1.cmd"))
}
return l
end
def outd(f, l)
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')
return k
end
def outa(f, l, a = {}, t = '')
k = outd(f, l)
f.puts("set colors classic; set title '#{t}'; ")
f.puts("set ytics nomirror; set y2tics;")
f.puts("plot \\")
k, ct = [k - ['t'], "(column('t')):"] if (k.member?('t'))
k.each \
{
|x|
next if (a.member?(x) && a[x].nil?)
opt = a.fetch(x, '')
opt += ' lw 2 ' if (!opt.include?('lw'))
opt += ' with line ' if (!opt.include?('with') && !opt.include?('pt'))
f.puts("'$dat' using #{ct}(column('#{x}')) #{opt} title '#{x}',\\")
}
f.puts
# f.puts("reset; pause -1;")
end
def outafn(l, a = {}, fn = nil, t)
outa(f = File.open(fn.nil? ? 'gnuplot.cmd' : fn, 'w'), l, a, t)
f.close
$stderr.puts([fn, t, l.size].inspect)
end
def graph(l, r)
c = 50
l4 = []
l.each \
{
|x|
ns = x['ns'].to_s
l1 = seq(ns.to_i(2))
cg = l1.index { |x| x < l1[0] }
cm = (0..cg).max_by { |x| l1[x] }
next if (cm < c || (cg - cm) < c)
l2 = l1[0..cg].map { |x| x.to_s(2) }
d1 = d2 = 0.0
t1 = t2 = 0
l3 = []
m1 = (x['h'].to_f - ns.length) / cm
m2 = (x['h'].to_f - ns.length) / (cm - cg)
r.each \
{
|x|
d1 += d1(ns1 = l2[0..cm].map { |x1| x1[-x] }.join)
t1 += ns1.length
d2 += d1(ns2 = l2[cm..cg].map { |x1| x1[-x] }.join)
t2 += ns2.length
l3 << {'d1' => d1 / t1, 'd2' => d2 / t2, 'm1' => m1, 'm2' => m2}
}
l4 << l3
}
l6 = []
[1, 2].each \
{
|i|
l4.sort_by! { |x| -x[0]["d#{i}"] }
l5 = l6[i - 1] = []
t = 0
l4.each \
{
|l3|
l3.each { |x| l5 << x.merge({'t' => (t += 1)}) }
l5 << {}
t += 20 + (20 - r.size)
}
}
return l6
end
def out(l, r, i)
$n = 0 if ($n.nil?)
outafn(l, {'m1' => 'axes x1y2 dt 3', 'm2' => 'axes x1y2 dt 3'}, "gnuplot#{$n += 1}.cmd", "#{r} sort\\_by d#{i}")
end
l = load()
k = 'cm'
k = 'cg'
l = l.sort_by { |x| x[k] }.reverse[0..20]
l1a, l2a = graph(l, r1 = 1..20)
l1b, l2b = graph(l, r2 = 2..20)
out(l1a + l1b, r1, 1)
out(l2a + l2b, r2, 2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment