Done some puzzles
[cses-programming-tasks.git] / app / cses1620_slow.hs
diff --git a/app/cses1620_slow.hs b/app/cses1620_slow.hs
new file mode 100644 (file)
index 0000000..95305f2
--- /dev/null
@@ -0,0 +1,57 @@
+import Data.List
+-- import Data.Ord
+import Data.Traversable
+import Control.Applicative
+
+type MergedMachine = (Int, Int) -- production time, number of machines
+
+
+main :: IO ()
+main = do
+  line1 <- getLine
+  line2 <- getLine
+  let params = map (read :: String -> Int) $ words line1
+  let required = params !! 1
+  let machines = map read $ words line2
+  let mergedMachines = merge machines
+  -- print required
+  -- print machines
+  print  mergedMachines
+  print $ length mergedMachines
+  print $ solve required mergedMachines
+
+merge :: [Int] -> [MergedMachine]
+merge machines = [(head g, length g) | g <- grouped_machines]
+  where sorted_machines = sort machines
+        grouped_machines = group sorted_machines
+
+
+-- solve :: Int -> [Int] -> Int
+solve required ms = (lcm_chunks * lcm_time) + length requiredRun - 1
+  -- lcm_production
+  where lcm_time = lcms $ fmap fst ms
+        lcm_production = sum $ [(lcm_time `div` p) * n | (p, n) <- ms]
+        lcm_chunks = required `div` lcm_production
+        remaining = required `mod` lcm_production
+        prods = productions ms
+        -- requiredRun = takeWhile (< required) $ totalProductions prods
+        requiredRun = takeUntil (>= remaining) $ totalProductions prods
+        -- sorted_ms = sortOn Down ms
+
+lcms :: [Int] -> Int
+lcms ns = foldl1 lcm ns
+
+productions :: [MergedMachine] -> [[Int]]
+productions machines = fmap manufactured machines
+
+manufactured :: MergedMachine -> [Int]
+manufactured (t, n) = go [0, n..]
+  where go (p:ps) = replicate t p ++ go ps
+
+totalProductions :: [[Int]] -> [Int]
+totalProductions prods = fmap sum $ getZipList $ sequenceA $ fmap ZipList prods
+
+takeUntil _ [] = []
+takeUntil p (x:xs)
+  | p x = [x]
+  | otherwise = x : takeUntil p xs