LoginSignup
1
1

More than 5 years have passed since last update.

「第14回オフラインリアルタイムどう書く」 を Haskell で

Posted at

問題は http://nabetani.sakura.ne.jp/hena/ord14linedung/

off_line14.hs
import Data.List


type Weapon  = Char
type Monster = Char

dataBase :: [(Weapon, (Monster, Weapon))]
dataBase = [('a', ('B', 'c')),
            ('c', ('D', 'e')),
            ('e', ('F', 'g')),
            ('g', ('H', 'i')),
            ('i', ('J', 'k')),
            ('k', ('L', 'a'))]

takeData :: String -> ([Weapon], [(Monster, Int)])
takeData cs = (nub ws, [(head m, length m) | m <- group ms])
  where (ms, ws) = span (< 'a') $ sort cs

attakMonster :: [Weapon] -> [(Monster, Int)] -> Int -> Int
attakMonster [] _ c = c
attakMonster _ [] c = c
attakMonster (w : ws) ms c
  | null mb   = attakMonster ws ms c
  | otherwise = attakMonster (w1 : ws) (ma ++ (tail mb)) (c + (snd . head) mb)
  where
    Just (m1, w1) = lookup w dataBase
    (ma, mb) = break ((== m1).fst) ms

solve :: String -> String
solve cs = show $ attakMonster ws ms 0
  where (ws, ms) = takeData cs



----------------------------------------------------------------
-- test
----------------------------------------------------------------

test :: [(Int, Bool)]
test = zip [0 ..] $ map (\ (a, b) -> solve a == b) testData

testData :: [(String, String)]
testData = [
  ( "gLDLBgBgHDaD", "6" ),
  ( "DBcDLaLgDBH", "6" ),
  ( "JJca", "0" ),
  ( "FJDLBH", "0" ),
  ( "HJBLFDg", "6" ),
  ( "HBaDLFJ", "6" ),
  ( "DJaHLB", "2" ),
  ( "gDLHJF", "3" ),
  ( "cJFgLHD", "5" ),
  ( "FFBJaJJ", "1" ),
  ( "FJeJFBJ", "2" ),
  ( "iJFFJJB", "3" ),
  ( "JBJiLFJF", "5" ),
  ( "JDiFLFBJJ", "8" ),
  ( "BDFDFFDFFLLFFJFDBFDFFFFDDFaDBFFB", "28" ),
  ( "DDFBFcBDFFFFFFLBFDFFBFLFDFDJDFDF", "24" ),
  ( "FDLBFDDBFFFeFFFFFDFBLDDFDDFBFFJF", "16" ),
  ( "FDBFFLFDFFDBBDFFBJDLFgDFFFDFFDFF", "0" ),
  ( "FDiFLDFFFFBDDJDDBFBFDFFFBFFDFLFF", "31" ),
  ( "FDFDJBLBLBFFDDFFFDFFFFFDDFBkFDFF", "30" ),
  ( "HBkFFFFHBLH", "3" ),
  ( "FBHHFFFHLaB", "2" ),
  ( "LFHFBBcHFHF", "0" ),
  ( "LFBHFFeFHBH", "7" ),
  ( "LgFHHHBFBFF", "3" ),
  ( "FFiFHBHLBFH", "0" ),
  ( "BFHHFFHBeFLk", "10" ),
  ( "FHFaBBHFHLFg", "5" ),
  ( "FFgacaFg", "0" ),
  ( "JHDaDcBJiiHccBHDBDH", "9" ),
  ( "FHJJLckFckFJHDFF", "12" ),
  ( "DeDHJHDFHJBLHDLLDHJLBDD", "22" ),
  ( "gJLLLJgJgJLJL", "0" ),
  ( "DaaaDDD", "0" ),
  ( "HFeJFHiBiiBJeJBBFFB", "9" ),
  ( "FJFFJDBHBHaLJBHJHDLHkLLLFFFgJgHJLHkJkB", "32" ),
  ( "giFLBiBJLLJgHBFJigJJJBLHFLDLL", "23" ),
  ( "cgkLJcLJJJJgJc", "2" ),
  ( "LDFHJHcFBDBLJBLFLcFJcDFBL", "22" ),
  ( "JJHHHkHJkHLJk", "1" ),
  ( "kHHBBaBgHagHgaHBBB", "11" ),
  ( "HDBFFDHHHDFLDcHHLFDcJD", "20" ),
  ( "HFFFHeFFee", "7" ),
  ( "gLLDHgDLgFL", "1" ),
  ( "JJJBBaBBHBBHaLBHJ", "7" ),
  ( "FBFBgJBDBDgF", "0" ),
  ( "LLLLakakLakLL", "7" ),
  ( "HeJHeJe", "0" ),
  ( "LDFLBLLeBLDBBFFBLFBB", "4" )]
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1