Balanced brackets: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎{{header|Perl 6}}: Added PureBasic)
Line 53: Line 53:
Debug Ballanced("[[][]]") ; #true
Debug Ballanced("[[][]]") ; #true
Debug Ballanced("[]][[]") ; #false</lang>
Debug Ballanced("[]][[]") ; #false</lang>

=={{header|Python}}==
<lang python>>>> def balanced(txt):
... braced = 0
... for ch in txt:
... if ch == '[': braced += 1
... if ch == ']':
... braced -= 1
... if braced < 0: return False
... return True
...
>>> for txt in ',[],[][],[[][]],][,][][,[]][[]'.split(','):
... print ("%r is%s balanced" % (txt, '' if balanced(txt) else ' not'))
...
'' is balanced
'[]' is balanced
'[][]' is balanced
'[[][]]' is balanced
'][' is not balanced
'][][' is not balanced
'[]][[]' is not balanced</lang>

Revision as of 13:17, 20 February 2011

Task
Balanced brackets
You are encouraged to solve this task according to the task description, using any language you may know.

Problem: Generate a string with $N opening brackets ("[") and $N closing brackets ("]"), in some arbitrary order. Determine whether the string is balanced; that is, whether it consists entirely of pairs of opening/closing brackets (in that order), none of which mis-nest.

Examples:

   (empty)   OK
   []        OK   ][        NOT OK
   [][]      OK   ][][      NOT OK
   [[][]]    OK   []][[]    NOT OK

Perl 6

<lang perl6>sub balanced($s) {

   my $l = 0;
   for $s.comb {
       when "]" {
           --$l;
           return False if $l < 0;
       }
       when "[" {
           ++$l;
       }
   }
   return $l == 0;

}

my $N = get; my $s = (<[ ]> xx $N).pick(*).join; say "$s {balanced($s) ?? "is" !! "is not"} well-balanced"</lang>

PureBasic

<lang PureBasic>Procedure Ballanced(String$)

 Protected *p.Character, cnt
 *p=@String$
 While *p\c
   If *p\c='['
     cnt+1
   ElseIf *p\c=']'
     cnt-1
   EndIf
   If cnt<0: Break: EndIf
   *p+SizeOf(Character)
 Wend
 If cnt=0
   ProcedureReturn #True
 EndIf

EndProcedure</lang> Testing the procedure <lang PureBasic>Debug Ballanced("")  ; #true Debug Ballanced("[]")  ; #true Debug Ballanced("][")  ; #false Debug Ballanced("[][]")  ; #true Debug Ballanced("][][")  ; #false Debug Ballanced("[[][]]")  ; #true Debug Ballanced("[]][[]")  ; #false</lang>

Python

<lang python>>>> def balanced(txt): ... braced = 0 ... for ch in txt: ... if ch == '[': braced += 1 ... if ch == ']': ... braced -= 1 ... if braced < 0: return False ... return True ... >>> for txt in ',[],[][],[[][]],][,][][,[]][[]'.split(','): ... print ("%r is%s balanced" % (txt, if balanced(txt) else ' not')) ... is balanced '[]' is balanced '[][]' is balanced '[[][]]' is balanced '][' is not balanced '][][' is not balanced '[]][[]' is not balanced</lang>