文字
Dijkstra
とか
suffix array
をみたら、やっぱりHaskellは文字列操作が強力だなあと思う。
リストが標準であるし、sortなどの便利な関数も沢山ある。
すると、
あ、KUPCのA問題、Haskellなら簡単に書けるなあと思って書いてみた。
文字列が一行で与えられる。 その中から重複を許さずに、"KUPC"という文字がいくつ作れるか答えよ
という問題
kupc = [('K' , 0) , ('U' , 1) , ('P' , 2) , ('C' , 3)] check :: [Int] -> String -> [Int] check xs [] = xs check xs (c:cs) = case lookup c kupc of Just n -> check (recompose n xs) cs Nothing -> check xs cs recompose :: Int -> [Int] -> [Int] recompose a xs = take a xs ++ [1 + xs !! a] ++ drop (a+1) xs main = getLine >>= print.minimum.check [0,0,0,0]
ちなみに、C言語では私が書いたのはこんな感じだった
#include<stdio.h> #include<string.h> int main(){ int list[4],l,i,min; char str[300]; for(i = 0 ; i < 4 ; i++) list[i] = 0; scanf("%s",str); l = strlen(str); for(i = 0 ; i < l ; i++){ if(str[i]=='K') list[0]++; if(str[i]=='U') list[1]++; if(str[i]=='P') list[2]++; if(str[i]=='C') list[3]++; } min = l/4; for(i = 0 ; i < 4 ; i++){ if(min > list[i]) min = list[i]; } printf("%d\n",min); return 0; }