とりあえず入力に近づくように刈れるだけ刈ってみる
縦横m*n回できるかぎり入力のように刈ってみて入力と比較して結局一緒になっているかどうかで可能かどうか判定
特に困るところはなくsmallもlargeも解けた
と言いたいところなんですけど、どっか間違えていてなぜかincorrect判定
で直せない、直す気力がなかったです
アルゴリズム的には絶対合っている自信があったので次の日再度プログラム組んでみたらやっぱり正解でした
と言うことで公式記録としては点数として残りませんでした
やっぱり本番だろうと動揺せずに冷静に取り組めるようになるためにも練習とか大事だなと思いましたね
って言うかこの時点では本当に入力データのパースに参っていて何やってるかさっぱり訳わかんない状態だったからね
自分で考えてHaskellのプログラムしたのは去年のcode jam以来だと思うので
って言うか去年も数問解けたのあるのですけど本当、自分でやっておいてまったく信じられないからね
よくHaskellで問題が解けたな去年の俺って感じですから
あと次の日落ち着いて練習のつもりで気楽にやってみたら入力文字のパースも簡単な方法がわかってなんか拍子抜けな感じ
takeとdropと再帰とwordsでこんなにも簡単にパースできるなんて昨日の苦労はなんだったんだろうかと感じております
org n = take n $ repeat 100
f rows cols ans = let size = rows * cols
inrow n i = and [i >= n * cols, i < ((n + 1) * cols)]
incol n i = (i `mod` cols) == n
setrowval nth n = map (\i -> if inrow nth i then n else 0) [0..(size - 1)]
setcolval nth n = map (\i -> if incol nth i then n else 0) [0..(size - 1)]
mergeifnotzero = zipWith (\a b -> if b /= 0 then (min a b) else a)
rowvals nth = zipWith (\a b -> if inrow nth a then b else 0) [0..]
colvals nth = zipWith (\a b -> if incol nth a then b else 0) [0..]
computerow ans input nth = mergeifnotzero input $ setrowval nth ((maximum . rowvals nth) ans)
computerows ans input = foldl (computerow ans) input [0..rows-1]
computecol ans input nth = mergeifnotzero input $ setcolval nth ((maximum . colvals nth) ans)
computecols ans input = foldl (computecol ans) input [0..cols-1]
compute ans = (computerows ans . computecols ans . org) (rows * cols)
in
compute ans
rInt s = read s :: Int
resformat n b
| b = "Case #" ++ show n ++ ": YES"
| otherwise = "Case #" ++ show n ++ ": NO"
parseItem _ [] = []
parseItem n lines = let rows = (rInt . head . words . head) lines
cols = (rInt . last . words . head) lines
ls = (take rows . drop 1) lines
ans = (map rInt . words . unlines) ls
res = f rows cols ans
in
((resformat (n + 1) . and) $ zipWith (==) ans res) : (parseItem (n + 1) . drop (rows + 1)) lines
parse lines = let t = (rInt . head) lines
in
(parseItem 0 . tail) lines
main = do cs <- getContents
(putStr . unlines . parse . lines) cs