Skip to content

Instantly share code, notes, and snippets.

@Aleksey-Danchin
Created June 27, 2016 11:54
Show Gist options
  • Save Aleksey-Danchin/74d450883ab0e21e17a395fd3aeca9bc to your computer and use it in GitHub Desktop.
Save Aleksey-Danchin/74d450883ab0e21e17a395fd3aeca9bc to your computer and use it in GitHub Desktop.
Скрипт поика разреза на одинаковые части.
"use strict";
let res = `
1111110
1111100
1111111
1111111
1111111
0111111
0111111
0011110
`.trim().split('\n').map(row => row.split('').map(e => e === '1' ? 0 : -1));
let fields = 0;
res.forEach(row => row.forEach(e => fields += e === 0));
if ((fields % 2) !== 0) return false;
let order = [];
for (let i = 0; i < fields / 2; i++) order.push(1);
for (let i = 0; i < fields / 2; i++) order.push(0);
let plan;
/////////////////////////////////////////////////////////////////////////////////////
do {
bindOrder();
if (!checkArialsСontinuity()) continue;
if (checkArials(...getArials())) writePlan();
} while (nextOrder());
//////////////////////////////////////////////////////////////////////////////////////
function nextOrder () {
if (order[fields - 1] === 0)
for (let i = fields - 2; i >= 0 ; i--)
if (order[i] === 1 && order[i + 1] === 0) {
order[i] = 0;
order[i + 1] = 1;
return true;
}
let counter = 0;
for (let i = fields - 1; i > 0; i--)
if (order[i] === 1) counter++;
else if (order[i - 1] === 1) {
counter++;
order[i - 1] = 0;
for (var j = 0; j < counter; j++)
order[i + j] = 1;
for (; i + j < fields; j++)
order[i + j] = 0;
return true;
}
return false;
}
function bindOrder () {
let i = 0;
plan = res.map(row => row.map(e => e === -1 ? -1 : order[i++]));
}
function checkArialsСontinuity () {
return checkArialСontinuityByFlag(0) && checkArialСontinuityByFlag(1);
function checkArialСontinuityByFlag (flag) {
let plan1 = plan.map(row => row.map(e => e));
let isInfected = false;
for (let i = 0; i < plan1.length; i++) {
if (isInfected) break;
for (let j = 0; j < plan1[i].length; j++) {
if (plan1[i][j] === flag) {
plan1[i][j] = 2;
isInfected = true;
break;
}
}
}
isInfected = true;
while (isInfected) {
isInfected = false;
for (let i = 0; i < plan1.length; i++)
for (let j = 0; j < plan1[i].length; j++) {
if (plan1[i][j] !== 2) continue;
if (i > 0 && plan1[i - 1][j] === flag) { plan1[i - 1][j] = 2; isInfected = true; }
if (i < (plan1.length - 1) && plan1[i + 1][j] === flag) { plan1[i + 1][j] = 2; isInfected = true; }
if (j > 0 && plan1[i][j - 1] === flag) { plan1[i][j - 1] = 2; isInfected = true; }
if (j < (plan1[i].length - 1) && plan1[i][j + 1] === flag) { plan1[i][j + 1] = 2; isInfected = true; }
}
}
for (let i = 0; i < plan1.length; i++)
for (let j = 0; j < plan1[i].length; j++)
if (plan1[i][j] === flag) return false;
return true;
}
}
function getArials () {
return [getArialByFlag(0), getArialByFlag(1)];
function getArialByFlag (flag) {
let plan1 = plan.filter(row => row.some(e => e === flag));
let plan2 = [];
for (let j = 0; j < plan1[0].length; j++) {
let row = [];
for (let i = 0; i < plan1.length; i++)
row.push(plan1[i][j]);
plan2.push(row);
}
plan2 = plan2.filter(row => row.some(e => e === flag));
return plan2;
}
}
function checkArials (arial0, arial1) {
arial0 = righter(arial0);
arial1 = righter(arial1);
if (arial0.length !== arial1.length || arial0[0].length !== arial1[0].length) return false;
if (check()) return true;
arial0 = arial0.map(row => row.reverse());
if (check()) return true;
arial0 = arial0.reverse();
if (check()) return true;
arial0 = arial0.map(row => row.reverse());
if (check()) return true;
if (arial0.length !== arial1[0].length) return false;
let plan1 = [];
for (let j = 0; j < arial0[0].length; j++) {
let row = [];
for (let i = 0; i < arial0.length; i++)
row.push(arial0[i][j]);
plan1.push(row);
}
arial0 = plan1;
if (check()) return true;
arial0 = arial0.map(row => row.reverse());
if (check()) return true;
arial0 = arial0.reverse();
if (check()) return true;
arial0 = arial0.map(row => row.reverse());
if (check()) return true;
return false;
function righter (arial) {
if (arial.length > arial[0].length) {
let plan1 = [];
for (let j = 0; j < arial[0].length; j++) {
let row = [];
for (let i = 0; i < arial.length; i++)
row.push(arial[i][j]);
plan1.push(row);
}
return plan1;
}
return arial;
}
function check () {
for (let i = 0; i < arial0.length; i++) {
for (let j = 0; j < arial0[0].length; j++) {
if (arial0[i][j] === 0 && arial1[i][j] !== 1) return false;
}
}
for (let i = 0; i < plan.length; i++)
for (let j = 0; j < plan[0].length; j++) {
if (plan[i][j] === -1) continue;
if (plan[i][j] === 0) return false;
return true
}
return true;
}
}
function writePlan () {
console.log(plan.map(row => row.map(e => e === -1 ? 0 : (e === 0 ? 1 : 2))).map(row => row.join('')).join('\n'), '\n');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment