I cleaned up/refactored my solution. Check it out down below.
There is a section ### making a recursive step wider ### - that code explains my thoughts. I left some logs in that part, so if you run code from iex you will clearly see what I was trying to say and the output looks like this:
iex::8> ParensBracketsBraces.matching?("(a + [ b - c ] )")
ELEMENT <> WHITESPACE
: [elem: "a", input_tail: "+ [ b - c ] )", stack: "("]
ELEMENT <> WHITESPACE
: [elem: "+", input_tail: "[ b - c ] )", stack: "("]
WHITESPACE <> ELEMENT
: [elem: "b", input_tail: " - c ] )", stack: "[("]
WHITESPACE <> ELEMENT
: [elem: "-", input_tail: " c ] )", stack: "[("]
WHITESPACE <> ELEMENT
: [elem: "c", input_tail: " ] )", stack: "[("]
BTW, hope you use iex - very powerful tool...
defmoduleParensBracketsBracesdo@openers["{","[","("]@closers["}","]",")"]@all@openers++@closersdefmatching?(input)whenis_binary(input),do:run_check("",input)defmatching?(input),do:"#{inspect(input)} is not a valid string."defmatching?(),do:"input should be a valid string"### --- BASE CASES --- #### matching pairsdefprun_check(""=_stack,""=_input),do:true# no matchesdefprun_check(_,""=_input),do:false### matches on opener only and putting it to the stack ###defprun_check(stack,<<opener::binary-size(1)>><>input_tail)whenopenerin@openers,do:run_check(opener<>stack,input_tail)### covering case where there are only closers ###defprun_check("",<<closer::binary-size(1)>><>_tail_input)whencloserin@closers,do:false### comparing top item in the stack with closer ###defprun_check("["<>stack_tail,"]"<>input_tail),do:run_check(stack_tail,input_tail)defprun_check("("<>stack_tail,")"<>input_tail),do:run_check(stack_tail,input_tail)defprun_check("{"<>stack_tail,"}"<>input_tail),do:run_check(stack_tail,input_tail)################################## making a recursive step wider ###defprun_check(stack,<<elem::binary-size(1)>><>" "<>input_tail)whenelemnotin@alldoIO.inspect(binding(),label:"\nELEMENT <> WHITESPACE \n\n")run_check(stack,input_tail)enddefprun_check(stack," "<><<elem::binary-size(1)>><>input_tail)whenelemnotin@alldoIO.inspect(binding(),label:"\nWHITESPACE <> ELEMENT \n\n")run_check(stack,input_tail)end################################## if not openers or/and closers ###defprun_check(stack,<<_::binary-size(1)>><>input_tail),do:run_check(stack,input_tail)end
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
I cleaned up/refactored my solution. Check it out down below.
There is a section
### making a recursive step wider ###
- that code explains my thoughts. I left some logs in that part, so if you run code fromiex
you will clearly see what I was trying to say and the output looks like this:BTW, hope you use
iex
- very powerful tool...