Created
March 6, 2017 10:30
-
-
Save nobsun/29990f4d94ee2ff4c51fa150b2cc1bdb to your computer and use it in GitHub Desktop.
2つの矩形に含まれるマス目の数 ref: http://qiita.com/nobsun/items/3b436fa0349e8bd5de29
This file contains hidden or 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
| module F02 where | |
| import Control.Arrow | |
| import Data.Ix | |
| import Data.List | |
| type Range = ((Int,Int),(Int,Int)) | |
| readRange :: String -> Range | |
| readRange s = case break (','==) s of | |
| (xs,_:ys) -> case break ('-'==) ys of | |
| (xs',_:ys') -> case break (','==) ys' of | |
| (xs'',_:ys'') -> ((read xs, read xs'),(read xs'',read ys'')) | |
| readRanges :: String -> [Range] | |
| readRanges s = case break ('/'==) s of | |
| (_,"") -> [readRange s] | |
| (xs,_:ys) -> readRange xs : readRanges ys | |
| grid :: [Range] -> [Range] | |
| grid = ranges | |
| . (norm *** norm) | |
| . unzip | |
| . map borders | |
| borders :: Range -> ([Int],[Int]) | |
| borders ((l,u),(r,d)) = ([l,r+1],[u,d+1]) | |
| norm :: [[Int]] -> [Int] | |
| norm = map head . group . sort . concat | |
| ranges :: ([Int],[Int]) -> [Range] | |
| ranges = uncurry (><) . (intervals *** intervals) | |
| intervals :: [Int] -> [(Int,Int)] | |
| intervals [x] = [] | |
| intervals (x:xs@(x':_)) = (x,x'-1) : intervals xs | |
| (><) :: [(Int,Int)] -> [(Int,Int)] -> [Range] | |
| xs >< ys = [ ((l,u),(r,d)) | (l,r) <- xs, (u,d) <- ys ] | |
| inCount :: [Range] -> Range -> Int | |
| inCount rs (lu,_) = length (filter (`inRange` lu) rs) | |
| cellCount :: Range -> Int | |
| cellCount ((l,u),(r,d)) = (r - l + 1) * (d - u + 1) | |
| cells :: [Range] -> Int | |
| cells rs = sum $ map cellCount $ filter ((2==) . inCount rs) $ grid rs | |
| f02 :: String -> String | |
| f02 = show . cells . readRanges | |
| type Problem = String | |
| type Answer = String | |
| type Test = (Problem, Answer) | |
| {- | | |
| >>> test ( "5,1-7,9/3,2-8,6/0,5-9,5", "15" ) | |
| True | |
| >>> test ( "0,0-9,9/0,0-9,9/0,0-9,9", "0" ) | |
| True | |
| >>> test ( "0,0-9,9/0,0-0,9/1,0-9,9", "100" ) | |
| True | |
| >>> test ( "2,5-7,6/0,5-7,7/2,0-8,6", "0" ) | |
| True | |
| >>> test ( "1,9-4,9/4,9-7,9/0,3-7,4", "1" ) | |
| True | |
| >>> test ( "6,1-6,9/5,0-7,4/5,1-7,2", "6" ) | |
| True | |
| >>> test ( "4,0-9,8/5,1-6,8/0,2-9,7", "28" ) | |
| True | |
| >>> test ( "2,8-8,9/7,9-8,9/8,3-8,9", "2" ) | |
| True | |
| >>> test ( "3,3-9,4/0,1-8,4/1,2-8,9", "12" ) | |
| True | |
| >>> test ( "2,1-8,3/0,1-3,7/8,3-8,4", "7" ) | |
| True | |
| >>> test ( "5,4-6,9/0,0-6,0/5,3-9,8", "10" ) | |
| True | |
| >>> test ( "1,1-9,7/1,1-3,8/3,8-7,9", "22" ) | |
| True | |
| >>> test ( "2,4-6,7/3,2-7,8/1,0-9,4", "24" ) | |
| True | |
| >>> test ( "0,2-1,5/8,1-8,3/1,8-6,8", "0" ) | |
| True | |
| >>> test ( "5,2-9,5/9,1-9,2/8,0-8,6", "5" ) | |
| True | |
| >>> test ( "5,0-6,4/2,1-6,4/3,8-3,9", "8" ) | |
| True | |
| >>> test ( "0,4-6,9/4,1-6,9/7,6-9,7", "18" ) | |
| True | |
| >>> test ( "0,0-5,5/0,1-2,8/5,3-9,4", "17" ) | |
| True | |
| >>> test ( "0,2-5,6/5,6-8,7/0,1-2,6", "16" ) | |
| True | |
| >>> test ( "7,2-8,4/1,0-6,8/1,3-7,6", "26" ) | |
| True | |
| >>> test ( "4,3-9,3/0,0-6,5/0,0-4,8", "31" ) | |
| True | |
| >>> test ( "3,4-4,6/2,2-4,8/2,0-8,4", "11" ) | |
| True | |
| >>> test ( "1,2-6,5/0,5-4,7/2,8-2,9", "4" ) | |
| True | |
| >>> test ( "4,1-7,5/2,1-9,9/1,7-2,9", "23" ) | |
| True | |
| >>> test ( "1,6-5,6/0,3-5,7/0,2-2,6", "13" ) | |
| True | |
| >>> test ( "1,3-3,4/1,4-3,4/9,2-9,9", "3" ) | |
| True | |
| >>> test ( "6,3-7,6/2,2-2,3/1,3-9,8", "9" ) | |
| True | |
| >>> test ( "2,2-9,7/1,8-9,8/2,2-8,9", "49" ) | |
| True | |
| >>> test ( "1,2-6,9/7,6-9,9/4,3-9,9", "33" ) | |
| True | |
| >>> test ( "6,0-7,5/0,4-3,8/1,4-5,8", "15" ) | |
| True | |
| >>> test ( "2,0-9,7/0,5-3,8/5,1-7,7", "27" ) | |
| True | |
| >>> test ( "1,2-8,7/3,1-4,3/2,3-5,8", "20" ) | |
| True | |
| >>> test ( "1,0-7,7/0,1-5,4/0,0-2,3", "19" ) | |
| True | |
| >>> test ( "2,0-3,7/1,1-3,7/5,3-5,9", "14" ) | |
| True | |
| >>> test ( "7,2-9,8/1,0-6,8/0,2-9,9", "63" ) | |
| True | |
| >>> test ( "1,1-5,3/0,3-8,7/2,3-8,7", "32" ) | |
| True | |
| >>> test ( "3,4-6,6/1,0-9,1/4,0-9,9", "21" ) | |
| True | |
| >>> test ( "0,0-4,7/0,5-5,9/0,2-4,5", "25" ) | |
| True | |
| >>> test ( "1,1-9,9/2,2-7,4/2,4-7,7", "30" ) | |
| True | |
| >>> test ( "3,2-9,9/2,0-6,6/0,5-8,9", "36" ) | |
| True | |
| >>> test ( "0,1-8,8/0,5-9,8/2,3-2,4", "38" ) | |
| True | |
| >>> test ( "0,0-8,6/4,3-9,9/7,1-9,9", "29" ) | |
| True | |
| >>> test ( "0,0-8,8/2,4-9,8/0,1-9,2", "53" ) | |
| True | |
| >>> test ( "0,0-999999,999999/0,0-999999,999999/0,0-999999,999999", "0" ) | |
| True | |
| >>> test ( "0,0-999999,999999/0,0-0,999999/1,0-999999,999999", "1000000000000" ) | |
| True | |
| >>> test ( "655822,899981-788586,907370/262080,47983-540321,834515/327083,392880-474728,550251", "23235346312" ) | |
| True | |
| >>> test ( "332855,375381-953091,410430/311649,171289-637710,912139/113674,426911-658531,763493", "120432128946" ) | |
| True | |
| >>> test ( "718118,613550-931221,983155/84495,98906-214393,787796/159096,14702-416478,360207", "14449477996" ) | |
| True | |
| >>> test ( "809,351021-589370,525004/161241,390394-302773,958450/78299,230856-310951,941900", "80430542457" ) | |
| True | |
| >>> test ( "140869,614312-559945,677721/424067,131309-645701,709237/22556,149538-902108,566473", "101023697750" ) | |
| True | |
| >>> test ( "655941,129163-859649,985280/446717,159679-977047,839232/172790,559592-492587,741630", "146781576755" ) | |
| True | |
| >>> test ( "17192,474077-715775,513703/177518,159867-395312,530025/331315,181585-695872,274046", "14547945541" ) | |
| True | |
| >>> test ( "898603,252482-932681,923548/158284,561187-881317,881298/291114,46375-975112,431448", "6099016393" ) | |
| True | |
| >>> test ( "460763,311625-742309,415024/708446,250395-980176,802067/190828,650489-798525,855977", "17155773920" ) | |
| True | |
| >>> test ( "76405,197443-189085,423768/218793,635517-608524,914533/68011,184211-238902,819853", "29209657076" ) | |
| True | |
| >>> test ( "602585,166640-862797,212028/844554,91101-971982,642729/130166,132319-619895,387625", "1613805895" ) | |
| True | |
| >>> test ( "570213,345485-759193,657391/214801,517728-943628,936004/412700,32310-853707,623589", "65618672419" ) | |
| True | |
| >>> test ( "251546,411491-781481,812128/271544,210234-536793,313835/174707,164436-353882,432689", "10699927141" ) | |
| True | |
| >>> test ( "768602,340406-876104,451915/531084,97975-614595,607952/297417,452002-545499,950992", "2248189616" ) | |
| True | |
| >>> test ( "824147,181473-928495,890221/673583,148595-734839,191460/532038,851156-892611,920296", "2674653690" ) | |
| True | |
| >>> test ( "507676,577270-927426,825282/385783,352947-643538,691954/243369,815194-385405,859966", "15581448155" ) | |
| True | |
| >>> test ( "388419,439549-745538,669102/262281,742072-609988,970128/533573,137288-596245,670546", "14386837842" ) | |
| True | |
| >>> test ( "663239,518782-856702,589433/758115,84450-903932,642088/337647,24284-583025,565986", "6965439376" ) | |
| True | |
| >>> test ( "191239,779501-419016,973110/461699,265809-619813,400896/295357,343268-995965,426583", "9112009335" ) | |
| True | |
| >>> test ( "481413,405591-580708,502557/548827,255673-775012,641036/426629,627433-838039,929163", "6168536238" ) | |
| True | |
| >>> test ( "9920,498487-514382,683023/226772,29017-628472,646705/311712,341208-824675,813994", "86680486267" ) | |
| True | |
| >>> test ( "607788,403841-668184,518365/91263,688091-637506,857258/24319,559457-663076,919412", "92407004992" ) | |
| True | |
| >>> test ( "77084,799236-139505,979891/754122,279472-794364,868062/150527,608666-281632,750541", "0" ) | |
| True | |
| >>> test ( "169296,83569-620267,759983/460604,265256-945013,954017/317013,98311-745837,121044", "85884450562" ) | |
| True | |
| >>> test ( "129661,44653-592189,297222/219053,537474-316753,980074/157470,756816-370610,907480", "14720121165" ) | |
| True | |
| >>> test ( "297941,386287-716792,725006/241452,450763-567051,962750/195744,679475-346109,722435", "74159512604" ) | |
| True | |
| >>> test ( "168144,237088-329400,634496/10381,564404-835828,912626/449243,161014-923398,676107", "54486189445" ) | |
| True | |
| >>> test ( "107162,121311-807174,529239/344730,331975-894427,731597/581880,770044-619288,914307", "91224212925" ) | |
| True | |
| >>> test ( "412012,102200-935128,257111/111516,225570-444846,539065/784025,129787-872324,570078", "12278479070" ) | |
| True | |
| >>> test ( "800011,636792-837944,845950/7799,3048-945539,551037/197775,295503-609840,482184", "76925305012" ) | |
| True | |
| >>> test ( "127131,26333-180762,397870/27576,261600-816030,833590/301519,411147-645517,557943", "57806507475" ) | |
| True | |
| >>> test ( "32758,293294-988342,514135/468,543068-318854,548069/27211,318362-114542,567550", "16448211254" ) | |
| True | |
| >>> test ( "100410,724118-597622,745585/183566,413277-751642,938721/672678,271783-953373,854704", "43746337696" ) | |
| True | |
| >>> test ( "617281,172835-638934,558464/725936,550832-893293,968391/243005,644233-783866,774370", "7539024478" ) | |
| True | |
| >>> test ( "306059,461338-761333,479832/59110,334011-979200,367681/201997,335634-587440,531481", "17556869402" ) | |
| True | |
| >>> test ( "198441,770394-533721,965743/7845,436240-747623,621749/345710,713519-465402,866708", "11528231295" ) | |
| True | |
| >>> test ( "856417,156222-995259,695178/552046,8773-879184,347237/114065,393927-827128,775960", "4349052288" ) | |
| True | |
| >>> test ( "298522,174473-586813,447826/513017,410991-576739,639088/180342,283427-453079,776103", "27756635628" ) | |
| True | |
| >>> test ( "676607,92015-788738,889720/351236,32426-799213,692704/334633,87130-927627,121184", "76070680990" ) | |
| True | |
| >>> test ( "112863,136827-415321,945235/278661,676383-304033,860715/404074,160748-970146,761914", "11439007625" ) | |
| True | |
| -} | |
| test :: Test -> Bool | |
| test (p,a) = f02 p == a |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment