結果

問題 No.154 市バス
コンテスト
ユーザー AyachiGin
提出日時 2016-06-11 16:13:31
言語 Haskell
(9.14.1)
コンパイル:
ghc -rtsopts -with-rtsopts=-K1G -o a.out -O2 _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 1,158 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 6,495 ms
コンパイル使用メモリ 194,688 KB
実行使用メモリ 17,792 KB
最終ジャッジ日時 2026-04-30 17:19:44
合計ジャッジ時間 9,099 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 1
other AC * 2 WA * 5 TLE * 1
権限があれば一括ダウンロードができます
コンパイルメッセージ
Loaded package environment from /home/judge/.ghc/x86_64-linux-9.14.1/environments/default
[1 of 2] Compiling Main             ( Main.hs, Main.o )
Main.hs:40:18: warning: [GHC-63394] [-Wx-partial]
    In the use of ‘head’
    (imported from Prelude, but defined in GHC.Internal.List):
    "This is a partial function, it throws an error on empty lists. Use pattern matching, 'Data.List.uncons' or 'Data.Maybe.listToMaybe' instead. Consider refactoring to use "Data.List.NonEmpty"."
   |
40 |                  head xs == 'G' && length xs >= 2 && all (=='W') xs
   |                  ^^^^

[2 of 2] Linking a.out

ソースコード

diff #
raw source code

module Main where

main :: IO ()
main = do
  i <- readLn
  s <- getContents
  mapM_ (putStrLn . isPossible) . take i . lines $ s

-- | tests
-- >>> isPossible "WWWWWWWWWGR"
-- "possible"
-- >>> isPossible "WWWWGWGRR"
-- "possible"
-- >>> isPossible "WWWWWWWWWWWWWWGRRG"
-- "impossible"
-- >>> isPossible "WGRWGR"
-- "possible"
-- >>> isPossible "WWWWWWWWWWWWWWWWWGGWGWGGWGWGGGWGG"
-- "impossible"
-- >>> WGWR
-- "impossible"
-- >>> WGRW
-- "impossible"
isPossible :: String -> String
isPossible s = if take1RGW s then
                 "possible"
               else
                 "impossible"
  where
    take1RGW = takeR . reverse
    takeR :: String -> Bool
    takeR ('R':'G':ls) = length ls > 0 && all (=='W') ls || takeG ('G':ls)
    takeR ('R':xs) = takeG xs
    takeR _ = False
    takeG xs = if elem 'R' xs then
                 case break (=='G') xs of
                  (_, "") -> False
                  (ys, (_:zs)) -> takeW (ys ++ zs)
               else
                 head xs == 'G' && length xs >= 2 && all (=='W') xs
    takeW xs
      | elem 'W' xs = let (as, (_:bs)) = break (=='W') xs in takeR $ as ++ bs
      | otherwise   = False
0