Guest User

Untitled

a guest
Jul 23rd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. // @ts-check
  2.  
  3. const levenshtein = require("fast-levenshtein");
  4. const crypto = require("crypto");
  5.  
  6. const traceHashMap = {};
  7.  
  8. const trace = n => {
  9. const hash = crypto.createHash("sha1");
  10. hash.update(n.toString());
  11. const str = hash.digest("hex");
  12. return str
  13. .split("")
  14. .reduce((acc, char) => (parseInt(char) + 1 ? acc : acc + char), "");
  15. };
  16.  
  17. for (let i = 0; i < 100; i++) {
  18. traceHashMap[i] = trace(i);
  19. }
  20.  
  21. const affinity = (n, m) => levenshtein.get(traceHashMap[n], traceHashMap[m]);
  22.  
  23. const posdist = (n, m, arr) => Math.abs(arr.indexOf(n) - arr.indexOf(m));
  24.  
  25. const pairScore = (n, m, arr) => affinity(n, m) / posdist(n, m, arr);
  26.  
  27. const score = arr =>
  28. arr.reduce(
  29. (nacc, n) =>
  30. nacc +
  31. arr.reduce((macc, m) => {
  32. if (n >= m || n === m) {
  33. return macc;
  34. }
  35. return posdist(n, m, arr) <= 3 ? macc + pairScore(n, m, arr) : macc;
  36. }, 0),
  37. 0
  38. );
  39.  
  40. const imperativeScore = arr => {
  41. let iScore = 0;
  42. for (let n = 0; n < arr.length; n++) {
  43. for (let m = 0; m < arr.length; m++) {
  44. iScore = iScore + getScore(n, m, arr);
  45. }
  46. }
  47. return iScore;
  48. };
  49.  
  50. const getScore = (n, m, arr) => {
  51. return n < m && n !== m && posdist(n, m, arr) <= 3 ? pairScore(n, m, arr) : 0;
  52. };
  53.  
  54. const getRandomArr = n => {
  55. const reference = new Array(n);
  56. const result = [];
  57. for (let i = 0; i < n; i++) {
  58. reference[i] = i + 1;
  59. }
  60. for (let i = 1; i <= n; i++) {
  61. const index = Math.floor(Math.random() * reference.length);
  62. result.push(reference.splice(index, 1)[0]);
  63. }
  64. return result;
  65. };
  66.  
  67. const getSequence = n => {
  68. const result = new Array(n);
  69. for (let i = 0; i < n; i++) {
  70. result[i] = i;
  71. }
  72. return result;
  73. };
  74.  
  75. const createOptimisedArray = (length, seed, n) => {
  76. // For the given seed, compute the next n best fits in the chain
  77. const result = new Array(length);
  78. result[0] = seed;
  79. const reference = getSequence(length);
  80. console.log(reference);
  81. return;
  82. for (let i = 1; i < length; i++) {
  83. const { score, index } = getNextBestScore(result[i - 1], result, reference);
  84. console.log(reference, index);
  85. result[i] = reference[index];
  86. reference.splice(reference.indexOf(index), 1);
  87. }
  88. return result;
  89. };
  90.  
  91. const getNextBestScore = (n, currentArr, remainingArr) => {
  92. let index = 0;
  93. let max = 0;
  94. for (let i = 0; i < remainingArr.length; i++) {
  95. console.log(
  96. "getScore",
  97. n,
  98. remainingArr[i],
  99. JSON.stringify([...currentArr, remainingArr[i]])
  100. );
  101. const score = getScore(n, remainingArr[i], [
  102. ...currentArr,
  103. remainingArr[i]
  104. ]);
  105. // console.log("score", score);
  106. if (score > max) {
  107. max = score;
  108. index = i;
  109. }
  110. }
  111. return { score: max, index };
  112. };
  113.  
  114. let max = 0;
  115. let comps = 0;
  116. let time = Date.now();
  117. // while (true) {
  118. // const testArr = getRandomArr(100);
  119. // const arrScore = imperativeScore(testArr);
  120. // if (arrScore > max) {
  121. // console.log("New result", arrScore, JSON.stringify(testArr));
  122. // console.log("Computations", comps);
  123. // console.log("C/sec", comps / ((Date.now() - time) / 1000));
  124. // max = arrScore;
  125. // }
  126. // comps++;
  127. // }
  128. const ex = createOptimisedArray(100, 0);
  129. console.log(ex);
  130. console.log(imperativeScore(ex), JSON.stringify(ex));
Add Comment
Please, Sign In to add comment