Skip to content

Instantly share code, notes, and snippets.

@mizuhara
Last active February 25, 2017 02:14
Show Gist options
  • Save mizuhara/bcd7da86b35d6cecbce83c852b7b2ed0 to your computer and use it in GitHub Desktop.
Save mizuhara/bcd7da86b35d6cecbce83c852b7b2ed0 to your computer and use it in GitHub Desktop.
const flatten = (ary) => {
return [].concat(...ary);
};
const parse = (src) => {
return flatten(flatten(src.split('/').map((rect) => {
return rect.split('-');
})).map((pt) => {
return pt.split(',');
})).map((s) => {
return s | 0;
});
};
const searchSharedRect = (x0, y0, x1, y1, x2, y2, x3, y3) => {
const xs = [ x0, x1, x2, x3 ].sort((a, b) => {
return a - b;
});
const ys = [ y0, y1, y2, y3 ].sort((a, b) => {
return a - b;
});
const lt = [ xs[1], ys[1] ];
const rb = [ xs[2], ys[2] ];
const hasSharedRect =
(x0 <= lt[0] && lt[0] <= x1) &&
(x0 <= rb[0] && rb[0] <= x1) &&
(x2 <= lt[0] && lt[0] <= x3) &&
(x2 <= rb[0] && rb[0] <= x3) &&
(y0 <= lt[1] && lt[1] <= y1) &&
(y0 <= rb[1] && rb[1] <= y1) &&
(y2 <= lt[1] && lt[1] <= y3) &&
(y2 <= rb[1] && rb[1] <= y3);
return hasSharedRect ? [ lt, rb ] : [];
};
const calculateArea = (rect) => {
return (rect[2] - rect[0] + 1) * (rect[3] - rect[1] + 1);
}
const countSharedPointsByTwoRects = (x0, y0, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5) => {
const a = flatten(searchSharedRect(x0, y0, x1, y1, x2, y2, x3, y3));
if(a.length === 0) {
return 0;
}
const b = flatten(searchSharedRect(...a, x4, y4, x5, y5));
if(b.length === 0) {
return calculateArea(a);
}
return calculateArea(a) - calculateArea(b);
};
const solve = (src) => {
const [ bx0, by0, bx1, by1, rx0, ry0, rx1, ry1, gx0, gy0, gx1, gy1 ] = parse(src);
const br = countSharedPointsByTwoRects(bx0, by0, bx1, by1, rx0, ry0, rx1, ry1, gx0, gy0, gx1, gy1);
const bg = countSharedPointsByTwoRects(bx0, by0, bx1, by1, gx0, gy0, gx1, gy1, rx0, ry0, rx1, ry1);
const rg = countSharedPointsByTwoRects(rx0, ry0, rx1, ry1, gx0, gy0, gx1, gy1, bx0, by0, bx1, by1);
return '' + (br + bg + rg);
};
const test = (src, expected) => {
const actual = solve(src);
const result = (actual === expected) ? 'ok' : '***NG***';
console.log(result);
};
// 10x10
/*0*/ test('5,1-7,9/3,2-8,6/0,5-9,5', '15');
/*1*/ test('0,0-9,9/0,0-9,9/0,0-9,9', '0');
/*2*/ test('0,0-9,9/0,0-0,9/1,0-9,9', '100');
/*3*/ test('2,5-7,6/0,5-7,7/2,0-8,6', '0');
/*4*/ test('1,9-4,9/4,9-7,9/0,3-7,4', '1');
/*5*/ test('6,1-6,9/5,0-7,4/5,1-7,2', '6');
/*6*/ test('4,0-9,8/5,1-6,8/0,2-9,7', '28');
/*7*/ test('2,8-8,9/7,9-8,9/8,3-8,9', '2');
/*8*/ test('3,3-9,4/0,1-8,4/1,2-8,9', '12');
/*9*/ test('2,1-8,3/0,1-3,7/8,3-8,4', '7');
/*10*/ test('5,4-6,9/0,0-6,0/5,3-9,8', '10');
/*11*/ test('1,1-9,7/1,1-3,8/3,8-7,9', '22');
/*12*/ test('2,4-6,7/3,2-7,8/1,0-9,4', '24');
/*13*/ test('0,2-1,5/8,1-8,3/1,8-6,8', '0');
/*14*/ test('5,2-9,5/9,1-9,2/8,0-8,6', '5');
/*15*/ test('5,0-6,4/2,1-6,4/3,8-3,9', '8');
/*16*/ test('0,4-6,9/4,1-6,9/7,6-9,7', '18');
/*17*/ test('0,0-5,5/0,1-2,8/5,3-9,4', '17');
/*18*/ test('0,2-5,6/5,6-8,7/0,1-2,6', '16');
/*19*/ test('7,2-8,4/1,0-6,8/1,3-7,6', '26');
/*20*/ test('4,3-9,3/0,0-6,5/0,0-4,8', '31');
/*21*/ test('3,4-4,6/2,2-4,8/2,0-8,4', '11');
/*22*/ test('1,2-6,5/0,5-4,7/2,8-2,9', '4');
/*23*/ test('4,1-7,5/2,1-9,9/1,7-2,9', '23');
/*24*/ test('1,6-5,6/0,3-5,7/0,2-2,6', '13');
/*25*/ test('1,3-3,4/1,4-3,4/9,2-9,9', '3');
/*26*/ test('6,3-7,6/2,2-2,3/1,3-9,8', '9');
/*27*/ test('2,2-9,7/1,8-9,8/2,2-8,9', '49');
/*28*/ test('1,2-6,9/7,6-9,9/4,3-9,9', '33');
/*29*/ test('6,0-7,5/0,4-3,8/1,4-5,8', '15');
/*30*/ test('2,0-9,7/0,5-3,8/5,1-7,7', '27');
/*31*/ test('1,2-8,7/3,1-4,3/2,3-5,8', '20');
/*32*/ test('1,0-7,7/0,1-5,4/0,0-2,3', '19');
/*33*/ test('2,0-3,7/1,1-3,7/5,3-5,9', '14');
/*34*/ test('7,2-9,8/1,0-6,8/0,2-9,9', '63');
/*35*/ test('1,1-5,3/0,3-8,7/2,3-8,7', '32');
/*36*/ test('3,4-6,6/1,0-9,1/4,0-9,9', '21');
/*37*/ test('0,0-4,7/0,5-5,9/0,2-4,5', '25');
/*38*/ test('1,1-9,9/2,2-7,4/2,4-7,7', '30');
/*39*/ test('3,2-9,9/2,0-6,6/0,5-8,9', '36');
/*40*/ test('0,1-8,8/0,5-9,8/2,3-2,4', '38');
/*41*/ test('0,0-8,6/4,3-9,9/7,1-9,9', '29');
/*42*/ test('0,0-8,8/2,4-9,8/0,1-9,2', '53');
// 1000000x1000000
/*0*/ test('0,0-999999,999999/0,0-999999,999999/0,0-999999,999999', '0');
/*1*/ test('0,0-999999,999999/0,0-0,999999/1,0-999999,999999', '1000000000000');
/*2*/ test('655822,899981-788586,907370/262080,47983-540321,834515/327083,392880-474728,550251', '23235346312');
/*3*/ test('332855,375381-953091,410430/311649,171289-637710,912139/113674,426911-658531,763493', '120432128946');
/*4*/ test('718118,613550-931221,983155/84495,98906-214393,787796/159096,14702-416478,360207', '14449477996');
/*5*/ test('809,351021-589370,525004/161241,390394-302773,958450/78299,230856-310951,941900', '80430542457');
/*6*/ test('140869,614312-559945,677721/424067,131309-645701,709237/22556,149538-902108,566473', '101023697750');
/*7*/ test('655941,129163-859649,985280/446717,159679-977047,839232/172790,559592-492587,741630', '146781576755');
/*8*/ test('17192,474077-715775,513703/177518,159867-395312,530025/331315,181585-695872,274046', '14547945541');
/*9*/ test('898603,252482-932681,923548/158284,561187-881317,881298/291114,46375-975112,431448', '6099016393');
/*10*/ test('460763,311625-742309,415024/708446,250395-980176,802067/190828,650489-798525,855977', '17155773920');
/*11*/ test('76405,197443-189085,423768/218793,635517-608524,914533/68011,184211-238902,819853', '29209657076');
/*12*/ test('602585,166640-862797,212028/844554,91101-971982,642729/130166,132319-619895,387625', '1613805895');
/*13*/ test('570213,345485-759193,657391/214801,517728-943628,936004/412700,32310-853707,623589', '65618672419');
/*14*/ test('251546,411491-781481,812128/271544,210234-536793,313835/174707,164436-353882,432689', '10699927141');
/*15*/ test('768602,340406-876104,451915/531084,97975-614595,607952/297417,452002-545499,950992', '2248189616');
/*16*/ test('824147,181473-928495,890221/673583,148595-734839,191460/532038,851156-892611,920296', '2674653690');
/*17*/ test('507676,577270-927426,825282/385783,352947-643538,691954/243369,815194-385405,859966', '15581448155');
/*18*/ test('388419,439549-745538,669102/262281,742072-609988,970128/533573,137288-596245,670546', '14386837842');
/*19*/ test('663239,518782-856702,589433/758115,84450-903932,642088/337647,24284-583025,565986', '6965439376');
/*20*/ test('191239,779501-419016,973110/461699,265809-619813,400896/295357,343268-995965,426583', '9112009335');
/*21*/ test('481413,405591-580708,502557/548827,255673-775012,641036/426629,627433-838039,929163', '6168536238');
/*22*/ test('9920,498487-514382,683023/226772,29017-628472,646705/311712,341208-824675,813994', '86680486267');
/*23*/ test('607788,403841-668184,518365/91263,688091-637506,857258/24319,559457-663076,919412', '92407004992');
/*24*/ test('77084,799236-139505,979891/754122,279472-794364,868062/150527,608666-281632,750541', '0');
/*25*/ test('169296,83569-620267,759983/460604,265256-945013,954017/317013,98311-745837,121044', '85884450562');
/*26*/ test('129661,44653-592189,297222/219053,537474-316753,980074/157470,756816-370610,907480', '14720121165');
/*27*/ test('297941,386287-716792,725006/241452,450763-567051,962750/195744,679475-346109,722435', '74159512604');
/*28*/ test('168144,237088-329400,634496/10381,564404-835828,912626/449243,161014-923398,676107', '54486189445');
/*29*/ test('107162,121311-807174,529239/344730,331975-894427,731597/581880,770044-619288,914307', '91224212925');
/*30*/ test('412012,102200-935128,257111/111516,225570-444846,539065/784025,129787-872324,570078', '12278479070');
/*31*/ test('800011,636792-837944,845950/7799,3048-945539,551037/197775,295503-609840,482184', '76925305012');
/*32*/ test('127131,26333-180762,397870/27576,261600-816030,833590/301519,411147-645517,557943', '57806507475');
/*33*/ test('32758,293294-988342,514135/468,543068-318854,548069/27211,318362-114542,567550', '16448211254');
/*34*/ test('100410,724118-597622,745585/183566,413277-751642,938721/672678,271783-953373,854704', '43746337696');
/*35*/ test('617281,172835-638934,558464/725936,550832-893293,968391/243005,644233-783866,774370', '7539024478');
/*36*/ test('306059,461338-761333,479832/59110,334011-979200,367681/201997,335634-587440,531481', '17556869402');
/*37*/ test('198441,770394-533721,965743/7845,436240-747623,621749/345710,713519-465402,866708', '11528231295');
/*38*/ test('856417,156222-995259,695178/552046,8773-879184,347237/114065,393927-827128,775960', '4349052288');
/*39*/ test('298522,174473-586813,447826/513017,410991-576739,639088/180342,283427-453079,776103', '27756635628');
/*40*/ test('676607,92015-788738,889720/351236,32426-799213,692704/334633,87130-927627,121184', '76070680990');
/*41*/ test('112863,136827-415321,945235/278661,676383-304033,860715/404074,160748-970146,761914', '11439007625');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment