Skip to content

Commit c204977

Browse files
committed
PHP and Javascript solutions to moderate challenge #161 - Game of life
1 parent 111088e commit c204977

File tree

3 files changed

+210
-0
lines changed

3 files changed

+210
-0
lines changed

moderate/161 - Game of life/161.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// https://www.codeeval.com/open_challenges/161/
2+
3+
4+
function game_of_life(grid, size){
5+
var max = size * size;
6+
// count live neighbors of every cell
7+
var neighbors = [];
8+
var i = 0;
9+
for( i=0; i < max ; i++ ){
10+
neighbors[i] = 0;
11+
}
12+
for( i=0; i < max ; i++ ){
13+
var c = i % size;
14+
var r = (i / size) >> 0;
15+
if( grid[i] == '*' ){
16+
// alive
17+
18+
if( c > 0 ){
19+
neighbors[i - 1]++; // update left neighbor
20+
if( r > 0 ){
21+
neighbors[i - size - 1]++; // update top-left neighbor
22+
}
23+
if( r < size-1 ){
24+
neighbors[i + size - 1]++; // update bottom-left neighbor
25+
}
26+
}
27+
if( c < size-1 ) {
28+
neighbors[i + 1]++; // update right neighbor
29+
if( r > 0 ){
30+
neighbors[i - size + 1]++; // update top-right neighbor
31+
}
32+
if( r < size-1 ){
33+
neighbors[i + size + 1]++; // update bottom-right neighbor
34+
}
35+
}
36+
if( r > 0 ){
37+
neighbors[i - size]++; // update top neighbor
38+
}
39+
if( r < size-1 ){
40+
neighbors[i + size]++; // update bottom neighbor
41+
}
42+
}
43+
}
44+
45+
for( i=0 ; i < max ; i++ ){
46+
var alive = (grid[i] == '*');
47+
var cnt = neighbors[i];
48+
if( alive ){
49+
// alive
50+
if( cnt < 2 || cnt > 3 ){
51+
// Any live cell with fewer than two live neighbors dies, as if caused by under-population.
52+
// Any live cell with more than three live neighbors dies, as if by overcrowding.
53+
grid[i] = '.';
54+
}
55+
}
56+
else{
57+
// dead
58+
// Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.
59+
if( cnt == 3 ){
60+
grid[i] = '*';
61+
}
62+
}
63+
}
64+
65+
return grid;
66+
}
67+
68+
var grid = '';
69+
var size = 0;
70+
71+
var fs = require("fs");
72+
fs.readFileSync(process.argv[2]).toString().split('\n').forEach(function (line) {
73+
line = line.trim();
74+
if( line !== '' ){
75+
if( !size ) size = line.length;
76+
grid += line;
77+
}
78+
});
79+
80+
grid = grid.split('');
81+
var i = 10;
82+
while( i-- ){
83+
grid = game_of_life(grid, size);
84+
}
85+
86+
for( i=0; i < size; i++){
87+
console.log( grid.slice(i*size, (i+1)*size).join('') );
88+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<?php
2+
header('Content-Type: text/plain; charset=utf-8');
3+
4+
// https://www.codeeval.com/open_challenges/161/
5+
6+
if( isset($_GET['f_i_l_e']) && $_GET['f_i_l_e'] ) $argv[1] = $_GET['f_i_l_e'];
7+
8+
function game_of_life($grid, $size){
9+
$max = $size * $size;
10+
// count live neighbors of every cell
11+
$neighbors = array_fill(0,$max,0);
12+
for( $i=0; $i < $max ; $i++ ){
13+
$c = $i % $size;
14+
$r = ($i / $size) >> 0;
15+
// echo $i.': '.$c.'x'.$r."\n";
16+
if( $grid[$i] == '*' ){
17+
// alive
18+
19+
if( $c > 0 ){
20+
$neighbors[$i - 1]++; // update left neighbor
21+
if( $r > 0 ){
22+
$neighbors[$i - $size - 1]++; // update top-left neighbor
23+
}
24+
if( $r < $size-1 ){
25+
$neighbors[$i + $size - 1]++; // update bottom-left neighbor
26+
}
27+
}
28+
if( $c < $size-1 ) {
29+
$neighbors[$i + 1]++; // update right neighbor
30+
if( $r > 0 ){
31+
$neighbors[$i - $size + 1]++; // update top-right neighbor
32+
}
33+
if( $r < $size-1 ){
34+
$neighbors[$i + $size + 1]++; // update bottom-right neighbor
35+
}
36+
}
37+
if( $r > 0 ){
38+
$neighbors[$i - $size]++; // update top neighbor
39+
}
40+
if( $r < $size-1 ){
41+
$neighbors[$i + $size]++; // update bottom neighbor
42+
}
43+
}
44+
}
45+
46+
for( $i=0 ; $i < $max ; $i++ ){
47+
$alive = ($grid[$i] == '*');
48+
$cnt = $neighbors[$i];
49+
if( $alive ){
50+
// alive
51+
if( $cnt < 2 || $cnt > 3 ){
52+
// Any live cell with fewer than two live neighbors dies, as if caused by under-population.
53+
// Any live cell with more than three live neighbors dies, as if by overcrowding.
54+
$grid[$i] = '.';
55+
}
56+
}
57+
else{
58+
// dead
59+
// Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.
60+
if( $cnt == 3 ){
61+
$grid[$i] = '*';
62+
}
63+
}
64+
}
65+
66+
return $grid;
67+
}
68+
69+
if( isset($argv[1]) && $argv[1] ){
70+
$filename = $argv[1];
71+
if( file_exists($filename) ){
72+
if( is_readable($filename) ){
73+
$fp = fopen($filename, 'r');
74+
if( $fp ){
75+
$grid = '';
76+
$size = 0;
77+
while ( $fp && !feof( $fp ) ) {
78+
$line = trim(fgets($fp));
79+
if( $line ){
80+
if(!$size) {
81+
$size = strlen($line);
82+
}
83+
$grid .= $line;
84+
}
85+
}//
86+
fclose( $fp );
87+
88+
$i = 10;
89+
while( $i-- ){
90+
$grid = game_of_life($grid, $size);
91+
}
92+
echo implode("\n",str_split($grid,$size))."\n";
93+
}
94+
else{
95+
echo '!fp'."\n";
96+
}
97+
}
98+
else{
99+
echo '!readable'."\n";
100+
}
101+
}
102+
else{
103+
echo '!file_exists'."\n";
104+
}
105+
}
106+
else{
107+
echo '!argv[1]'."\n";
108+
}
109+
110+
exit(0);
111+
112+
?>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.........*
2+
.*.*...*..
3+
..........
4+
..*.*....*
5+
.*..*...*.
6+
.........*
7+
..........
8+
.....*..*.
9+
.*....*...
10+
.....**...

0 commit comments

Comments
 (0)