Haskell or C?

by Mithrandir

I got bored one day and was looking for something to test my coding skills by trying to solve a difficult problem on a difficult contest. Luckily, reddit provided me with this contest which was exactly what I was looking for.

It seemed to me that Haskell was a valid option for solving this. So, I started writing a function to compute the value of the sequence of darts. Simple enough:

valueOfSeq :: Int -> [Int] -> Int
valueOfSeq n seq = fst . head' . (dropWhile f) . (zip [1..]) $ result
  where
    head' [] = (1 + last result, 1)
    head' l = head l
    f (x, y) = x == y
    result = sort . nub $ l1 ++ l2 ++ l3 ++ l4 ++ l5 ++ l6
    l1 = seq
    l2 = nub [ x+y | x <- l1, y <- l1]
    l3 = nub [ x+y | x <- l2, y <- l1]
    l4
      | n > 3 = nub [ x+y | x <- l3, y <- l1]
      | otherwise = []
    l5
      | n > 4 = nub [ x+y | x <- l4, y <- l1]
      | otherwise = []
    l6
      | n > 5 = nub [ x+y | x <- l5, y <- l1]
      | otherwise = []

However, while trying to generate those sequences in an intelligent way I got into some troubles. Mainly caused by my inexperience in Haskell language but unacceptable at the moment. So, I’ve tried the same thing in C:

 int getValueOfSeq(int R, int D, int seq[R])
{
  Q *q = initQ();
  int i;
  elem x, y;
  int value = 1;
  for (i = 0; i < R; i++){
    x.value = seq[i];
    x.count = 1;
    pushQ(q, x);
  }
  while (!isEmptyQ(q)){
    x = popQ(q);
    if (x.value != value)
      break;
    else
      value++;
    y.count = x.count + 1;
    if (y.count <= D){
      for (i = 0; i < R; i++){
        y.value = x.value + seq[i];
        pushQ(q, y);
      }
    }
  }
  cleanQ(q);
  return value;
 }
 

Taking into account some more additions (the auxiliary functions in C and some sequence generation in Haskell) the entire code looks like this:

mihai@keldon:~$ wc -l p.c
115 p.c
mihai@keldon:~$ wc -l Test.hs
38 Test.hs

Need I say more?

About these ads