2011-03-13 24 views
6

文字列のn番目の要素を削除するにはどうすればよいですか?文字列のn番目の要素をすべて削除します

drop関数を何らかの方法で使用すると思います。

このように最初のnを落とすと、どのようにしてこれを変更できるのですか?

dropthem n xs = drop n xs 

答えて

2
remove_every_nth :: Int -> [a] -> [a] 
remove_every_nth n = foldr step [] . zip [1..] 
    where step (i,x) acc = if (i `mod` n) == 0 then acc else x:acc

は、関数が何をするかです:

zip [1..]はそう例えば、リスト内のすべての項目のインデックスに使用されていますzip [1..] "foo"[(1,'f'), (2,'o'), (3,'o')]になります。

インデックス付きリストは、nで割り切れないインデックスを持つすべての要素を累積するright foldで処理されます。

基本的には同じですが、余分なメモリ割り当てはzip [1..]から省き、モジュラスを計算する必要はありません。

remove_every_nth :: Int -> [a] -> [a] 
remove_every_nth = recur 1 
    where recur _ _ []  = [] 
      recur i n (x:xs) = if i == n 
      then recur 1 n xs 
      else x:recur (i+1) n xs
+0

の代わりに' 'zip'とmod'ある文字列 – Peaker

+0

'remove_every_nth n =マップsnd。フィルタ((/ = 0)。(\ 'mod \' n).fst)。 zip [1 ..] ' – Alvivi

+0

@Peaker:提案をありがとう。 'zip'を使わずに' cycle'をどのように利用するのかよく分かりませんが、効率を少し変えました。 – shang

2

は、これを達成するためにtakedropを組み合わせるようにしてください。ここで

take 3 "hello world" = "hel" 
drop 4 "hello world" = "o world" 
+0

私は私の記事の中で間違いを犯しました。私はこれを今持っていて、それは私のリストからn番目の値を削除します。私はリストからn番目の値をすべて削除したいので、再帰を追加する必要があると思いますか?またはフィルタ? – Lunar

+0

@ Lunar、 "あらゆるn番目の価値"はどういう意味ですか? – luqui

+0

例: 4「thisiscoolは」これは 'cycle'を[使用しない理由は、やや高価である不正解 – Lunar

4
-- groups is a pretty useful function on its own! 
groups :: Int -> [a] -> [[a]] 
groups n = map (take n) . takeWhile (not . null) . iterate (drop n) 

removeEveryNth :: Int -> [a] -> [a] 
removeEveryNth n = concatMap (take (n-1)) . groups n 
7

シンプル。 (n-1)個の要素を取り、1をスキップしてすすぎ、繰り返します。

dropEvery _ [] = [] 
dropEvery n xs = take (n-1) xs ++ dropEvery n (drop n xs) 

又は効率のために示したスタイルで

は、私は以下のソリューション好き

dropEvery n xs = dropEvery' n xs $ [] 
    where dropEvery' n [] = id 
      dropEvery' n xs = (take (n-1) xs ++) . dropEvery n (drop n xs) 
1

del_every_nth :: Int -> [a] -> [a]  
del_every_nth n = concat . map init . group n 

は、あなただけのどのグループの長さの部分でリストを機能groupを定義する必要がn。しかしそれは非常に簡単です:

group :: Int -> [a] -> [[a]] 
group n [] = [] 
group n xs = take n xs : group n (drop n xs) 
+0

hlintが提案します'concatMap'の代わりに' concatMap'を使います。地図 ' –

関連する問題