Advertisement
Guest User

Untitled

a guest
Jul 27th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.14 KB | None | 0 0
  1. def f1(n)
  2. n = (n * 3 + 1) / 2 while (n % 2 == 1)
  3. n /= 2 while (n % 2 == 0)
  4. return n
  5. end
  6.  
  7. def seq2(n)
  8. l = [n]
  9. n1 = n
  10. begin
  11. l << (n = f1(n))
  12. end while (n >= n1 && n != 1)
  13. return l
  14. end
  15.  
  16. def d(s)
  17. c = s.split('').select { |x| x == '1' }.size
  18. d = c.to_f / s.length
  19. return (0.5 - d).abs
  20.  
  21. end
  22.  
  23. def r(x)
  24. return sprintf("%.3f", x).to_f
  25. end
  26.  
  27. def mx(n)
  28. l = seq2(n)
  29.  
  30. d = d(n.to_s)
  31.  
  32. mx = l.max
  33. ns = n.to_s(2).length
  34.  
  35. v = mx.to_s(2).length.to_f / ns
  36. h = l.size.to_f / ns
  37.  
  38. return {'by' => [-(v * h), d], 'ns' => ns, 'ls' => l.size,
  39. 'v' => r(v), 'h' => r(l.size.to_f / ns)}
  40. end
  41.  
  42. def fmt(x)
  43.  
  44. x = x.dup
  45. ['n', 'p', 'by'].each { |k| x.delete(k) }
  46. return x.to_a
  47. end
  48.  
  49. def hard(c)
  50.  
  51.  
  52. l = [{'n' => 1, 'p' =>0}.merge(mx(1))]
  53.  
  54. loop \
  55. {
  56. l.sort_by! { |x| x['by'] }
  57.  
  58. return l[l.size / 2] if (l.size == c)
  59.  
  60. x = l.delete_at(rand([l.size, 100].min))
  61.  
  62.  
  63. p = x['p'] + 1
  64. n = x['n']
  65.  
  66. x1 = x.dup
  67. x1['p'] = p
  68. l.push(x1)
  69.  
  70. x2 = {}
  71. n |= (1 << p)
  72.  
  73. x2['n'] = n
  74. x2['p'] = p
  75. x2.merge!(mx(n))
  76. l.push(x2)
  77.  
  78. puts(([l.size] + fmt(x2)).join("\t"))
  79. $stdout.flush
  80. }
  81.  
  82.  
  83. end
  84.  
  85. z = hard(10000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement