0

Haskell には、次の主な機能があります。

combinations pre suf letters = prefixed ++ suffixed
  where
    perms = permutation letters
    prefixed = map (\x -> pre ++ x)  $ perms
    suffixed = map (\x -> x ++ suf)  $ perms

main = do
        ls1 <- fmap lines (readFile "dictionary.txt")
        let ls2 = combinations "Apple" "Citrus" "Banana"

ls1 と ls2 を組み合わせて、二重のものを出力するにはどうすればよいですか? 二重のものは、大文字と小文字を区別しない必要があります。したがって、バナナとバナナがある場合は、そのうちの 1 つを出力する必要があります。

編集:

ls1 は、dictionary.txt の行のリストです

ls2 は、組み合わせと呼ばれる他の関数からのさまざまな組み合わせのリストです

ls1 と ls2 を結合/マージ/連結したい。ls3 のようなリストに。このリストには、dictionary.txt からのすべての行と、ls2 からの対立遺伝子の組み合わせ、および組み合わせ関数が含まれます。

次に、ls3 のすべての double 要素を出力として出力する必要があります。

編集2:

Dictionary.txt の構造 (多くの単語を含むランダムなリスト) は次のようになります。

Apple
Strawberry
Clown
.....

組み合わせ機能(私のコードの編集を参照):次のような入力から作成します:

combinations "a" "b" "ded"

出力:

["acd","adc","cdb","dcb"]

背景: アプリケーションはスクラブルのようなゲームです: "pre" と "suf" はボード上の文字です。そして「文字」はプレイヤーの文字です。

値の例:

ls1

["Apple","Strawberry","Clown".....]

ls2

["Clwno","Clonw","Clown"..]

ls3

["Apple","Strawberry","Clown","Clwno","Clonw","Clown"]

ls3 では、"Clown" という単語が 2 回表示されます。私が望む出力として:

["Clown"]

これが、ls3 でのダブルワードの意味です。

4

1 に答える 1

1

質問で概説した方法を維持するには、この2つのリストの「結合」は単に追加するだけなので、を使用してls1 ++ ls2ください。次に、順序が変更されても問題がなければ、リストを並べ替えて、同等の要素が隣り合うようにします。でこれを行うことができますsortBy.2つの文字列の大文字と小文字を正規化したバージョンを比較する関数を提供するだけです. これを行う最も簡単な方法は、次のコンビネータを使用することですData.Function

import Data.List
import Data.Function
import Data.Char

compareCaseInsensitiv :: String -> String -> Ordering
compareCaseInsensitiv = compare `on` map toUpper

「重複」が隣接していると、単純な再帰関数でそれらを抽出できます。compareCaseInsensitivそのために再び使用できますEQ

ただし、アプローチ全体が最適ではないことに注意してください。使用可能な文字の順列のすべてのリストは、辞書リストとはまったく異なる意味を持っているため、結合ステップは自然なことではありません。並べ替え ( O ( n log n ) 操作) は非常にばかげており、辞書はおそらく既に並べ替えられているため、効果がありません。マージソートのような方法で、それぞれが「並行して」個別にソートされた 2 つのリストを再帰する方がはるかに優れています。

于 2013-06-24T11:58:58.660 に答える