Last active
August 13, 2018 21:29
-
-
Save chad3814/ebcf407d7eabc7ef18db34f2f6a52347 to your computer and use it in GitHub Desktop.
States coloring problem
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
class Color { | |
constructor (name, multiplier) { | |
this.name = name; | |
this.multiplier = multiplier; | |
} | |
} | |
let colors = [ | |
new Color('red', 1), | |
new Color('blue', 2), | |
new Color('yellow', 3), | |
new Color('green', 4), | |
]; | |
class State { | |
constructor (name, value) { | |
this.neighbors = []; | |
this.color = null; | |
this.name = name; | |
this.value = value; | |
} | |
addNeighbors(...neighbors) { | |
this.neighbors.push(...neighbors); | |
} | |
getWeightedValue() { | |
if (this.color === null) { | |
throw new Error('No color assigned to ' + this.name); | |
} | |
return this.value * this.color.multiplier; | |
} | |
isColorValid(color) { | |
for (const neighbor of this.neighbors) { | |
if (neighbor.color === color) { | |
return false; | |
} | |
} | |
return true; | |
} | |
} | |
const states = { | |
Washington: new State('WA', 71), | |
Oregon: new State('OR', 98), | |
California: new State('CA', 163), | |
Idaho: new State('ID', 83), | |
Nevada: new State('NV', 110), | |
Montana: new State('MT', 147), | |
Wyoming: new State('WY', 97), | |
Utah: new State('UT', 84), | |
Arizona: new State('AZ', 113), | |
Colorado: new State('CO', 104), | |
NewMexico: new State('NM', 121), | |
NorthDakota: new State('ND', 70), | |
SouthDakota: new State('SD', 77), | |
Nebraska: new State('NE', 77), | |
Kansas: new State('KS', 82), | |
Oklahoma: new State('OK', 69), | |
Texas: new State('TX', 268), | |
Minnesota: new State('MN', 86), | |
Iowa: new State('IA', 56), | |
Missouri: new State('MO', 69), | |
Arkansas: new State('AR', 53), | |
Louisiana: new State('LA', 51), | |
}; | |
states.Washington.addNeighbors(states.Oregon, states.Idaho); | |
states.Oregon.addNeighbors(states.Washington, states.Idaho, states.California, states.Nevada); | |
states.California.addNeighbors(states.Oregon, states.Nevada, states.Arizona); | |
states.Idaho.addNeighbors(states.Washington, states.Oregon, states.Nevada, states.Utah, states.Wyoming, states.Montana); | |
states.Nevada.addNeighbors(states.Oregon, states.California, states.Arizona, states.Utah, states.Idaho); | |
states.Montana.addNeighbors(states.Idaho, states.Wyoming, states.SouthDakota, states.NorthDakota); | |
states.Wyoming.addNeighbors(states.Montana, states.Idaho, states.Utah, states.Colorado, states.Nebraska, states.SouthDakota); | |
states.Utah.addNeighbors(states.Idaho, states.Nevada, states.Arizona, states.Colorado, states.Wyoming); | |
states.Arizona.addNeighbors(states.Utah, states.Nevada, states.California, states.NewMexico); | |
states.Colorado.addNeighbors(states.Wyoming, states.Utah, states.NewMexico, states.Oklahoma, states.Kansas, states.Nebraska); | |
states.NewMexico.addNeighbors(states.Colorado, states.Arizona, states.Texas, states.Oklahoma); | |
states.NorthDakota.addNeighbors(states.Montana, states.SouthDakota, states.Minnesota); | |
states.SouthDakota.addNeighbors(states.NorthDakota, states.Montana, states.Wyoming, states.Nebraska, states.Iowa, states.Minnesota); | |
states.Nebraska.addNeighbors(states.SouthDakota, states.Wyoming, states.Colorado, states.Kansas, states.Missouri, states.Iowa); | |
states.Kansas.addNeighbors(states.Nebraska, states.Colorado, states.Oklahoma, states.Missouri); | |
states.Oklahoma.addNeighbors(states.Kansas, states.Colorado, states.NewMexico, states.Texas, states.Arkansas, states.Missouri); | |
states.Texas.addNeighbors(states.Oklahoma, states.NewMexico, states.Louisiana, states.Arkansas); | |
states.Minnesota.addNeighbors(states.NorthDakota, states.SouthDakota, states.Iowa); | |
states.Iowa.addNeighbors(states.Minnesota, states.SouthDakota, states.Nebraska, states.Missouri); | |
states.Missouri.addNeighbors(states.Iowa, states.Nebraska, states.Kansas, states.Oklahoma, states.Arkansas); | |
states.Arkansas.addNeighbors(states.Missouri, states.Oklahoma, states.Texas, states.Louisiana); | |
states.Louisiana.addNeighbors(states.Arkansas, states.Texas); | |
const calculateTotal = function () { | |
let total = 0; | |
for (const state of Object.values(states)) { | |
total += state.getWeightedValue(); | |
} | |
return total; | |
}; | |
const shuffle = function (arr) { | |
for (let i = arr.length - 1; i > 0; i--) { | |
const j = Math.floor(Math.random() * (i + 1)); | |
[arr[i], arr[j]] = [arr[j], arr[i]]; | |
} | |
return arr; | |
}; | |
const statesByNeighbors = Object.values(states).sort((b, a) => a.neighbors.length - b.neighbors.length); | |
const statesByValue = Object.values(states).sort((b, a) => a.value - b.value); | |
const statesByRandom = shuffle(Object.values(states)); | |
//console.log('by neighbor:', statesByNeighbors); | |
//console.log('by value:', statesByValue); | |
//console.log('by value:', statesByRandom); | |
const tryColoring = function (states_ordering, color_func) { | |
try { | |
Object.values(states).forEach((state) => state.color = null); | |
states_ordering.forEach((state) => color_func(state)); | |
return calculateTotal(); | |
} catch (err) { | |
return 9999; | |
} | |
}; | |
const defaultColorFunc = function (state) { | |
for (const color of colors) { | |
if (state.isColorValid(color)) { | |
state.color = color; | |
return; | |
} | |
} | |
throw new Error('Couldn\'t color the map'); | |
}; |
Author
chad3814
commented
Aug 13, 2018
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment