ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# TatriX's solution

## to Bracket Push in the PureScript Track

Published at Jul 13 2018 · 0 comments
Instructions
Test suite
Solution

Given a string containing brackets [], braces {} and parentheses (), verify that all the pairs are matched and nested correctly.

Ginna Baker

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### Main.purs

module Test.Main where

import Prelude

import Effect (Effect)
import Test.Unit.Assert as Assert
import Test.Unit (TestSuite, suite, test)
import Test.Unit.Main (runTest)
import BracketPush (isPaired)

main :: Effect Unit
main = runTest suites

suites :: TestSuite
suites = do
suite "BracketPush.isPaired" do

test "paired square brackets" $Assert.equal true (isPaired "[]") test "empty string"$
Assert.equal true
(isPaired "")

test "unpaired brackets" $Assert.equal false (isPaired "[[") test "wrong ordered brackets"$
Assert.equal false
(isPaired "}{")

test "paired with whitespace" $Assert.equal true (isPaired "{ }") test "simple nested brackets"$
Assert.equal true
(isPaired "{[]}")

test "several paired brackets" $Assert.equal true (isPaired "{}[]") test "paired and nested brackets"$
Assert.equal true
(isPaired "([{}({}[])])")

test "unopened closing brackets" $Assert.equal false (isPaired "{[)][]}") test "unpaired and nested brackets"$
Assert.equal false
(isPaired "([{])")

test "paired and wrong nested brackets" $Assert.equal false (isPaired "[({]})") test "math expression"$
Assert.equal true
(isPaired "(((185 + 223.85) * 15) - 543)/2")

test "complex latex expression" $Assert.equal true (isPaired "\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)") module BracketPush where import Prelude import Control.Monad.Writer (Writer, runWriter, tell) import Data.Array (elem) import Data.List (List(..), fromFoldable, null, (:)) import Data.Maybe (fromJust) import Data.String (toCharArray) import Data.Tuple (Tuple(..), fst, lookup, snd) import Partial.Unsafe (unsafePartial) type BracketPair = Tuple Char Char type Brackets = Array BracketPair brackets :: Brackets brackets = [ Tuple '{' '}' , Tuple '[' ']' , Tuple '(' ')' ] isPaired :: String -> Boolean isPaired s = fst$ runWriter $isPaired' brackets s isPaired' :: Brackets -> String -> Writer (Array String) Boolean isPaired' bs s = go Nil$ fromFoldable $toCharArray s where go st Nil = pure$ null st
go st (x : xs)
| x elem closing = do
tell ["poping " <> show x]
case st of
(top : st') -> if x == top then go st' xs else pure false
_ -> pure false
| x elem opening = do
tell ["pushing " <> show x]
go (pair x : st) xs
| otherwise = do
tell ["skipping non-bracket" <> show x]
go st xs

opening :: Array Char
opening = fst <$> bs closing :: Array Char closing = snd <$> bs

pair :: Char -> Char
pair c = unsafePartial $fromJust$  c lookup bs