challenge 擬似lsの実装

スラッシュで区切られた文字列の配列(以下パスリスト)がある。
このパスリストにたいして擬似的なlsを行いたい。
lsはパスリストと表示対象ディレクトリのパスを入力する。

例としては以下のようになる。
pathList = ["aaa/bbb","aaa/ccc","aaa/ddd/eee","bbb/ddd/eee"]

ls(pathList,"aaa/")
>["bbb","ccc","ddd/"]

ls(pathList,"aaa/ddd/")
>["eee"]

なおパスリストが大きくなったとき、速度がなるべく低下しないように実装するのが望ましい。
文字列は任意の文字コードであると仮定してかまわない。

Posted feedbacks - Haskell

毎回 pathList が変更されるのならこんな感じかなぁ.
pathList が固定なら最初に疑似的にディレクトリツリーを作成するんだけど...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import Data.Maybe

ls :: [String] -> String -> [String]
ls fs p =  map g $ mapMaybe (f p) fs
 where f []     qs   = Just qs
       f (p:ps) (q:qs) 
         | p == q    = f ps qs
         | otherwise = Nothing
       g p = case break ('/'==) p of
               (p',"" ) -> p'
               (p',_:_) -> p'++['/']

こんな感じでどうでしょう。

1
2
3
4
5
6
import Data.List
import Data.Maybe
ls ps p = map k $ mapMaybe (stripPrefix p) ps
k [] = []
k ('/':_) = "/"
k (x:xs) = x:k xs

Index

Feed

Other

Link

Pathtraq

loading...