Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created October 25, 2018 01:04
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/9488d44630341eec1a675ae5b212e8b3 to your computer and use it in GitHub Desktop.
Save vznvzn/9488d44630341eec1a675ae5b212e8b3 to your computer and use it in GitHub Desktop.
def f2(n)
return n.odd? ? (n * 3 + 1) / 2 : n / 2
end
def d(s)
c = s.split('').select { |x| x == '1' }.size
d = c.to_f / s.length
return d
end
def initr(w, m)
l = []
b = 1
while (w > 0)
t = [w, m].min
r = (t <= 1) ? 1 : rand(t) + 1
l << [b] * r
b ^= 1
w -= r
end
s = l.flatten.join
return s
end
def len01(ns)
nl = ns.length
l1 = ns.split(/0+/).map { |x| x.length }
l2 = ns.split(/1+/)[1..-1]
l2 = [''] if (l2.nil?)
l0 = l2.map { |x| x.length }
return l0, l1
end
def mx01(ns)
len01(ns).flatten.max
end
def e(ns)
return len01(ns).flatten.size.to_f / ns.length
end
def cut(b, w, c)
a = (1...w).to_a
p = (1..c).map { a.delete_at(rand(a.size)) }
s = b.to_s * w
p.sort.reverse.each { |x| s[x, 0] = '-' }
return s.split('-')
end
def entropy(w, c)
c = [1, c].max
c = [w - 1, c].min
c2 = (c + 1) / 2
w2 = w / 2
l1 = c.even? ? cut(1, w2, c2) : cut(1, w2, c2 - 1)
l0 = cut(0, w2, c2 - 1)
l0 << '' if (c.even?)
return [l1, l0].transpose.join
end
def secs(w, c)
l = (0...(w - 1)).to_a
a = {}
c = [l.size, c].min
c.times { a[l.delete_at(rand(l.size))] = nil }
r = 1
s = ''
w.times \
{
|i|
s << r.to_s
r ^= 1 if (a.member?(i))
}
return s
end
def count(n)
n1 = n
l = [n1]
while (n != 1)
n = f2(n)
l << n
end
cg = l.index{ |x| x < l[0] }
cm1 = (0...l.size).max_by { |x| l[x] }
return {
'cg' => cg,
'cm1' => cm1,
}
end
def sample(c)
$n = 0 if ($n.nil?)
$stderr.puts($n += 1)
l = []
c.times \
{
|i|
case $t
when 'entropy'
ns = entropy(c, i)
when 'initr'
ns = initr(c, i)
when 'secs'
ns = secs(c, i)
end
ns2 = f2(n = ns.to_i(2)).to_s(2)
d1 = d(ns)
d2 = d(ns2)
e1 = e(ns)
e2 = e(ns2)
mx1 = mx01(ns)
mx2 = mx01(ns2)
l << {'d1' => d1,
'd2' => d2,
'd21' => d2 - d1,
'e1' => e1,
'e2' => e2,
'e21' => e2 - e1,
'mx1' => mx1,
'mx2' => mx2,
'mx21' => mx2 - mx1
}.merge(count(n))
}
return l.sort_by { |x| x['e1'] }
end
def sum(l)
t = 0.0
l.each { |x| t += x }
return t
end
def avg(l)
return nil if (l.empty?)
return sum(l) / l.size
end
def avgs(l)
ks = l[0][0].keys
l1 = []
l[0].size.times \
{
|i|
l1[i] = Hash[[ks, ks.map { |k| avg(l.map { |x| x[i][k] }) }].transpose]
}
return l1
end
$t, xr = [['entropy', ''], ['initr', '[0:0.15]'], ['secs', '[][0:200]']][ARGV[0].to_i]
$stderr.puts($t)
l = avgs((1..10).map { sample(200) })
f = File.open('gnuplot.cmd', 'w')
f.puts('$dat << eof')
f.puts(l[0].keys.join("\t"))
l.each { |x| f.puts(x.values.join("\t")) }
f.puts('eof')
f.puts("set title '#{$t}'; set key top center; set ytics nomirror; set y2tics; plot #{xr}\\")
a = {'e21' => 'axes x1y2',
'e2' => 'axes x1y2 lt 2 dt 3',
'cg' => 'lt 1 lw 2',
'cm1' => 'lt 7 lw 2'
}
(l[0].keys - ['e1', 'd1', 'd2', 'd21']).each { |x| f.puts("$dat using (column('e1')):(column('#{x}')) title '#{x}' with line #{a.fetch(x, '')},\\") }
f.puts
f.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment