Created
July 23, 2020 20:26
-
-
Save vznvzn/b90cd7b965ab6b091f4dfee66c36ddff 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 seq(n) | |
n1 = n | |
l = [] | |
begin | |
l << n | |
n = f2(n) | |
end while (n != 1) | |
return l | |
end | |
def d(s) | |
c = s.split('').select { |x| x == '1' }.size | |
d = c.to_f / s.length | |
return d | |
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 left opaque; 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')) | |
f.puts("'$dat' using #{ct}(column('#{x}')) #{opt} title '#{x}',\\") | |
} | |
f.puts | |
# f.puts("reset; pause -1;") | |
end | |
def outafn(l, a = {}, fn = nil) | |
outa(f = File.open(fn.nil? ? 'gnuplot.cmd' : fn, 'w'), l, a) | |
f.close | |
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, /1+/), lenx(ns, /0+/) | |
end | |
def hist(a, ns, b) | |
len01x(ns)[b].each { |x1| a[x1] = a.fetch(x1, 0) + 1 } | |
end | |
def hist2(a, l1, b) | |
l1.each \ | |
{ | |
|x| | |
hist(a, ns = x.to_s(2), b) | |
} | |
end | |
def histdiff(l1) | |
a0 = {} | |
a1 = {} | |
hist2(a0, l1, 0) | |
hist2(a1, l1, 1) | |
a = {} | |
t = 0 | |
(a0.keys + a1.keys).each \ | |
{ | |
|k| | |
a[k] = Math.log(a1.fetch(k, 1)) - Math.log(a0.fetch(k, 1)) | |
t += a[k] | |
} | |
return t | |
end | |
def histdiff2(l1) | |
c = 200 | |
l = [] | |
$t = 0 if ($t.nil?) | |
(0...(l1.size - c)).each \ | |
{ | |
|i| | |
l << {'t' => $t, 'hd' => histdiff(l1[i, c]), 'nw' => l1[i].to_s(2).length, '0' => 0} | |
$t += 1 | |
} | |
$t += 200 | |
return l | |
end | |
l = File.open('db.txt').readlines.map { |x| Kernel.eval(x) } | |
ks = l.map { |x| x['k'] }.uniq | |
p(ks) | |
ks.sort_by! { |k| l.select { |x| x['k'] == k }.map { |x| x['cg'] }.max } | |
p(ks) | |
l2 = [] | |
x1 = 0 | |
ks.reverse.each \ | |
{ | |
|k| | |
x = l.select { |x| x['k'] == k }.max_by { |x| x['cg'] } | |
$stderr.puts(x) | |
next if (x['cg'] < 20) | |
n = x['n'] | |
l1 = | |
l2 += histdiff2(seq(n)) | |
l2 << {} | |
} | |
outafn(l2) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment