mirror of https://github.com/coolaj86/fizzbuzz.git
hotplate: find the steady-state temperature of a theoretical square plate with heat on two sides and abs zero on the others
This commit is contained in:
parent
ad71d1f557
commit
57a8b8d5bd
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
* 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
|
||||
max_count = 10000000000000000;
|
||||
|
||||
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();
|
Loading…
Reference in New Issue