Last active
February 25, 2017 02:14
-
-
Save mizuhara/bcd7da86b35d6cecbce83c852b7b2ed0 to your computer and use it in GitHub Desktop.
An answer of http://nabetani.sakura.ne.jp/hena/ordf02in2rec/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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