Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1.  
  2. def f1(n)
  3. n = (n * 3 + 1) / 2 while (n.odd?)
  4. n /= 2 while (n.even?)
  5. return n
  6. end
  7.  
  8. def f2(n)
  9. return n.odd? ? (n * 3 + 1) / 2 : n / 2
  10.  
  11. end
  12.  
  13.  
  14. def widthdiff(x, y)
  15. x.to_s(2).length - y.to_s(2).length
  16. end
  17.  
  18. def widthratio(x, y)
  19. x.to_s(2).length.to_f / y.to_s(2).length
  20. end
  21.  
  22. def d(s)
  23. c = s.split('').select { |x| x == '1' }.size
  24. d = c.to_f / s.length
  25. return d
  26.  
  27. end
  28.  
  29. def count(x)
  30. n = n1 = x['n']
  31. l = [n]
  32. cg = nil
  33. l1 = []
  34. i = nil
  35. while (n >= n1 && n != 1)
  36. l1 << d(n.to_s(2)) - 0.5
  37. n = f1(n)
  38. cg = l.size if (cg.nil? && n < n1)
  39. l1.shift if (l1.size == 3)
  40. i = l.size if (i.nil? && l1.size == 2 && l1[0] * l1[1] < 0)
  41. l << n
  42. end
  43. ns = n1.to_s(2)
  44. cm = (0...l.size).max_by { |x| l[x] }
  45. return x.merge!({'cm' => cm,
  46. 'cg' => cg.nil? ? 0 : cg,
  47. 'm' => l[cm].to_s(2).length,
  48. 'w' => widthdiff(l[cm], n1),
  49. 'r' => widthratio(l[cm], n1),
  50. 'c' => l.size,
  51. 'd' => (0.5 - d(ns)).abs,
  52. 'l' => l,
  53. 'nl' => ns.length,
  54. 'i' => i.nil? ? 0 : i,
  55. 'j2' => i.nil? ? 0 : cm - i})
  56. end
  57.  
  58. def out(a)
  59.  
  60. fn = 'out.txt'
  61. if ($f.nil?) then
  62. $f = File.open(fn, 'w')
  63. $f.puts(a.keys.join("\t"))
  64.  
  65. f2 = File.open('gnuplot.cmd', 'w')
  66. f2.puts('set colors classic; set key top left; plot \\')
  67. (a.keys - ['t']).each \
  68. {
  69. |x|
  70. z = (x == 'j2') ? 'lt 7' : ''
  71. f2.puts("'#{fn}' using (column('t')):(column('#{x}')) with line title '#{x}' #{z}, \\")
  72. }
  73. f2.puts
  74. f2.close
  75. end
  76. $f.puts(a.values.join("\t"))
  77. $f.flush
  78. end
  79.  
  80. def next2(z, l, l2, w)
  81. out(z.select { |k, | !['l', 'n', 'd', 'r', 'p', 'c'].member?(k)}) if (z['t'] % 8 == 0)
  82. p = z['p'] + 1
  83. l << [z, count({'n'=>z['n'] + 2 ** p, 'p'=>p}), z.merge({'p'=>p})]
  84. l2 << z if (z['nl'] == w)
  85. end
  86.  
  87.  
  88. def hard(k)
  89.  
  90. l = []
  91. l2 = []
  92. w = 100
  93. next2(count({'n' => 1, 'p' => 0}).merge({'t' => 0}), l, l2, w)
  94.  
  95. j = 0
  96. n = 1
  97. c2 = nil
  98. loop \
  99. {
  100. l1 = (0...l.size).sort_by { |x| [-l[x][1][k], l[x][1]['d']] }
  101.  
  102. if (j % 100 == 0) then
  103. a = l[l1[0]][1].select { |k, | !['l', 'n'].member?(k)}
  104. c1 = l.select { |x| x[1]['nl'] > w}.size
  105.  
  106. $stderr.puts({'j' => j, 'c1' => c1, 'l2' => l2.size}.merge(a))
  107. return if (j >= 100 && a['cg'] <= 5)
  108.  
  109. n += 1 if (l2.size != 0 && l2.size == c2)
  110. c2 = l2.size
  111.  
  112. break if (n == 5)
  113. end
  114.  
  115. i = l1[rand([l1.size, 20].min)]
  116. z = l.delete_at(i)
  117.  
  118. next2(z[1].merge({'t' => j}), l, l2, w)
  119. next2(z[2].merge({'t' => j}), l, l2, w)
  120.  
  121. l.delete_at((0...l.size).min_by { |x| l[x][0][k] }) if (l.size > 2000)
  122. j += 1
  123. }
  124. return l2
  125. end
  126.  
  127. def restart(k)
  128. l = nil
  129. l = hard(k) while (l.nil?)
  130. return l
  131. end
  132.  
  133. l = restart('j2')
  134. f = File.open('mixdb.txt', 'w')
  135. l.each { |x| f.puts(x.select { |k, | k != 'l' }.inspect) }
  136. f.close
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement