viewof rocks = {
replay;
const A = input;
const M = [...A];
const w = A.indexOf("\n");
function cycle() {
slideNorth();
slideWest();
slideSouth();
slideEast();
}
function slideEast() {
for (let y = 0; y < w; ++y) {
let block = w;
for (let i = w - 1; i >= 0; --i) {
const pos = i + y * (w + 1);
switch (M[pos]) {
case "O":
M[pos] = " ";
M[--block + y * (w + 1)] = "O";
break;
case "#":
block = i;
break;
case ".":
break;
}
}
}
}
function slideSouth() {
for (let x = 0; x < w; ++x) {
let block = w;
for (let i = w - 1; i >= 0; --i) {
switch (M[i * (w + 1) + x]) {
case "O":
M[i * (w + 1) + x] = " ";
M[--block * (w + 1) + x] = "O";
break;
case "#":
block = i;
break;
case ".":
break;
}
}
}
}
function slideWest() {
for (let y = 0; y < w; ++y) {
let block = -1;
for (let i = 0; i < w; ++i) {
const pos = i + y * (w + 1);
switch (M[pos]) {
case "O":
M[pos] = " ";
M[++block + y * (w + 1)] = "O";
break;
case "#":
block = i;
break;
case ".":
break;
}
}
}
}
function slideNorth() {
for (let x = 0; x < w; ++x) {
let block = -1;
for (let i = 0; i < w; ++i) {
switch (M[i * (w + 1) + x]) {
case "O":
M[i * (w + 1) + x] = " ";
M[++block * (w + 1) + x] = "O";
break;
case "#":
block = i;
break;
case ".":
break;
}
}
}
}
const seen = new Map();
let i, j;
const N = 1000000000;
for (i = 0; i < N; ++i) {
cycle();
const key = M.join("");
if (seen.has(key)) {
j = seen.get(key);
break;
}
seen.set(key, i);
yield show(M, w);
}
for (let k = (N - i) % (i - j); k > 0; --k) {
cycle();
yield show(M, w);
}
return yield show(M, w);
}