2017-03-24 1 views
1

入力は9要素のリストです。

最初の8要素の合計/ 10の剰余(以下のアルゴリズムで、tajの2行目)が最後の(9番目の)要素と等しいかどうかを確認したいと思います。リスト要素の合計がハスケルの最後の要素と等しいかどうかをチェックする方法は?

私のプログラムでは残りがカウントされますが、チェックする方法はわかりません。私はいくつかの方法を試しました。

oddS :: Int-> Int 
oddS x = x*3 

evenS :: Int -> Int 
evenS y = y*7 


taj :: [Int] -> Int 
taj (a:b:c:d:e:f:g:h:w) = (oddS a + evenS b + oddS c + evenS d + oddS e + evenS f + oddS g + evenS h) `mod` 10 

私はそれが最良の解決策ではないことを知っていますが、それは仕事です。

ウィレムの助けを借りた代替ソリューション。

check :: [Int] -> Bool 
    check xs = xn == taj xs 
     where xn = last xs 
+2

'oddS'と' evenS'の目的は何ですか?合計を計算したいのであれば、なぜ3と7で乗算するのか分かりません。 –

+0

@WillemVanOnsem検証アルゴリズムです。それはそのように機能します。 入力リストは、最初の8要素(奇数インデックス要素* 3と偶数インデックス要素* 7)のmod 10が最後の要素と等しい場合に有効です。 – George312

+0

@ Georg321:それはどこに質問に記載されていますか? –

答えて

2

Iは、第8の要素の和/ 10の残りは最後(9)要素に等しいかどうかを確認したいです。

これは検証アルゴリズムです。それはそのように機能します。入力リストは、最初の8要素(奇数インデックス要素* 3と偶数インデックス要素* 7)のmod 10が最後の要素と等しい場合に有効です。 - ランニングサムを蓄積し、それが最後の要素に達したときにそれをチェックするコメントあなたはまた、(長さをチェックするために、またはおそらく2)アキュムレータを使用して、状態を確認するために再帰を使用することができ

。だから、のようなもの:

check9 :: [Int] -> Bool 
check9 = check9' 8 0 
    where check9' n s [xn] = n == 0 && s `mod` 10 == xn 
      check9' n s (x:x2:xs) = check9' (n-2) (s+3*x+7*x2) xs 
      check9' _ _ _ = False

これを解決するために、よりエレガントな方法は、しかしsum :: Num a => [a] -> azipWith :: (a -> b -> c) -> [a] -> [b] -> [c]cycle :: [a] -> [a]splitAt :: [a] -> aなどの組み込みコマンドを使用している:

-- alternative version 

check9 :: [Int] -> Bool 
check9 xs | (xi,[xn]) <- splitAt 8 xs = xn == mod (sum (zipWith (*) xi $ cycle [3,7])) 10 
      | otherwise = False
+0

これは明らかですが、私の問題は、(oddSa + EvenSb + oddsC + EvenSd + oddSe + EvenSf + oddSg + EvenSh) 'mod' 10)が最後のものと等しいかどうかを確認する方法がわからないということです素子。それは私が正直に理解していないものです。私はあなたに上記で説明しようとした。 – George312

+0

@ George312:答えを更新しました。今度は 'evenS' /' oddS'シーケンスで動作します。 –

+0

私はあなたの助けに本当に感謝しますが、何とかそれは有効な入力(0,2,3,1,5,8,3,0,0)に対して偽を与えます。なぜか分からない。 – George312

関連する問題