Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created January 4, 2020 05:22
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/511d65918f22f456ac723aec2129362f to your computer and use it in GitHub Desktop.
Save vznvzn/511d65918f22f456ac723aec2129362f 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)
n1 = n
l = [n1]
while (n != 1)
n = f2(n)
l << n
end
return l
end
def flip(s, n)
s = s.dup
s[n, 1] = (s[n, 1].to_i ^ 1).to_s
return s
end
def delete(s, n)
s = s.dup
s[n, 1] = ''
return s
end
def insert(s, n)
s0 = s.dup
s0[n, 0] = '0'
s1 = s.dup
s1[n, 0] = '1'
return s0, s1
end
def edit1(s)
l = []
s.length.times \
{
|n|
l << flip(s, n)
l << delete(s, n)
}
(s.length + 1).times \
{
|n|
l += insert(s, n)
}
return l.select { |x| x[0, 1] != '0' }
end
def sum(l)
return l.inject { |t, x| t + x }
end
def d(s)
c = s.split('').select { |x| x == '1' }.size
d = c.to_f / s.length
return d
end
def count(ns, fz)
l1 = seq(ns.to_i(2))
cg = l1.index { |x| x < l1[0] }
cg = l1.size if (cg.nil?)
cm = (0...cg).max_by { |x| l1[x] }
s = l1.map { |x| x.to_s(2) }.join
t0 = s.split('').select { |x| x == '1' }.size
t1 = s.length - t0
t = t0 + t1
t01a = (t1 - t0).abs
z = Kernel.eval(fz)
return {'ns' => ns, 'cm' => cm, 'cg' => cg, 'c' => l1.size,
't' => t, 'z' => z, 't0' => t0, 't1' => t1, 'nw' => ns.length}
end
def outa(f1, l, a = {}, t = '')
f = f1.nil? ? File.open('gnuplot.cmd', 'w') : f1
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.each \
{
|x|
next if (a.member?(x) && a[x].nil?)
f.puts("'$dat' using (column('#{x}')) with line #{a.fetch(x, '')} lw 2 title '#{x}',\\")
}
f.puts
f.puts("reset; pause -1;")
f.flush
f.close if (f1.nil?)
end
def diff(a, b)
c = 0
a.length.times \
{
|i|
c += a[i, 1].to_i ^ b[i, 1].to_i
}
return c
end
def traverse(f, fz)
$stderr.puts("\t#{fz}")
l1 = [count('1', fz)]
seen = {'' => nil, '0' => nil, '1' => nil}
l = []
k = 'z'
z2 = 0
1000.times \
{
|t|
$stderr.puts(t) if (t % 100 == 0)
l2 = l1.map { |x| x[k] }
i = (0...l1.size).min_by { |x| l2[x] }
x = l1.delete_at(i)
l << x.merge({'zx' => x['z'] - z2})
z2 = x['z']
edit1(x['ns']).each \
{
|ns|
next if (seen.member?(ns))
l1 << count(ns, fz)
seen[ns] = nil
}
}
outa(f, l, {'ns' => nil, 'zx' => nil}, fz)
end
f = File.open('gnuplot.cmd', 'w')
fs = ["t",
"t + t01a",
"t - t01a",
"t + Math.log(t01a)",
"t - Math.log(t01a)",
"t + Math.sqrt(t01a)",
"t - Math.sqrt(t01a)",
"t + t01a ** 2"]
fs.each { |fz| traverse(f, fz) }
f.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment