-
Notifications
You must be signed in to change notification settings - Fork 0
/
generation-002.js
83 lines (70 loc) · 2.58 KB
/
generation-002.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/**
* CHANGELOG:
* Generation 0: implement base script
* Generation 1: add Mandelbrot algorithm
* Generation 2: add user-defined coordinates range and max iterations
*/
import { generations, evolve } from "./base.js";
const generation = 2;
console.log(`Generation ${generation} spawned`);
// Define a function to get user input
async function getInput(prompt) {
const { stdin, stdout } = process;
return new Promise(resolve => {
stdin.resume();
stdout.write(prompt);
stdin.on('data', data => resolve(data.toString().trim()));
});
}
async function output() {
// Define constants based on the output specs
const WIDTH = 90;
const HEIGHT = 30;
// Get user-defined coordinates range and max iterations, or use default values
const xmin = parseFloat(await getInput('Please enter the minimum x coordinate value: ')) || -2;
const xmax = parseFloat(await getInput('Please enter the maximum x coordinate value: ')) || 1;
const ymin = parseFloat(await getInput('Please enter the minimum y coordinate value: ')) || -1;
const ymax = parseFloat(await getInput('Please enter the maximum y coordinate value: ')) || 1;
const MAX_ITERATIONS = parseInt(await getInput('Please enter the maximum number of iterations (integer): ')) || 100;
// Create an empty matrix of the required dimensions (90x30) (initial matrix)
const matrix = Array(HEIGHT).fill().map(() => Array(WIDTH).fill(' '));
// Iterate over each point in the matrix
for (let y = 0; y < HEIGHT; y++) {
for (let x = 0; x < WIDTH; x++) {
// Convert matrix-coordinates to real numbers
const a = xmin + (x / (WIDTH-1)) * (xmax - xmin);
const b = ymax - (y / (HEIGHT-1)) * (ymax - ymin);
let i = 0;
let za = 0;
let zb = 0;
// Iterate calculations until it exits the "bounding circle"
while (i < MAX_ITERATIONS && (za * za + zb * zb) < 4) {
const temp = za * za - zb * zb + a;
zb = 2 * za * zb + b;
za = temp;
i++;
}
// Assign an ascii character to the corresponding matrix-coordinate according to the number of iterations MAX_ITERATIONS
const char = i === MAX_ITERATIONS ? '*' : String.fromCharCode(32 + (i % 15));
matrix[y][x] = char;
}
}
// Log matrix to the console using nested loops
for (let y = 0; y < matrix.length; y++) {
let row = '';
for (let x = 0; x < matrix[y].length; x++) {
row += matrix[y][x];
}
console.log(row);
}
}
await output();
if (generation < generations) {
try {
await evolve(generation);
} catch (error) {
console.error(error);
}
} else {
console.log("GOAL achieved!");
}