57 lines
1.7 KiB
JavaScript
57 lines
1.7 KiB
JavaScript
// Orders 1, 2 and 3 of the Sierpinski Carpet
|
|
// as lines of text.
|
|
|
|
// Generic text output for use in any JavaScript environment
|
|
// Browser JavaScripts may use console.log() to return textual output
|
|
// others use print() or analogous functions.
|
|
|
|
[1, 2, 3].map(function sierpinskiCarpetOrder(n) {
|
|
|
|
// An (n * n) grid of (filled or empty) sub-rectangles
|
|
// n --> [[s]]
|
|
var carpet = function (n) {
|
|
var lstN = range(0, Math.pow(3, n) - 1);
|
|
|
|
// State of each cell in an N * N grid
|
|
return lstN.map(function (x) {
|
|
return lstN.map(function (y) {
|
|
return inCarpet(x, y);
|
|
});
|
|
});
|
|
},
|
|
|
|
// State of a given coordinate in the grid:
|
|
// Filled or not ?
|
|
// (See https://en.wikipedia.org/wiki/Sierpinski_carpet#Construction)
|
|
// n --> n --> bool
|
|
inCarpet = function (x, y) {
|
|
return (!x || !y) ? true :
|
|
!(
|
|
(x % 3 === 1) &&
|
|
(y % 3 === 1)
|
|
) && inCarpet(
|
|
x / 3 | 0,
|
|
y / 3 | 0
|
|
);
|
|
},
|
|
|
|
// Sequence of integers from m to n
|
|
// n --> n --> [n]
|
|
range = function (m, n) {
|
|
return Array.apply(null, Array(n - m + 1)).map(
|
|
function (x, i) {
|
|
return m + i;
|
|
}
|
|
);
|
|
};
|
|
|
|
// Grid of booleans mapped to lines of characters
|
|
// [[bool]] --> s
|
|
return carpet(n).map(function (line) {
|
|
return line.map(function (bool) {
|
|
return bool ? '\u2588' : ' ';
|
|
}).join('');
|
|
}).join('\n');
|
|
|
|
}).join('\n\n');
|