Programátorský úkol

Michael Žabka

Re:Programátorský úkol
« Odpověď #135 kdy: 12. 09. 2017, 22:17:31 »
Sice možná trochu delší na řádky, ale 100% funkcionální bez závislostí na ES2017 (core logika je jen v getSnakePath):
Kód: [Vybrat]
function getSnakePath(playGround, point = { x: 0, y: 0 }, direction = directions[0]) {
const current = playGround[point.y][point.x];
const nextPlayGround = removeXY(playGround, point);
const nextDirection = isInPlayGround(nextPlayGround, point.x + direction.x, point.y + direction.y)
? direction
: turnDirectionRight(direction);
const nextPoint = { x: point.x + nextDirection.x, y: point.y + nextDirection.y };
return [
current,
...isInPlayGround(nextPlayGround, nextPoint.x, nextPoint.y) ? getSnakePath(nextPlayGround, nextPoint, nextDirection) : [],
];
}

const directions = [
{ x: 1, y: 0 },
{ x: 0, y: 1 },
{ x: -1, y: 0 },
{ x: 0, y: -1 },
];

function turnDirectionRight(direction) {
return directions[(directions.indexOf(direction) + 1) % directions.length]
}

function removeXY(array, point) {
return array.reduce((nextArray, subArray, y) => [
...nextArray, y === point.y ? subArray.reduce((nextSubArray, value, x) => [
...nextSubArray, x === point.x ? undefined : value
], []) : subArray
], []);
}

function isInPlayGround(playGround, x, y) {
return y < playGround.length && y >= 0 && x < playGround[y].length && x >= 0 && typeof playGround[y][x] !== 'undefined';
}


Re:Programátorský úkol
« Odpověď #136 kdy: 12. 09. 2017, 22:40:14 »
Když se objekty nebudou vnořovat tak bude o to složitější ta konfigurace jak se má s daným pohledem zacházet - můžete totiž celkem jednoduše udělat 4 pohledy pro různé otočení matice, ale vybrání patřičných prvků nebude úplně jednoduché (protože tam nebude Xkrát vnořeno odříznutí prvního řádku), budou tam potřeba vzorečky podobně jako byly v tom řešení od Kolemjdoucího, čímž se ta rádoby krásnost krátkých řešení poněkud vytratí.
Otočení matice je dané pouze pořadím, v jakém se má procházet (zda nejprve sloupce nebo řádky) plus směrem procházení (vpřed nebo vzad). Oříznutí znamená, že se pole bude místo od nuly do délka pole - 1 procházet od zadané hodnoty po zadanou hodnotu. Znamená to tedy pamatovat si příznak osa X nebo osa Y, směr (+1 nebo -1) a 4 hodnoty ohraničující pole. Jediné vzorečky použité při procházení budou for cyklus a přičtení hodnoty (+1 nebo -1) k indexu.

jsmaniak

Re:Programátorský úkol
« Odpověď #137 kdy: 23. 09. 2017, 16:39:25 »
trocha javascript hatmatilky a je to :-)

const snake = (m, out = [], s = 0) => {
   if (m.length === 0) return out;
   let f = [['shift', 'concat'], ['pop', 'concat'], ['pop', 'reverse'], ['shift', 'reverse']][s % 4];
   return snake(m, out.concat([].concat.apply([], ([[m], m][Math.floor(s % 2)]).map(p => p[f[0]]()))[f[1]]()), s + 1);
};

console.log(snake(example1).join(', '));