例如,如果我們有兩個字串"abc"并且"1234"我想要結果"abc4"(第一個字串屏蔽第二個)。(如果我們將它們垂直繪制,就像一個波浪來自左邊并觸摸字符)
"a" "1" "a"
wave -> "b" "2" result "b"
"c" "3" "c"
"4" "4"
我從 Haskell 的這個解決方案開始
slice from to xs = take (to - from 1) (drop from xs)
merge l1 l2 = if length l2 > length l1
then l1 slice (length l1) (length l2) l2
else l1
您能否提供一些更優雅\緊湊的解決方案。
uj5u.com熱心網友回復:
你只需要一個特殊的合并功能
> let merge [] ys = ys
| merge xs [] = xs
| merge (x:xs) (y:ys) = x : merge xs ys
或使用 drop
> let merge2 x y = x drop (length x) y
uj5u.com熱心網友回復:
你想要一個“ zipLongest”,transpose就像這樣:
maskMerge1 :: [b] -> [b] -> [b]
maskMerge1 as bs = map head $ transpose [as,bs]
-- or:
-- head <$> transpose [as,bs]
這是非常緊湊和優雅的(非常感謝@leftaroundabout的評論!)。
從上面看,
[ "abc" , [ ['a' ,'b' ,'c' ] ,
"1234" ] ['1' ,'2' ,'3' ,'4'] ]
---------- --------------------------
[ "a1","b2","c3","4" ] -- transpose
---------- --------------------------
"abc4" [ 'a' ,'b' ,'c' ,'4' ] -- map head
length另一個答案中的代碼也有效,即使是無限的,x盡管呼叫了 dreaded length,但由于呼叫了它,它會x在記憶體中保留整個length。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387027.html
上一篇:不能將等式約束表示為自定義約束
