torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

AtCoder Beginner Contest 179, B : Go to Jail

問題概要

 2 つのサイコロを同時に振る試行を $N$ 回繰り返した記録が与えられる.ゾロ目が 3 回以上連続したか否かを判定せよ(正確な記述は原文参照><;)

制約

  • $3 \leq N \leq 100$

解法

 何らかの方法で判定をすればよくて,愚直には各 $i$ について $i, i + 1, i + 2$ について条件式を書いて判定するなどしてしまえば解けます.
 泥臭いのを減らすためにちょっと考えると,$A_{i1} \neq A_{i2}$ な $i$ が 3 つ以上連続すればよいということで,まず bool の列に変換してしまってもよいことが分かります.その上で,連続する等価な値をひとまとめにしてあげて,3 つ以上の True がまとめられた箇所があるかどうかを調べてあげることでも問題を解けます.……などと書くと面倒そうですが,例えば Haskell の場合,group という関数があるので言語によっては楽に実装できます.……と思ったけど以下のコードだと楽そうに見えない…….

コード

main = readInt >>= flip replicateM readInts >>= putStrLn . which "Yes" "No" . ( 3 <= ) . foldl max 0 . map length . filter head . group . map ( uncurry (==) . mp )