Guest User

Untitled

a guest
Jul 21st, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 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 f3(n)
  13. return n.odd? ? (n * 3 + 1) : n / 2
  14.  
  15. end
  16.  
  17. def read(fn)
  18. l = (f = File.open(fn)).readlines.map { |x| Kernel.eval(x) }
  19. f.close
  20. $stderr.puts("#{fn} #{l.size}")
  21. return l
  22. end
  23.  
  24. def d(s)
  25. c = s.split('').select { |x| x == '1' }.size
  26. d = c.to_f / s.length
  27. return d
  28.  
  29. end
  30.  
  31. def e(s)
  32. l = s.split(/1+/) + s.split(/0+/)
  33. return l.size.to_f / s.length
  34. end
  35.  
  36. def c(l, f)
  37. c = 0
  38. de2 = 0.5
  39.  
  40. l.each \
  41. {
  42. |x|
  43. de = f.call(x.to_s(2)) - 0.5
  44. c += 1 if (de * de2 < 0)
  45. de2 = de
  46. }
  47.  
  48. return c.to_f / l.size
  49. end
  50.  
  51. def de(n)
  52. n1 = n
  53. l = [n]
  54. while (n >= n1 && n != 1)
  55. n = $f.call(n)
  56. l << n
  57. end
  58. cm = (0...l.size).max_by { |x| l[x] }
  59. l1 = l[0..cm]
  60. l2 = l[cm..-1]
  61.  
  62. d = lambda { |x| d(x) }
  63. e = lambda { |x| e(x) }
  64. t = l1.size + l2.size
  65. return {'d1' => c(l1, d), 'e1' => c(l1, e), 'd2' => c(l2, d), 'e2' => c(l2, e), 'l1' => l1.size, 'l2' => l2.size, 'l12' => t, 'l1r' => l1.size.to_f / t}
  66. end
  67.  
  68. def seq(n)
  69. n1 = n
  70. l = [n]
  71. while (n >= n1 && n != 1)
  72. n = {'packed' => true, 'unpacked' => false}[$w] ? f1(n) : f2(n)
  73. l << n
  74. end
  75. return l
  76. end
  77.  
  78. def disordered(l)
  79.  
  80. l1 = []
  81. l.each_with_index \
  82. {
  83. |x, i|
  84. l1[i] = d(x.to_s(2)) - 0.5
  85. return i - 1 if (i >= 1 && l1[i] * l1[i - 1] < 0)
  86. }
  87. return
  88. end
  89.  
  90. def glide(l, i)
  91.  
  92. n1 = l[i]
  93. i += 1 while (l[i] >= n1 && i < l.size - 1)
  94.  
  95. return i
  96.  
  97. end
  98.  
  99. def n2(n)
  100.  
  101. l = seq(n)
  102.  
  103. l1 = []
  104. mx = nil
  105. loop \
  106. {
  107.  
  108. i = disordered(l)
  109.  
  110. break if (i.nil? || (!mx.nil? && l.size < mx))
  111.  
  112. l1 << [l[i], glide(l, i) - i]
  113. mx = l1.map { |x| x[1] }.max
  114.  
  115. i += 1 if (i == 0)
  116. l = l[i..-1]
  117. }
  118. return if (l1.empty?)
  119.  
  120. x = l1.max_by { |x| x[1] }
  121.  
  122. return {'n' => x[0], 'cg' => x[1]}
  123.  
  124. end
  125.  
  126. def dist_j(l)
  127.  
  128. z1 = rand(l.size)
  129. ns = l[z1]['n'].to_s(2)
  130.  
  131. r = rand(ns.length) if (r.nil?)
  132.  
  133. ns[r, 1] = (ns[r, 1].to_i ^ 1).to_s
  134. n = ns.to_i(2)
  135. return n
  136.  
  137. end
  138.  
  139. def out(fn, l, a)
  140. f = File.open(fn, 'w')
  141. f.puts('$dat << eof')
  142. k = l[0].keys
  143. f.puts(k.join("\t"))
  144. l.each { |x| f.puts(x.values.join("\t")) }
  145.  
  146. f.puts('eof')
  147. f.puts('set colors classic; set ytics nomirror; set y2tics; plot \\')
  148. k.each { |x| f.puts("'$dat' using (column('#{x}')) with line #{a.fetch(x, '')},\\") if (a.member?(x)) }
  149. f.puts
  150. f.close
  151.  
  152. end
  153.  
  154.  
  155. tf = 1
  156.  
  157. $f = [lambda { |x| f1(x) }, lambda { |x| f2(x) }, lambda { |x| f3(x) }][tf]
  158.  
  159. l = read('mix19/mixdb.txt')
  160.  
  161. a = {}
  162. l.each { |x| a[x['n']] = x }
  163. l = a.values
  164.  
  165. l = (0...500).map { n2(dist_j(l)) }.compact
  166.  
  167. l2 = l.map { |x| de(x['n']) }.sort_by { |x| x['l1'] }
  168.  
  169. out('gnuplot1.cmd', l2, {'d1' => '', 'l1' => 'axes x1y2'})
  170.  
  171. l2.sort_by! { |x| x['l2'] }
  172.  
  173. out('gnuplot2.cmd', l2, {'l1' => '', 'l2' => 'lw 3', 'l12' => '', 'l1r' => 'axes x1y2'})
Add Comment
Please, Sign In to add comment