Guest User

cupido

a guest
Feb 22nd, 2020
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. function random_impl (state) {
  3.     var x = state.a|0;
  4.     x = x^(x<<13);
  5.     x = x^(x>>17);
  6.     x = x^(x<<5);
  7.     return state.a=(x|0);
  8. }
  9.  
  10. function random (state) {
  11.     return random_impl(state) / 2**32 + 0.5;
  12. }
  13.  
  14. function good_table (
  15.     table,
  16.     cases
  17. ) {
  18.     var random_state = {a: 260526127};
  19.     var badness = 0;
  20.     for(var j = 0; j < cases.length; j++){
  21.         badness += (dumb_cupid(table, cases[j][0], cases[j][1])-cases[j][2])**2;
  22.     }
  23.     for(var i = 0; i < 5000; i++){
  24.         var letters = "abcdefghijklmnopqrstuvwxyz";
  25.         var letter = letters[Math.floor(random(random_state)*26)];
  26.         var change = (random(random_state)*2-1) * 0.05;
  27.         var old = table[letter];
  28.         table[letter] += change;
  29.  
  30.         var new_bad = 0;
  31.         for(var j = 0; j < cases.length; j++){
  32.             new_bad += (dumb_cupid(table, cases[j][0], cases[j][1])-cases[j][2])**2;
  33.         }
  34.  
  35.         if(new_bad < badness){
  36.             badness = new_bad;
  37.         }else{
  38.             table[letter] = old;
  39.         }
  40.     }
  41. }
  42.  
  43. function dumb_cupid (letter_table, name_1, name_2) {
  44.     name_1 = name_1.toLowerCase();
  45.     name_2 = name_2.toLowerCase();
  46.  
  47.     var score = 0;
  48.  
  49.     if(name_1 == name_2){
  50.         return score;
  51.     }
  52.  
  53.     var n1fl = name_1[0];
  54.     var n2fl = name_2[0];
  55.     if(n1fl == n2fl){
  56.         score += letter_table[n1fl] * 5;
  57.     }
  58.     for(var i = 0; i < name_1.length; i++){
  59.         if( i >= name_2.length) break;
  60.  
  61.         n1fl = name_1[i];
  62.         n2fl = name_2[i];
  63.  
  64.         var k = (name_1.length-i);
  65.         var sum = 0;
  66.         for(var j = 0; j < name_1.length; j++){
  67.             sum += (name_1.length-j);
  68.         }
  69.         k /= sum;
  70.         if(name_2.length < name_1.length){
  71.             k = (name_2.length-i);
  72.             var sum = 0;
  73.             for(var j = 0; j < name_2.length; j++){
  74.                 sum += (name_2.length-j);
  75.             }
  76.             k /= sum;
  77.         }
  78.  
  79.         score += (letter_table[n1fl] + letter_table[n2fl]) / 2 * k * 95;
  80.     }
  81.  
  82.     return score;
  83. }
  84.  
  85. function cupid (name_1, name_2) {
  86.     name_1 = name_1.toLowerCase();
  87.     name_2 = name_2.toLowerCase();
  88.     var cases = [
  89.         ["Romeo", "Juliet", 95],
  90.         ["Jack", "Rose", 32]
  91.     ];
  92.     var letter_table = {
  93.         'a': 0.5, 'b': 0.5, 'c': 0.5, 'd': 0.5,
  94.         'e': 1.0, 'f': 0.5, 'g': 0.5, 'h': 0.5,
  95.         'i': 1.0, 'j': 1.0, 'k': 0.5, 'l': 1.0,
  96.         'm': 1.0, 'n': 0.5, 'o': 1.0, 'p': 0.5,
  97.         'q': 0.5, 'r': 1.0, 's': 0.5, 't': 1.0,
  98.         'u': 1.0, 'v': 0.5, 'w': 0.5, 'x': 0.5,
  99.         'y': 0.5, 'z': 0.5,
  100.     };
  101.     good_table(letter_table, cases);
  102.  
  103.     var score = 0;
  104.  
  105.     if(name_1 == name_2){
  106.         return score;
  107.     }
  108.  
  109.     var n1fl = name_1[0];
  110.     var n2fl = name_2[0];
  111.     if(n1fl == n2fl){
  112.         score += letter_table[n1fl] * 5;
  113.     }
  114.     for(var i = 0; i < name_1.length; i++){
  115.         if( i >= name_2.length) break;
  116.  
  117.         n1fl = name_1[i];
  118.         n2fl = name_2[i];
  119.  
  120.         var k = (name_1.length-i);
  121.         var sum = 0;
  122.         for(var j = 0; j < name_1.length; j++){
  123.             sum += (name_1.length-j);
  124.         }
  125.         k /= sum;
  126.         if(name_2.length < name_1.length){
  127.             k = (name_2.length-i);
  128.             var sum = 0;
  129.             for(var j = 0; j < name_2.length; j++){
  130.                 sum += (name_2.length-j);
  131.             }
  132.             k /= sum;
  133.         }
  134.  
  135.         score += (letter_table[n1fl] + letter_table[n2fl]) / 2 * k * 95;
  136.     }
  137.  
  138.     return score;
  139. }
  140.  
  141. function test (name_1, name_2) {
  142.     console.log(`${name_1}, ${name_2} => ${cupid(name_1, name_2)}`);
  143. }
  144.  
  145. test("Romeo", "Juliet");
  146. test("Jack", "Rose");
Advertisement
Add Comment
Please, Sign In to add comment