2017-05-16 8 views
-8

私は以下の関数を助けてくれましたが、以下の出力が私の関数の入力になり、以下の入力が私の関数の出力になることを意味する逆数が必要ですリストの要素をhaskellの与えられた方法で追加する

conv = concat . f 
where f [] = [] 
     f (x:xs) = map (x+) xs : f xs 

> conv [3,10,5] 
[13,8,15] 

> conv [2,5,15,34] 
[7,17,36,20,39,49] 
+0

2つの異論:1.問題は完全に指定されていません。 3つの数字を3つの数字にマッピングする関係を与えます。 n個の数値をn個の数値にマップする方法を一般化する方法は比較的明確ですが、入出力例では6個の数値を4個の数値にマッピングしています。何?あなたは自分の努力を見せていないので、あなたがした特定の間違いや、あなたが誤解したことにあなたを導くことはできません。 –

+0

これはいくつかの畳み込みのようです。私は論理が何であるかは分かりません。あなたの2番目の例では、与えられた関係でそれを解決する明白な方法はありません。 –

+0

この投稿は保留になっているので、私の答えは受け入れられませんので、ここには[要点](https://gist.github.com/basile-henry/6a2bbfd9800e6d8968e37d39915e29af)があります。 –

答えて

2

は、私はあなたが、私はこのような何かを思いついた

conv = concat . f 
    where f [] = [] 
      f (x:xs) = map (x+) xs : f xs 

> conv [3,10,5] 
[13,8,15] 

> conv [2,5,15,34] 
[7,17,36,20,39,49] 

この関数の逆を探していると思います。あなたが私の画面上にスクロール

conv . solve = solve . conv = id 

かスプリット」をチェックすることができ、それが定義されています

solve x = (reverse . (h :) . map (subtract h) . map head . split') rx 
     where [email protected](a:b:c:_) = reverse x 
       h = (a+b-c) `div` 2 

> solve [7,17,36,20,39,49] 
[2,5,15,34] 

> solve [13,8,15] 
[3,10,5] 

...長さが少ない3つのユニークな解決策は存在しないことができるよりもために、そのケースを扱うことに注意してくださいとして

split' = go 1 
    where go _ [] = [] 
      go n x = take n x : go (n+1) (drop n x) 
+0

ええ、私はその機能の逆を探しています、あなたはそれについて私を助けてくれますか? – Shafici

+0

素敵な答えkarakfa、私は見つけた解決策に取り組んでいました。あなたと似ていますが、簡潔ではありません。しかし、投稿は保留になっており、投稿できません。方法は何もために時間を無駄にする方法StackOverflow –

+0

'split''はどこに定義されていますか? –

関連する問題