Guest User

Untitled

a guest
Jul 21st, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. def f1(n)
  2. n = (n * 3 + 1) / 2 while (n.odd?)
  3. n /= 2 while (n.even?)
  4. return n
  5. end
  6.  
  7. def f2(n)
  8. return n.odd? ? (n * 3 + 1) / 2 : n / 2
  9.  
  10. end
  11.  
  12. def mx(n)
  13. ns = n.to_s(2)
  14. nl = ns.length
  15. l1 = ns.split(/0+/).map { |x| x.length }
  16. l0 = [ns.split(/1+/)[1..-1]].compact.flatten.map { |x| x.length }
  17. return l0.max, l1.max
  18. end
  19.  
  20. def count(x, h1, h2, m, c)
  21.  
  22.  
  23. n = n1 = x['n']
  24. l = [n]
  25. while (n >= n1 && n != 1)
  26. n = {'packed' => true, 'unpacked' => false}[$w] ? f1(n) : f2(n)
  27. l << n
  28. end
  29. cm = (0...l.size).max_by { |x| l[x] }
  30. # $stderr.puts([cm, l.size].inspect)
  31.  
  32.  
  33. if (!c.nil?) then
  34. return 0 if (cm - c < 0 || cm + c >= l.size)
  35. r = (cm - c)..(cm + c)
  36. else
  37. r = 0...l.size
  38. end
  39.  
  40. r.each \
  41. {
  42. |i|
  43. x = l[i]
  44. mx0, mx1 = mx(x)
  45. j = [mx0, mx1, [mx0, mx1].max][m]
  46.  
  47. if (i < cm) then
  48. h1[j] = h1.fetch(j, []) + [cm - i]
  49. else
  50. h2[j] = h2.fetch(j, []) + [-(i - cm)]
  51. end
  52.  
  53. }
  54.  
  55. return 1
  56. end
  57.  
  58. def d(s)
  59. c = s.split('').select { |x| x == '1' }.size
  60. d = c.to_f / s.length
  61. return d
  62.  
  63. end
  64.  
  65. def dist_j(l)
  66.  
  67. z1 = rand(l.size)
  68. ns = l[z1]['n'].to_s(2)
  69.  
  70. r = rand(ns.length) if (r.nil?)
  71.  
  72. ns[r, 1] = (ns[r, 1].to_i ^ 1).to_s
  73. n = ns.to_i(2)
  74. return n
  75.  
  76. end
  77.  
  78. def seq(n)
  79. n1 = n
  80. l = [n]
  81. while (n >= n1 && n != 1)
  82. n = {'packed' => true, 'unpacked' => false}[$w] ? f1(n) : f2(n)
  83. l << n
  84. end
  85. return l
  86. end
  87.  
  88. def disordered(l)
  89.  
  90. l1 = []
  91. l.each_with_index \
  92. {
  93. |x, i|
  94. l1[i] = d(x.to_s(2)) - 0.5
  95. return i - 1 if (i >= 1 && l1[i] * l1[i - 1] < 0)
  96. }
  97. return
  98. end
  99.  
  100. def glide(l, i)
  101.  
  102. n1 = l[i]
  103. i += 1 while (l[i] >= n1 && i < l.size - 1)
  104.  
  105. return i
  106.  
  107. end
  108.  
  109. def n2(n)
  110.  
  111. l = seq(n)
  112.  
  113. l1 = []
  114. mx = nil
  115. loop \
  116. {
  117.  
  118. i = disordered(l)
  119.  
  120. break if (i.nil? || (!mx.nil? && l.size < mx))
  121.  
  122. l1 << [l[i], glide(l, i) - i]
  123. mx = l1.map { |x| x[1] }.max
  124.  
  125. i += 1 if (i == 0)
  126. l = l[i..-1]
  127. }
  128. return if (l1.empty?)
  129.  
  130. return {'n' => l1.max_by { |x| x[1] }[0]}
  131.  
  132. end
  133.  
  134.  
  135.  
  136. #$w = 'packed'
  137. $w = 'unpacked'
  138.  
  139. l = File.open('mix19/mixdb.txt').readlines.map { |x| Kernel.eval(x) }
  140. l.shuffle!
  141.  
  142. l = l.map { |x| n2(x['n']) }
  143.  
  144. #l = (0...1000).map { n2(dist_j(l)) }.compact
  145.  
  146. a = {}
  147. c = ['mx0', 'mx1', 'mx01']
  148. t = 80
  149. #t = nil
  150. [0, 1, 2].each \
  151. {
  152. |m|
  153.  
  154. h1 = {}
  155. h2 = {}
  156. r = (0...l.size)
  157. n = 0
  158. l[r].each { |x| n += count(x, h1, h2, m, t) }
  159. $stderr.puts(n)
  160.  
  161. l1 = h1.to_a
  162. l2 = h2.to_a
  163.  
  164. a["#{c[m]}_a"] = h1
  165. a["#{c[m]}_d"] = h2
  166. }
  167.  
  168. $stderr.puts(a.keys.inspect)
  169.  
  170. x = 0
  171. a.each \
  172. {
  173. |k, a2|
  174. a2.sort.each \
  175. {
  176. |mx, l|
  177. l.each { |y| puts([x, y, mx].join("\t")) }
  178. x += 1
  179. }
  180. x += 5
  181. }
Add Comment
Please, Sign In to add comment