Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created November 22, 2018 04:26
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/b009ba0414e37f0385b914747648ed05 to your computer and use it in GitHub Desktop.
Save vznvzn/b009ba0414e37f0385b914747648ed05 to your computer and use it in GitHub Desktop.
def f2(n)
return n.odd? ? (n * 3 + 1) / 2 : n / 2
end
def initr(w, m, b)
l = []
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 initw(w, m)
w -= 2
i = rand(w - m)
b = rand(2)
ns = initr(i, m, b ^ 1).reverse + ([b] * m).join + initr(w - i - m, m, b ^ 1)
return '1' + (ns[0].to_i ^ 1).to_s + ns
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)
return len01(ns).flatten.max
end
def crunch(w, mx)
ns = initw(w, mx)
mx1 = mx01(ns)
raise if (mx1 != mx)
i = 0
while (mx01(ns) >= mx && ns != '1')
ns = f2(ns.to_i(2)).to_s(2)
i += 1
end
return i
end
def sum(l)
t = 0.0
l.each { |x| t += x }
return t
end
def av(l)
return nil if (l.empty?)
return sum(l) / l.size
end
def dist(w, mx)
a = {}
l = (0...1000).map { crunch(w, mx) }
a2 = {}
l.each { |x| a2[x] = a2.fetch(x, 0) + 1 }
return a2
end
w = 1000
f = File.open('out.txt', 'w')
f2 = File.open('out2.txt', 'w')
(10..100).to_a.reverse.each \
{
|mx|
(a = dist(w, mx).sort).each { |x, y| f.puts([x, y, mx].join("\t")) }
f.puts
f.flush
f2.puts([mx, a[-1][0]].join("\t"))
f2.flush
mx += 1
}
f.close
f2.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment