Published
Edited
Dec 14, 2020
Insert cell
Insert cell
solve(toArray(exampleinput))(adjacent) // example part 1 solution
Insert cell
solve(toArray(input))(adjacent) // example part 1 solution
Insert cell
solve(toArray(exampleinput))(lineOfSight) // example part 2 solution
Insert cell
solve(toArray(input))(lineOfSight) // part 2 solution
Insert cell
solve = data => interator => {
let pos = cloneData(data)
let ppos
let diffs = Infinity
while(diffs > 0) {
ppos = cloneData(pos)
pos = interator(ppos)
diffs = 0
for(let i = 0; i < data.length; i++) {
for(let j = 0; j < data[0].length; j++) {
if(ppos[i][j]!=pos[i][j]) diffs++;
}
}
}
let oseats = 0
for(let i = 0; i < data.length; i++) {
for(let j = 0; j < data[0].length; j++) {
if(pos[i][j]=="#") oseats++
}
}
return oseats
}
Insert cell
adjacent = data => {
let clone = JSON.parse(JSON.stringify(data))
for(let i = 0; i < data.length; i++) {
for(let j = 0; j < data[0].length; j++) {

if(data[i][j]==".") continue;
let occupiedcount = 0;
if(i>0) if(data[i-1][j]=="#") occupiedcount++;
if(i<data.length-1) if(data[i+1][j]=="#") occupiedcount++;
if(j>0) if(data[i][j-1]=="#") occupiedcount++;
if(j<data[0].length-1) if(data[i][j+1]=="#") occupiedcount++;
if(i>0 && j>0) if(data[i-1][j-1]=="#") occupiedcount++;
if(i>0 && j<data[0].length-1) if(data[i-1][j+1]=="#") occupiedcount++;
if(i<data.length-1 && j>0) if(data[i+1][j-1]=="#") occupiedcount++;
if(i<data.length-1 && j<data[0].length-1) if(data[i+1][j+1]=="#") occupiedcount++;

if(data[i][j]=="L") {
if(occupiedcount==0) clone[i][j]="#"
} else {
if(occupiedcount>=4) clone[i][j]="L"
}
}
}
return clone
}
Insert cell
lineOfSight = data => {
let clone = cloneData(data)
for(let i = 0; i < data.length; i++) {
for(let j = 0; j < data[0].length; j++) {

if(data[i][j]==".") continue;
let occupiedcount = scanleft(data,i,j) +
scanright(data,i,j) +
scanup(data, i, j) +
scandown(data, i, j) +
scanupright(data, i, j) +
scanupleft(data, i, j) +
scandownleft(data, i, j) +
scandownright(data, i, j)
if(data[i][j]=="L") {
if(occupiedcount==0) clone[i][j]="#"
} else {
if(occupiedcount>=5) clone[i][j]="L"
}
}
}
return clone
}
Insert cell
cloneData = arr => JSON.parse(JSON.stringify(arr))
Insert cell
scanleft = (data, i, j) => {

let left = j
while(left > 0) {
left--;
if(data[i][left]=="#") return 1
if(data[i][left]=="L") return 0
}
return 0
}
Insert cell
scanright = (data, i, j) => {

let right = j
while(right < data[0].length) {
right++;
if(data[i][right]=="#") return 1
if(data[i][right]=="L") return 0
}
return 0
}
Insert cell
scanup = (data, i, j) => {

let up = i
while(up > 0) {
up--;
if(data[up][j]=="#") return 1
if(data[up][j]=="L") return 0
}
return 0
}
Insert cell
scandown = (data, i, j) => {

let down = i
while(down < data.length-1) {
down++;
if(data[down][j]=="#") return 1
if(data[down][j]=="L") return 0
}
return 0
}
Insert cell
scanupright = (data, i, j) => {

let up = i
let right = j
while(up > 0 && right < data[0].length) {
up--;
right++;
if(data[up][right]=="#") return 1
if(data[up][right]=="L") return 0
}
return 0
}
Insert cell
scanupleft = (data, i, j) => {

let up = i
let left = j
while(up > 0 && left > 0) {
up--;
left--;
if(data[up][left]=="#") return 1
if(data[up][left]=="L") return 0
}
return 0
}
Insert cell
scandownleft = (data, i, j) => {

let down = i
let left = j
while(down < data.length-1 && left > 0) {
down++;
left--;
if(data[down][left]=="#") return 1
if(data[down][left]=="L") return 0
}
return 0
}
Insert cell
scandownright = (data, i, j) => {

let down = i
let right = j
while(down < data.length-1 && right < data[0].length - 1) {
down++;
right++
if(data[down][right]=="#") return 1
if(data[down][right]=="L") return 0
}
return 0
}
Insert cell
toArray = data => data.split("\n").map(z => z.split(""))
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
test4 = {
const data = toArray(exampleinput4)
const i = 3
const j = 3
return scanleft(data,i,j) +
scanright(data,i,j) +
scanup(data, i, j) +
scandown(data, i, j) +
scanupright(data, i, j) +
scanupleft(data, i, j) +
scandownleft(data, i, j) +
scandownright(data, i, j) == 0
}
Insert cell
Insert cell
test3 = {
const data = toArray(exampleinput3)
const i = 1
const j = 1
return scanleft(data,i,j) +
scanright(data,i,j) +
scanup(data, i, j) +
scandown(data, i, j) +
scanupright(data, i, j) +
scanupleft(data, i, j) +
scandownleft(data, i, j) +
scandownright(data, i, j) == 0
}
Insert cell
Insert cell
test2 = {
const data = toArray(exampleinput2)
const i = 4
const j = 3
return scanleft(data,i,j) +
scanright(data,i,j) +
scanup(data, i, j) +
scandown(data, i, j) +
scanupright(data, i, j) +
scanupleft(data, i, j) +
scandownleft(data, i, j) +
scandownright(data, i, j) == 8
}
Insert cell
scanupright(toArray(exampleinput2), 4, 3)
Insert cell
scanupleft(toArray(exampleinput2), 4, 3)
Insert cell
scandownright(toArray(exampleinput2), 4, 3)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more