Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function random_impl (state) {
- var x = state.a|0;
- x = x^(x<<13);
- x = x^(x>>17);
- x = x^(x<<5);
- return state.a=(x|0);
- }
- function random (state) {
- return random_impl(state) / 2**32 + 0.5;
- }
- function good_table (
- table,
- cases
- ) {
- var random_state = {a: 260526127};
- var badness = 0;
- for(var j = 0; j < cases.length; j++){
- badness += (dumb_cupid(table, cases[j][0], cases[j][1])-cases[j][2])**2;
- }
- for(var i = 0; i < 5000; i++){
- var letters = "abcdefghijklmnopqrstuvwxyz";
- var letter = letters[Math.floor(random(random_state)*26)];
- var change = (random(random_state)*2-1) * 0.05;
- var old = table[letter];
- table[letter] += change;
- var new_bad = 0;
- for(var j = 0; j < cases.length; j++){
- new_bad += (dumb_cupid(table, cases[j][0], cases[j][1])-cases[j][2])**2;
- }
- if(new_bad < badness){
- badness = new_bad;
- }else{
- table[letter] = old;
- }
- }
- }
- function dumb_cupid (letter_table, name_1, name_2) {
- name_1 = name_1.toLowerCase();
- name_2 = name_2.toLowerCase();
- var score = 0;
- if(name_1 == name_2){
- return score;
- }
- var n1fl = name_1[0];
- var n2fl = name_2[0];
- if(n1fl == n2fl){
- score += letter_table[n1fl] * 5;
- }
- for(var i = 0; i < name_1.length; i++){
- if( i >= name_2.length) break;
- n1fl = name_1[i];
- n2fl = name_2[i];
- var k = (name_1.length-i);
- var sum = 0;
- for(var j = 0; j < name_1.length; j++){
- sum += (name_1.length-j);
- }
- k /= sum;
- if(name_2.length < name_1.length){
- k = (name_2.length-i);
- var sum = 0;
- for(var j = 0; j < name_2.length; j++){
- sum += (name_2.length-j);
- }
- k /= sum;
- }
- score += (letter_table[n1fl] + letter_table[n2fl]) / 2 * k * 95;
- }
- return score;
- }
- function cupid (name_1, name_2) {
- name_1 = name_1.toLowerCase();
- name_2 = name_2.toLowerCase();
- var cases = [
- ["Romeo", "Juliet", 95],
- ["Jack", "Rose", 32]
- ];
- var letter_table = {
- 'a': 0.5, 'b': 0.5, 'c': 0.5, 'd': 0.5,
- 'e': 1.0, 'f': 0.5, 'g': 0.5, 'h': 0.5,
- 'i': 1.0, 'j': 1.0, 'k': 0.5, 'l': 1.0,
- 'm': 1.0, 'n': 0.5, 'o': 1.0, 'p': 0.5,
- 'q': 0.5, 'r': 1.0, 's': 0.5, 't': 1.0,
- 'u': 1.0, 'v': 0.5, 'w': 0.5, 'x': 0.5,
- 'y': 0.5, 'z': 0.5,
- };
- good_table(letter_table, cases);
- var score = 0;
- if(name_1 == name_2){
- return score;
- }
- var n1fl = name_1[0];
- var n2fl = name_2[0];
- if(n1fl == n2fl){
- score += letter_table[n1fl] * 5;
- }
- for(var i = 0; i < name_1.length; i++){
- if( i >= name_2.length) break;
- n1fl = name_1[i];
- n2fl = name_2[i];
- var k = (name_1.length-i);
- var sum = 0;
- for(var j = 0; j < name_1.length; j++){
- sum += (name_1.length-j);
- }
- k /= sum;
- if(name_2.length < name_1.length){
- k = (name_2.length-i);
- var sum = 0;
- for(var j = 0; j < name_2.length; j++){
- sum += (name_2.length-j);
- }
- k /= sum;
- }
- score += (letter_table[n1fl] + letter_table[n2fl]) / 2 * k * 95;
- }
- return score;
- }
- function test (name_1, name_2) {
- console.log(`${name_1}, ${name_2} => ${cupid(name_1, name_2)}`);
- }
- test("Romeo", "Juliet");
- test("Jack", "Rose");
Advertisement
Add Comment
Please, Sign In to add comment