wvogel日記

自分用の技術備忘録が多めです.

文字

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;
}