Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created May 3, 2015 01:40
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/84670c8f4526c248e728 to your computer and use it in GitHub Desktop.
Save vznvzn/84670c8f4526c248e728 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby1.8
def f(n)
s = ''
while (n != 1)
s << (n % 2).to_s
n = (n % 2 == 0) ? n / 2 : n * 3 + 1
end
return s
end
def adj(l2)
l3 = l2.dup
t = (l3.size + 1) / 2
z = ((t == 0) ? 0 : rand(t)) * 2
l = (0..10).to_a
r0 = l3[z].length
l.delete_at(r0)
r = l.delete_at(rand(l.size))
l3[z] = '0' * r
# p([t, z, l3])
s = l3.join('')
n = 1
while (s != '')
if (s[0, 1] == '0') then
n <<= 1
else
break if (n % 3 != 1 || ((n - 1) / 3) % 2 == 0)
n = (n - 1) / 3
end
s[0, 1] = ''
end
j = ((l3.size - 1) - z) / 2
return s == '', j, r0, r
end
def seq(n)
s = f(n)
s0 = s.dup
l = []
s1 = ''
while (s != '')
if (s1 == '' || s[0, 1] == s1[0, 1])
s1 << s[0, 1]
else
l << s1
s1 = s[0, 1]
end
s[0, 1] = ''
end
l << s1 if (s1 != '')
return if (s0 == '')
l.shift if (l[0][0, 1] == '0')
return if (l.empty?)
l2 = l.reverse
a = {}
c = 0
1000.times \
{
|i|
f, j, r0, r = adj(l2)
if (f) then
x = [j, r0]
a[x] = {} if (a[x].nil?)
a[x][r] = 0 if (a[x][r].nil?)
a[x][r] += 1
c += 1
end
}
# puts
# p(s0)
# p(l)
# p(l2)
# puts
# p(a)
return if (a.empty?)
m = a.keys.map { |x| x[0] }.max
return n, m
end
n = 3
m = 0
loop \
{
l = seq(n)
next if (l.nil?)
m = [l[1], m].max
p(l + [m])
n += 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment