Skip to content

Instantly share code, notes, and snippets.

@chad3814
Last active August 13, 2018 21:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chad3814/ebcf407d7eabc7ef18db34f2f6a52347 to your computer and use it in GitHub Desktop.
Save chad3814/ebcf407d7eabc7ef18db34f2f6a52347 to your computer and use it in GitHub Desktop.
States coloring problem
'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');
};
@chad3814
Copy link
Author

coloring

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment