文字列のn番目の要素を削除するにはどうすればよいですか?文字列のn番目の要素をすべて削除します
drop
関数を何らかの方法で使用すると思います。
このように最初のnを落とすと、どのようにしてこれを変更できるのですか?
dropthem n xs = drop n xs
文字列のn番目の要素を削除するにはどうすればよいですか?文字列のn番目の要素をすべて削除します
drop
関数を何らかの方法で使用すると思います。
このように最初のnを落とすと、どのようにしてこれを変更できるのですか?
dropthem n xs = drop n xs
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
は、これを達成するためにtake
とdrop
を組み合わせるようにしてください。ここで
take 3 "hello world" = "hel"
drop 4 "hello world" = "o world"
-- 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
シンプル。 (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)
:
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)
hlintが提案します'concatMap'の代わりに' concatMap'を使います。地図 ' –
の代わりに' 'zip'とmod'ある文字列 – Peaker
'remove_every_nth n =マップsnd。フィルタ((/ = 0)。(\ 'mod \' n).fst)。 zip [1 ..] ' – Alvivi
@Peaker:提案をありがとう。 'zip'を使わずに' cycle'をどのように利用するのかよく分かりませんが、効率を少し変えました。 – shang