List rooted trees: Difference between revisions
Content added Content deleted
(Added Wren) |
m (→{{header|Haskell}}: Data.Tree variant – tidying.) |
||
Line 562: | Line 562: | ||
A variant expressed in terms of Data.Tree |
A variant expressed in terms of Data.Tree |
||
<lang haskell>import Data.List ( |
<lang haskell>import Data.List (foldl', nub, sortBy) --' strict variant of foldl |
||
⚫ | |||
import Data.Ord (comparing) |
import Data.Ord (comparing) |
||
⚫ | |||
-------------------- LIST ROOTED TREES ------------------- |
|||
bagPatterns :: Int -> [String] |
bagPatterns :: Int -> [String] |
||
bagPatterns n = |
bagPatterns n = |
||
nub $ |
nub $ |
||
bracketsFromTree |
|||
⚫ | |||
. depthSortedTree |
|||
⚫ | |||
⚫ | |||
⚫ | |||
---------------------------TEST |
--------------------------- TEST ------------------------- |
||
main :: IO () |
main :: IO () |
||
main = putStrLn . unlines $ bagPatterns 5 |
main = putStrLn . unlines $ bagPatterns 5 |
||
----------------------- |
----------------------- DEFINITIONS ---------------------- |
||
depthSortedTree |
depthSortedTree :: |
||
(Enum a, Num a, Ord a) => |
|||
Tree a -> |
|||
Tree a |
|||
depthSortedTree tree |
depthSortedTree tree |
||
| null (subForest tree) = Node 0 [] |
| null (subForest tree) = Node 0 [] |
||
| otherwise = |
| otherwise = |
||
let xs = depthSortedTree <$> subForest tree |
let xs = depthSortedTree <$> subForest tree |
||
in Node |
in Node |
||
(succ $ foldr ((+) . rootLabel) 0 xs) |
(succ $ foldr ((+) . rootLabel) 0 xs) |
||
(sortBy (flip (comparing rootLabel)) xs) |
(sortBy (flip (comparing rootLabel)) xs) |
||
bracketsFromTree :: Tree a -> String |
bracketsFromTree :: Tree a -> String |
||
bracketsFromTree = |
bracketsFromTree = |
||
foldTree |
|||
(\_ xs -> '(' : (concat xs <> ")")) |
|||
parentIndexPermutations :: Int -> [[Int]] |
parentIndexPermutations :: Int -> [[Int]] |
||
parentIndexPermutations = |
parentIndexPermutations = |
||
traverse |
|||
(enumFromTo 0) |
|||
. enumFromTo 0 |
|||
. subtract 2 |
|||
treeFromParentIndices :: [Int] -> Tree Int |
treeFromParentIndices :: [Int] -> Tree Int |
||
Line 606: | Line 617: | ||
nest = subForest tree |
nest = subForest tree |
||
forest |
forest |
||
| root == x = nest |
| root == x = nest <> [Node i []] |
||
| otherwise = (`go` (i, x)) <$> nest</lang> |
| otherwise = (`go` (i, x)) <$> nest</lang> |
||
{{Out}} |
{{Out}} |