2010-10-21 06:56:42 +00:00
|
|
|
/*
|
|
|
|
* Weds Oct 20th 2010
|
|
|
|
*
|
|
|
|
* Helping a friend with some homework, decided to do it for myself for fun.
|
|
|
|
*
|
|
|
|
* CS142 - BYU Fall Semester 2010 - Hotplate Lab
|
|
|
|
*
|
|
|
|
* The spec is like this:
|
|
|
|
*
|
|
|
|
* use a 2-d array representing a (18x18) plate with 4 edges (20x20 total) touching
|
|
|
|
* two sides against a maximum (100) temperature surface (the first and last rows)
|
|
|
|
* and the others against a minimum (0) temperature surface (the first and last columns)
|
|
|
|
*
|
|
|
|
* Each instant the temperature of a given point on the plate (hotplate[x][y])
|
|
|
|
* is calculated by averaging the top, bottom, left, and right points onto
|
|
|
|
* the point itself.
|
|
|
|
*
|
|
|
|
* Find the number of instances it takes until the difference between the previous
|
|
|
|
* and current temperature of the point which has changed the most in temperature
|
|
|
|
* is less than 0.1 units.
|
|
|
|
*
|
|
|
|
* Output the temperature of each point during that instant as a CSV.
|
|
|
|
* View the results in a spreadsheet.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
var HotPlate = {};
|
|
|
|
(function () {
|
|
|
|
var hotplate = [
|
|
|
|
[ 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
|
|
|
|
[ 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0 ]
|
|
|
|
];
|
|
|
|
|
|
|
|
// This is code I used to generate the array above (with a few minor modifications)
|
|
|
|
|
|
|
|
/*
|
|
|
|
var result = "[\n", i, j;
|
|
|
|
result += '[';
|
|
|
|
for (j = 0; j < 20; j += 1) {
|
|
|
|
result += '100, ';
|
|
|
|
}
|
|
|
|
result += '],\n';
|
|
|
|
for (i = 2; i < 20; i += 1) {
|
|
|
|
result += '[';
|
|
|
|
for (j = 0; j < 20; j += 1) {
|
|
|
|
result += ' 0, ';
|
|
|
|
}
|
|
|
|
result += '],\n';
|
|
|
|
}
|
|
|
|
result += '[';
|
|
|
|
for (j = 0; j < 20; j += 1) {
|
|
|
|
result += '100, ';
|
|
|
|
}
|
|
|
|
result += '],\n';
|
|
|
|
result += ']\n';
|
|
|
|
|
|
|
|
console.log(result);
|
|
|
|
*/
|
|
|
|
|
|
|
|
function find_steady_state_temperature() {
|
|
|
|
var row,
|
|
|
|
column,
|
|
|
|
sum, // the sum of surrounding cells
|
|
|
|
original, // the value of a cell before the change
|
|
|
|
variance, // the max of all the variances
|
|
|
|
allowed_variance = 0.1, // how much any cell may vary in temperature from one instance to the next.
|
|
|
|
// 0.000000000000001 is the lowest you can go. If you try zero it will run forever (IEEE floating-point errors?)
|
|
|
|
repeat = true, // if the base condition has yet to be met
|
|
|
|
count = 0, // safeguard in case the base-case logic is incorrect
|
2010-10-21 07:00:22 +00:00
|
|
|
max_count = 15000;
|
2010-10-21 06:56:42 +00:00
|
|
|
|
|
|
|
while (true === repeat && count < max_count) {
|
|
|
|
variance = 0;
|
|
|
|
for (row = 1; row < 19; row += 1) {
|
|
|
|
for (column = 1; column < 19; column += 1) {
|
|
|
|
original = hotplate[row][column];
|
|
|
|
|
|
|
|
sum = 0;
|
|
|
|
sum += hotplate[row-1][column];
|
|
|
|
sum += hotplate[row][column-1];
|
|
|
|
sum += hotplate[row+1][column];
|
|
|
|
sum += hotplate[row][column+1];
|
|
|
|
hotplate[row][column] = sum / 4;
|
|
|
|
|
|
|
|
variance = Math.max(hotplate[row][column] - original, variance);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
repeat = variance >= allowed_variance;
|
|
|
|
count += 1;
|
|
|
|
}
|
|
|
|
if (max_count === count) {
|
|
|
|
console.log("EPIC FAIL");
|
|
|
|
} else {
|
|
|
|
console.log("SUCCESS in just " + count + " instances!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function inspect() {
|
|
|
|
var result = '', str = '';
|
|
|
|
for (i = 0; i < 20; i += 1) {
|
|
|
|
for (j = 0; j < 20; j += 1) {
|
|
|
|
str = hotplate[i][j].toFixed(1).toString();
|
|
|
|
while (str.length < 5) {
|
|
|
|
str = ' ' + str;
|
|
|
|
}
|
|
|
|
str += ', ';
|
|
|
|
result += str;
|
|
|
|
}
|
|
|
|
result += '\n';
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
HotPlate.inspect = inspect;
|
|
|
|
HotPlate.calculate_steady_state_temperature = find_steady_state_temperature;
|
|
|
|
}());
|
|
|
|
|
|
|
|
HotPlate.calculate_steady_state_temperature();
|
|
|
|
HotPlate.inspect();
|