wvogel日記

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

C,Haskell

しばらくHaskellでしか書かないと宣言して暫くがたった気がするけど。
C言語を触ってしまった.....
いやでも!そのあとHaskellで書き直したから、とか言い訳してみる。


ネットで昨夜見つけた問題です
m人がn個の問題を解き、そのうちの最多正当数を答えなさい、という
2 3
1 1 0
0 1 0
1 1 1
とあったら、3と出力するような。


まずはC

#include<stdio.h>

int main(){
    int m,n,i,j;
    int prev,now,temp;

    prev = now = 0;

    scanf("%d %d",&m,&n);

    for(i = 0; i < m ; i++){
        for(j = 0; j < n ; j++){
            scanf("%d",&temp);
            now += temp;
        }
        if(now >= prev)    prev = now;
        now = 0;
    }
    printf("%d",prev);

    return 0;
}

関数型言語ユーザとは思えない....
単純だったし、関数に分けるのが面倒だったのでmainにまとめてみた

続いてHaskell

main = do mn <- getLine
          cs <- getContents
          print $ foldr max 0 $g (f $ words mn) $ map read $words cs

g :: (Int,Int)->[Int]->[Int]
g (0,_)  _ = []
g (m,n) xs =sum (take n xs):g (m-1,n) (drop n xs)

f :: [String]->(Int,Int)
f (a:b:xs) = (read a,read b)

fなんかは、もっと汎用性を持たせた形にしても良かったのだけど。
まあいっかという。
g関数もあんまり綺麗な実装じゃない。
でもHaskellのいいところは、頭に思いついた処理をそのままコードに落とし込めるところですね。
これで、C言語版とまったく同様の答えを導ける、当たり前だけど。
もっと工夫して見やすくしたいな、と思いつつそんな時間も今はない。


これらは、朝、部活が始まる前に解いたもの。


それから部活。
今日一日で7、8枚番組を書き、あとは”猫の忠信”の4文字を書くだけ!!


それから無人の研究室に行き、20時過ぎ帰宅。
まったくどうなることやらといった感じ