Balanced brackets: Difference between revisions

m
syntax highlighting fixup automation
m (syntax highlighting fixup automation)
Line 19:
=={{header|11l}}==
{{trans|Python}}
<langsyntaxhighlight lang=11l>F gen(n)
V txt = [‘[’, ‘]’] * n
random:shuffle(&txt)
Line 37:
L(n) 0..9
V s = gen(n)
print(s‘’(‘ ’ * (20 - s.len))‘is ’(I is_balanced(s) {‘balanced’} E ‘not balanced’))</langsyntaxhighlight>
{{out}}
<pre>
Line 53:
 
=={{header|360 Assembly}}==
<langsyntaxhighlight lang=360asm>* Balanced brackets 28/04/2016
BALANCE CSECT
USING BALANCE,R13 base register and savearea pointer
Line 153:
XDEC DS CL12
REGS
END BALANCE</langsyntaxhighlight>
{{out}}
<pre>
Line 179:
 
=={{header|ABAP}}==
<langsyntaxhighlight lang=ABAP>
CLASS lcl_balanced_brackets DEFINITION.
PUBLIC SECTION.
Line 276:
cl_demo_output=>display( ).
 
</syntaxhighlight>
</lang>
 
{{out}}
Line 303:
 
=={{header|Action!}}==
<langsyntaxhighlight lang=Action!>PROC Generate(BYTE size CHAR ARRAY s)
BYTE i,half
 
Line 374:
PrintE("balanced")
OD
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Balanced_brackets.png Screenshot from Atari 8-bit computer]
Line 395:
Using #HASH-OFF
</pre>
<langsyntaxhighlight lang=Acurity Architect>
FUNCTION bBRACKETS_MATCH(zStringWithBrackets: STRING): STRING
VAR sCount: SHORT
Line 415:
RETURN zOK
ENDFUNCTION
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 426:
=={{header|Ada}}==
brackets.adb:
<langsyntaxhighlight lang=Ada>with Ada.Numerics.Discrete_Random;
with Ada.Text_IO;
with Ada.Strings.Fixed;
Line 482:
end loop;
end loop;
end Brackets;</langsyntaxhighlight>
 
Output:
Line 503:
 
=={{header|Aime}}==
<langsyntaxhighlight lang=aime>unbalanced(data s)
{
integer b, i;
Line 537:
 
0;
}</langsyntaxhighlight>
Sample output:
<pre> is balanced
Line 552:
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.win32}}
<langsyntaxhighlight lang=algol68># generates a string of random opening and closing brackets. The number of #
# each type of brackets is speccified in length #
PROC get brackets = ( INT length ) STRING:
Line 614:
test check brackets( get brackets( length ) )
OD
OD</langsyntaxhighlight>
{{out}}
<pre>
Line 649:
<br clear=both>
==={{header|Java}}===
<syntaxhighlight lang=text>
grammar balancedBrackets ;
 
Line 669:
NEWLINE : '\r'? '\n'
;
</syntaxhighlight>
</lang>
Produces:
<pre>
Line 694:
and a function to check whether a given string of brackets is balanced.
 
<langsyntaxhighlight lang=APL>gen ← (⊂+?+)⍨ ⌷ ('[]'/⍨⊢)
bal ← (((|≡⊢)+\) ∧ 0=+/)(+⌿1 ¯1×[1]'[]'∘.=⊢)</langsyntaxhighlight>
 
Sample run for 0..N..10:
 
<langsyntaxhighlight lang=APL> ↑{br←gen ⍵ ⋄ br,': ',(1+bal br)⊃'Bad' 'Good'}¨0,⍳10
: Good
[]: Good
Line 710:
[[][[]]][[[[]]]]: Good
[[[]][[[[][]][]]]]: Good
]][][][][[][][]][[[]: Bad</langsyntaxhighlight>
 
=={{header|AppleScript}}==
Line 717:
(ES6 functionally composed version)
 
<langsyntaxhighlight lang=AppleScript>-- CHECK NESTING OF SQUARE BRACKET SEQUENCES ---------------------------------
 
-- Zero-based index of the first problem (-1 if none found):
Line 899:
end script
end if
end mReturn</langsyntaxhighlight>
'''Sample output:'''
<pre>'][' problem
Line 914:
 
=={{header|ARM Assembly}}==
<langsyntaxhighlight lang=ARM_Assembly>
.data
 
Line 974:
mov pc, lr
 
</syntaxhighlight>
</lang>
 
=={{header|Arturo}}==
<langsyntaxhighlight lang=rebol>isBalanced: function [s][
cnt: 0
Line 1,000:
if? isBalanced str -> print " OK"
else -> print " Not OK"
]</langsyntaxhighlight>
 
{{out}}
Line 1,016:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight lang=AutoHotkey>; Generate 10 strings with equal left and right brackets
Loop, 5
{
Line 1,047:
}
Return "OK"
}</langsyntaxhighlight>
Output:
<pre>
Line 1,063:
 
A second example repeatedly replacing []:
<langsyntaxhighlight lang=AutoHotkey>Loop, 5
{
B = %A_Index%
Line 1,085:
StringReplace, Str, Str,[],,All
Return Str ? "False" : "True"
}</langsyntaxhighlight>
Sample output:
<pre>
Line 1,101:
 
=={{header|AutoIt}}==
<langsyntaxhighlight lang=AutoIt>
#include <Array.au3>
Local $Array[1]
Line 1,130:
Return 1
EndFunc
</syntaxhighlight>
</lang>
 
=={{header|AWK}}==
<langsyntaxhighlight lang=AWK>#!/usr/bin/awk -f
BEGIN {
print isbb("[]")
Line 1,155:
return (s==0)
}
</syntaxhighlight>
</lang>
Output:
<pre>1
Line 1,165:
 
=={{header|BaCon}}==
<langsyntaxhighlight lang=bacon>FOR len = 0 TO 18 STEP 2
 
str$ = ""
Line 1,187:
PRINT "BAD: ", str$
ENDIF
NEXT</langsyntaxhighlight>
{{out}}
<pre>OK:
Line 1,203:
{{works with|QBasic}}
 
<langsyntaxhighlight lang=qbasic>DECLARE FUNCTION checkBrackets% (brackets AS STRING)
DECLARE FUNCTION generator$ (length AS INTEGER)
 
Line 1,259:
NEXT
generator$ = xx$
END FUNCTION</langsyntaxhighlight>
 
Sample output:
Line 1,277:
==={{header|Commodore BASIC}}===
Based on ZX Spectrum BASIC implementation
<langsyntaxhighlight lang=basic>10 PRINT CHR$(147): REM CLEAR SCREEN
20 FOR N=1 TO 7
30 READ S$
Line 1,297:
1090 PRINT "NOT OK"
1100 RETURN
2000 DATA , [], ][, [][], ][][, [[][]], []][[]</langsyntaxhighlight>
 
 
=={{header|BASIC256}}==
{{trans|Yabasic}}
<langsyntaxhighlight lang=BASIC256>s$ = "[[]][]"
print s$; " = ";
 
Line 1,322:
next i
return level = 0
end function</langsyntaxhighlight>
 
 
=={{header|Batch File}}==
Uses the rewrite rule <code>"[]" -> null</code> to check if brackets are balanced.
<langsyntaxhighlight lang=dos>:: Balanced Brackets Task from Rosetta Code
:: Batch File Implementation
Line 1,379:
set "old=%new%"
set "new=%old:[]=%"
goto check_loop</langsyntaxhighlight>
{{out}}
<pre>[][][[[[]]][]]]][[][ is NOT Balanced.
Line 1,404:
 
=={{header|BBC BASIC}}==
<langsyntaxhighlight lang=bbcbasic>FOR x%=1 TO 10
test$=FNgenerate(RND(10))
PRINT "Bracket string ";test$;" is ";FNvalid(test$)
Line 1,432:
IF count%<0 THEN ="not OK."
NEXT x%
="OK."</langsyntaxhighlight>
<pre>Bracket string [[[][]]] is OK.
Bracket string [[[]][[[][[][]]]]] is OK.
Line 1,447:
{{works with|befungee}}
This code implements the second part of the task: it reads from standard input an arbitrary string of opening and closing brackets, and checks whether it's balanced or not.
<langsyntaxhighlight lang=Befunge>v > "KO TON" ,,,,,, v
> ~ : 25*- #v_ $ | > 25*, @
> "KO" ,, ^
Line 1,453:
> \ : 1991+*+- #v_v
\ $
^ < <$<</langsyntaxhighlight>
 
=={{header|BQN}}==
Line 1,462:
This allows for a particular simple implementation:
 
<langsyntaxhighlight lang=bqn>Gen ← (•rand.Deal⊏⥊⟜"[]") 2⊸×
Bal ← {
Mul ← {a‿b𝕊x‿y: ⟨a+0⌈x-b, y+0⌈b-x⟩}
0‿0 ≡ 0‿0("]["⊸=⊸Mul)´𝕩
}</langsyntaxhighlight>
 
{{out}}
Line 1,480:
=={{header|Bracmat}}==
Bracmat has no 'random' function, so the shuffle is a bit improvised. A variable <code>someNumber</code> is initialised with a big number is repeatedly divided by the number of '['s in the test string until zero. The remainders are used as index to partition and swap the first half of the test string. Then the second half and first half are also swapped. The test whether the test string is balanced is simple, but not very efficient.
<langsyntaxhighlight lang=bracmat>( (bal=|"[" !bal "]" !bal)
& ( generate
= a j m n z N S someNumber
Line 1,506:
& !L+1:<11:?L
)
);</langsyntaxhighlight>
Output:
<pre>:Balanced
Line 1,521:
 
=={{header|Brat}}==
<langsyntaxhighlight lang=brat>string.prototype.balanced? = {
brackets = []
balanced = true
Line 1,551:
{ p "#{test} is balanced" }
{ p "#{test} is not balanced" }
}</langsyntaxhighlight>
 
Output:
Line 1,566:
 
=={{header|C}}==
<langsyntaxhighlight lang=c>#include<stdio.h>
#include<stdlib.h>
#include<string.h>
Line 1,608:
while(n<9) doSeq(n++);
return 0;
}</langsyntaxhighlight>result:<syntaxhighlight lang=text>'': True
'[]': True
']][[': False
Line 1,616:
']]]][[[]][[[': False
']]]]]][][[[[[[': False
'[][]][[][[[]]][]': False</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang=csharp>using System;
using System.Linq;
 
Line 1,660:
}
}
}</langsyntaxhighlight>
Sample output:
<pre>"" is balanced.
Line 1,671:
"[]]][][]][[][[" is not balanced.
"[]]][]]][[][[][[" is not balanced.</pre>
<langsyntaxhighlight lang=csharp>
// simple solution
string input = Console.ReadLine();
Line 1,696:
Console.WriteLine("Not Okay");
 
</syntaxhighlight>
</lang>
 
=={{header|C++}}==
<langsyntaxhighlight lang=cpp>#include <algorithm>
#include <iostream>
#include <string>
Line 1,731:
std::cout << (balanced(s) ? " ok: " : "bad: ") << s << "\n";
}
}</langsyntaxhighlight>
Output:
<pre> ok:
Line 1,745:
 
=={{header|Ceylon}}==
<langsyntaxhighlight lang=Ceylon>import com.vasileff.ceylon.random.api {
platformRandom,
Random
Line 1,771:
ints.filter((i) => i != 0)
.scan(0)(plus<Integer>)
.every((i) => i >= 0);</langsyntaxhighlight>
 
Output:
Line 1,788:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang=Clojure>(defn gen-brackets [n]
(->> (concat (repeat n \[) (repeat n \]))
shuffle
Line 1,801:
(when (= (peek stack) \[)
(recur coll (pop stack))))
(zero? (count stack)))))</langsyntaxhighlight>
 
There are other ways to express the <code>balanced?</code> function.
 
* We can use <code>reduce</code> to consume the sequence:
:<langsyntaxhighlight lang=Clojure>(defn balanced? [s]
(empty?
(reduce
Line 1,816:
(reduced [:UNDERFLOW]))))
'()
s)))</langsyntaxhighlight>
 
* Only <code>[</code>s are put on the stack. We can just count the unmatched ones.
:<langsyntaxhighlight lang=Clojure>(defn balanced? [s]
(let [opens-closes (->> s
(map {\[ 1, \] -1})
(reductions + 0))]
(and (not-any? neg? opens-closes) (zero? (last opens-closes))))) </langsyntaxhighlight>
 
Output:
Line 1,843:
 
=={{header|CLU}}==
<langsyntaxhighlight lang=clu>% This program needs the random number generator from
% "misc.lib" that comes with PCLU.
 
Line 1,893:
end
end
end start_up</langsyntaxhighlight>
{{out}}
<pre>"": balanced
Line 1,909:
=={{header|COBOL}}==
{{works with|OpenCOBOL}}
<langsyntaxhighlight lang=cobol> IDENTIFICATION DIVISION.
PROGRAM-ID. test-balanced-brackets.
 
Line 2,006:
.
 
END PROGRAM check-if-balanced.</langsyntaxhighlight>
 
=={{header|CoffeeScript}}==
<langsyntaxhighlight lang=coffeescript>
isBalanced = (brackets) ->
openCount = 0
Line 2,025:
for brackets in bracketsCombinations 4
console.log brackets, isBalanced brackets
</syntaxhighlight>
</lang>
output
<syntaxhighlight lang=text>
> coffee balanced.coffee
[[[[ false
Line 2,045:
]]][ false
]]]] false
</syntaxhighlight>
</lang>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang=lisp>
(defun string-of-brackets (n)
(let* ((len (* 2 n))
Line 2,076:
(let ((s (string-of-brackets i)))
(format t "~3A: ~A~%" (balancedp s) s))))
</syntaxhighlight>
</lang>
 
Output:
Line 2,096:
=={{header|Component Pascal}}==
BlackBox Component Builder
<langsyntaxhighlight lang=oberon2>
MODULE Brackets;
IMPORT StdLog, Args, Stacks (* See Task Stacks *);
Line 2,157:
 
END Brackets.
</syntaxhighlight>
</lang>
Execute: ^Q Brackets.Do [] [][] [[][]] ][ ][][ []][[]~<br/>
Output:
Line 2,170:
 
=={{header|Crystal}}==
<langsyntaxhighlight lang=ruby>def generate(n : Int)
(['[',']'] * n).shuffle.join # Implicit return
end
Line 2,195:
str = generate(i)
puts "#{str}: #{is_balanced(str)}"
end</langsyntaxhighlight>
 
Output:
Line 2,213:
===Standard Version===
D standard library has a [http://www.digitalmars.com/d/2.0/phobos/std_algorithm.html#balancedParens function] for this.
<langsyntaxhighlight lang=d>import std.stdio, std.algorithm, std.random, std.range;
 
void main() {
Line 2,220:
writeln(s.balancedParens('[', ']') ? " OK: " : "bad: ", s);
}
}</langsyntaxhighlight>
{{out}}
<pre> OK: []
Line 2,233:
===Imperative Version===
{{trans|Raku}}
<langsyntaxhighlight lang=d>import std.stdio, std.random, std.range, std.algorithm;
 
bool isBalanced(in string txt) pure nothrow {
Line 2,255:
writeln(s.isBalanced ? " OK " : "Bad ", s);
}
}</langsyntaxhighlight>
The output is similar.
 
===Functional Style===
{{trans|Haskell}}
<langsyntaxhighlight lang=d>import std.stdio, std.random, std.range, std.algorithm;
 
bool isBalanced(in string s, in char[2] pars="[]") pure nothrow @safe @nogc {
Line 2,278:
writeln(s.isBalanced ? " OK " : "Bad ", s);
}
}</langsyntaxhighlight>
 
=={{header|Delphi}}==
 
<langsyntaxhighlight lang=Delphi>procedure Balanced_Brackets;
 
var BracketsStr : string;
Line 2,312:
writeln(BracketsStr+': not OK');
end;
end;</langsyntaxhighlight>
 
<pre>
Line 2,327:
 
=={{header|Déjà Vu}}==
<langsyntaxhighlight lang=dejavu>matching?:
swap 0
for c in chars:
Line 2,345:
!. matching? "]["
!. matching? "][]["
!. matching? "[]][[]"</langsyntaxhighlight>
{{out}}
<pre>true
Line 2,356:
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang=scheme>
(define (balance str)
(for/fold (closed 0) ((par str))
Line 2,385:
❌ "[[][]]]["
</syntaxhighlight>
</lang>
 
=={{header|Elena}}==
ELENA 4.x :
<langsyntaxhighlight lang=elena>import system'routines;
import extensions;
import extensions'text;
Line 2,434:
 
console.readChar()
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,452:
{{trans|Erlang}}
{{works with|Elixir|1.1}}
<langsyntaxhighlight lang=elixir>defmodule Balanced_brackets do
def task do
Enum.each(0..5, fn n ->
Line 2,478:
end
 
Balanced_brackets.task</langsyntaxhighlight>
 
{{out}}
Line 2,491:
 
=={{header|Erlang}}==
<langsyntaxhighlight lang=Erlang>
-module( balanced_brackets ).
-export( [generate/1, is_balanced/1, task/0] ).
Line 2,521:
task_balanced( true ) -> "OK";
task_balanced( false ) -> "NOT OK".
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,534:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang=euphoria>function check_brackets(sequence s)
integer level
level = 0
Line 2,578:
puts(1," NOT OK\n")
end if
end for</langsyntaxhighlight>
 
Sample output:
Line 2,600:
 
{{Works with|Office 365 betas 2021}}
<langsyntaxhighlight lang=lisp>bracketReport
=LAMBDA(bracketPair,
LAMBDA(s,
Line 2,685:
)
)
)</langsyntaxhighlight>
 
and also assuming the following generic bindings in the Name Manager for the WorkBook:
 
<langsyntaxhighlight lang=lisp>APPENDCOLS
=LAMBDA(xs,
LAMBDA(ys,
Line 2,798:
)
)
)</langsyntaxhighlight>
 
{{Out}}
Line 2,913:
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang=fsharp>let isBalanced str =
let rec loop count = function
| ']'::_ when count = 0 -> false
Line 2,934:
for n in 1..10 do
let s = generate n
printfn "\"%s\" is balanced: %b" s (isBalanced s)</langsyntaxhighlight>
 
Output:
Line 2,950:
=={{header|Factor}}==
This code implements the second part of the task: it reads from standard input an arbitrary string of opening and closing brackets, and checks whether it's balanced or not.
<langsyntaxhighlight lang=Factor>USING: io formatting locals kernel math sequences unicode.case ;
IN: balanced-brackets
 
Line 2,971:
 
readln
balanced</langsyntaxhighlight>
 
Some more idiomatic solution might be as follows:
 
<langsyntaxhighlight lang=Factor>USING: io formatting locals kernel math sequences unicode.case ;
IN: balanced-brackets
 
Line 2,995:
-- Data stack:
t
</syntaxhighlight>
</lang>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang=fantom>
class Main
{
Line 3,039:
}
}
</syntaxhighlight>
</lang>
 
Output (for n=3):
Line 3,067:
=={{header|Forth}}==
{{works with|4tH|3.61.1}}
<langsyntaxhighlight lang=forth>include lib/choose.4th ( n1 -- n2)
include lib/ctos.4th ( n -- a 1)
 
Line 3,089:
; \ evaluate string and print result
 
make[] eval[]</langsyntaxhighlight>
'''Examples''':<pre>[][[]] OK
[[[[]][[ NOT OK
Line 3,105:
=={{header|Fortran}}==
Please see the compilation and program execution result as comments at the top of this source:
<langsyntaxhighlight lang=fortran>
! $ gfortran -g -O0 -std=f2008 -Wall f.f08 -o f.exe
! $ ./f
Line 3,203:
end subroutine generate
end program balanced_brackets
</syntaxhighlight>
</lang>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang=freebasic>' FB 1.05.0 Win64
 
Function isBalanced(s As String) As Boolean
Line 3,250:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
Sample output (last 7 lines random) :
{{out}}
Line 3,272:
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=8960fb267af43f0549d2cfe04288a2d4 Click this link to run this code]'''
<langsyntaxhighlight lang=gambas>'Altered to prevent lines starting with ']' or ending with '[' being generated as they can't work
 
siNumberOfBrackets As Short = 20 'Maximum amount of brackets in a line
Line 3,344:
Return sBrk 'Return the sBrk array
 
End</langsyntaxhighlight>
Output:
<pre>
Line 3,366:
 
=={{header|GAP}}==
<langsyntaxhighlight lang=gap>Balanced := function(L)
local c, r;
r := 0;
Line 3,401:
 
Balanced("[[[]][]]]");
# false</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang=go>package main
 
import (
Line 3,457:
}
testBalanced("()")
}</langsyntaxhighlight>
Output:
<pre>
Line 3,475:
=={{header|Groovy}}==
Generate Arbitrary String of Bracket Pairs:
<langsyntaxhighlight lang=groovy>def random = new Random()
 
def factorial = { (it > 1) ? (2..it).inject(1) { i, j -> i*j } : 1 }
Line 3,495:
def p = random.nextInt(factorial(n*2))
makePermutation(base, p)
}</langsyntaxhighlight>
 
Check Balance of Bracket String:
<langsyntaxhighlight lang=groovy>boolean balancedBrackets(String brackets, int depth=0) {
if (brackets == null || brackets.empty) return depth == 0
switch (brackets[0]) {
Line 3,508:
return brackets.size() == 1 ? depth == 0 : balancedBrackets(brackets[1..-1], depth)
}
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang=groovy>Set brackets = []
(0..100).each {
(0..8).each { r ->
Line 3,523:
def bal = balancedBrackets(it) ? "balanced: " : "unbalanced: "
println "${bal} ${it}"
}</langsyntaxhighlight>
 
Output:
Line 3,722:
=={{header|Haskell}}==
The simplest solution exploits the idea of stack-based automaton, which could be implemented by a fold.
<langsyntaxhighlight lang=haskell>
isMatching :: String -> Bool
isMatching = null . foldl aut []
Line 3,729:
-- aut ('{':s) '}' = s -- automaton could be extended
aut s x = x:s
</syntaxhighlight>
</lang>
 
This generates an infinite stream of correct balanced brackets expressions:
 
<langsyntaxhighlight lang=haskell>brackets = filter isMatching
$ [1.. ] >>= (`replicateM` "[]{}") </langsyntaxhighlight>
<pre>λ> take 10 brackets
["[]","{}","[[]]","[][]","[]{}","[{}]","{[]}","{{}}","{}[]","{}{}"]</pre>
Line 3,740:
In case the index of unmatched opening bracket is need to be found, following solution is suitable.
 
<langsyntaxhighlight lang=haskell>
import Control.Monad
import System.Random
Line 3,771:
let bs = cycle "[]"
rs <- replicateM 10 newStdGen
zipWithM_ (\n r -> check $ shuffle (take n bs) r) [0,2 ..] rs</langsyntaxhighlight>
We put our list shuffling function in a separate module. For efficiency we use ''mutable'' vectors, although for the short lists in our example it doesn't really matter.
<langsyntaxhighlight lang=haskell>module VShuffle
( shuffle
) where
Line 3,802:
do v <- V.unsafeThaw $ V.fromList xs
mapM_ (uncurry $ M.swap v) $ pairs 0 (M.length v - 1) r
V.unsafeFreeze v</langsyntaxhighlight>
Here's some sample output.
<pre>
Line 3,827:
and '''scanl''' also yields a simple fit when we want the index of the tipping point:
 
<langsyntaxhighlight lang=haskell>import Control.Applicative ((<|>))
import Data.List (findIndex, replicate, scanl)
import Data.List.Split (chunksOf)
Line 3,866:
bracket :: Int -> Char
bracket 0 = '['
bracket _ = ']'</langsyntaxhighlight>
{{Out}}
<pre>]][]][: Unmatched
Line 3,891:
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight lang=Icon>procedure main(arglist)
every s := genbs(!arglist) do
write(image(s), if isbalanced(s) then " is balanced." else " is unbalanced")
Line 3,905:
every !s := ?s # shuffle
return s
end</langsyntaxhighlight>
 
Output:<pre>
Line 3,923:
 
=={{header|J}}==
'''Solution''': <langsyntaxhighlight lang=j>bracketDepth =: '[]' -&(+/\)/@:(=/) ]
checkBalanced =: _1 -.@e. bracketDepth
genBracketPairs =: (?~@# { ])@#"0 1&'[]' NB. bracket pairs in arbitrary order</langsyntaxhighlight>
'''Examples''':<langsyntaxhighlight lang=j> (, ' ' , ('bad';'OK') {::~ checkBalanced)"1 genBracketPairs i. 10
OK
][ bad
Line 3,936:
[[]][[][][]][] OK
]]]][[][][[[[]][ bad
[]]][][][[[[]][[]] bad</langsyntaxhighlight>
'''Comments''': This task highlights the versatility and usefulness of J's scanning modifiers, <code>/</code> and <code>\</code>.
 
Line 3,943:
=={{header|Java}}==
{{works with|Java|1.5+}}
<langsyntaxhighlight lang=java5>public class BalancedBrackets {
 
public static boolean hasBalancedBrackets(String str) {
Line 3,991:
}
}
}</langsyntaxhighlight>
Sample output (generate uses random numbers, so it should not be the same every time):
<pre>: true
Line 4,011:
 
=== Extended ===
<langsyntaxhighlight lang=java>import java.util.ArrayDeque;
import java.util.Deque;
 
Line 4,074:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>With areSquareBracketsBalanced:
Line 4,101:
====Iterative====
 
<langsyntaxhighlight lang=JavaScript>function shuffle(str) {
var a = str.split(''), b, c = a.length, d
while (c) b = Math.random() * c-- | 0, d = a[c], a[c] = a[b], a[b] = d
Line 4,117:
var N = Math.random() * 10 | 0, bs = shuffle('['.repeat(N) + ']'.repeat(N))
console.log('"' + bs + '" is ' + (isBalanced(bs) ? '' : 'un') + 'balanced')
}</langsyntaxhighlight>
 
Sample output:
Line 4,144:
==== Another solution ====
{{works with|Node.js}}
<langsyntaxhighlight lang=JavaScript>
console.log("Supplied examples");
var tests = ["", "[]", "][", "[][]", "][][", "[[][]]", "[]][[]"];
Line 4,201:
return generated;
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,229:
====Functional====
With visual indication of where the balance fails:
<langsyntaxhighlight lang=JavaScript>(() => {
'use strict';
 
Line 4,333:
// ---
return main();
})();</langsyntaxhighlight>
{{Out}}
<pre>'' OK
Line 4,348:
 
=={{header|Julia}}==
<langsyntaxhighlight lang=julia>using Printf
 
function balancedbrackets(str::AbstractString)
Line 4,363:
for (test, pass) in map(x -> (x, balancedbrackets(x)), collect(brackets(i) for i = 0:8))
@printf("%22s%10s\n", test, pass ? "pass" : "fail")
end</langsyntaxhighlight>
 
{{out}}
Line 4,377:
 
'''One-line version''':
<langsyntaxhighlight lang=julia>balancedbrackets(str::AbstractString) = foldl((x, y) -> x < 0 ? -1 : x + y, collect((x == '[') - (x == ']') for x in str), init = 0) == 0</langsyntaxhighlight>
 
=={{header|K}}==
<syntaxhighlight lang=K>
<lang K>
gen_brackets:{"[]"@x _draw 2}
check:{r:(-1;1)@"["=x; *(0=+/cs<'0)&(0=-1#cs:+\r)}
Line 4,395:
("][[][[]]][[]]]][][";0)
("]][[[[]]]][][][[]]]]";0))
</syntaxhighlight>
</lang>
 
=={{header|Klingphix}}==
<syntaxhighlight lang=text>"[[]][]]"
 
%acc 0 !acc
Line 4,415:
print
 
" " input</langsyntaxhighlight>
 
=={{header|Kotlin}}==
{{trans|FreeBASIC}}
<langsyntaxhighlight lang=scala>import java.util.Random
 
fun isBalanced(s: String): Boolean {
Line 4,450:
println("$s " + if (isBalanced(s)) "OK" else "NOT OK")
}
}</langsyntaxhighlight>
Sample output (last 7 lines random) :
{{out}}
Line 4,474:
 
=={{header|L++}}==
<langsyntaxhighlight lang=lisp>(include "string")
(defn bool balanced (std::string s)
Line 4,488:
(pr std::boolalpha)
(foreach x tests
(prn x "\t" (balanced x))))</langsyntaxhighlight>
 
=={{header|Lasso}}==
<langsyntaxhighlight lang=Lasso>define randomparens(num::integer,open::string='[',close::string=']') => {
local(out) = array
 
Line 4,512:
with i in 1 to 10
let input = randomparens(#i)
select #input + ' = ' + validateparens(#input)</langsyntaxhighlight>
 
{{out}}
Line 4,526:
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang=lb>
<lang lb>
print "Supplied examples"
for i =1 to 7
Line 4,589:
 
end
</syntaxhighlight>
</lang>
Supplied examples
The string '' is OK.
Line 4,612:
 
=={{header|Lua}}==
<langsyntaxhighlight lang=Lua>
function isBalanced(s)
--Lua pattern matching has a 'balanced' pattern that matches sets of balanced characters.
Line 4,633:
print(RS)
print(isBalanced(RS))
</syntaxhighlight>
</lang>
 
=={{header|Maple}}==
This functionality is provided by Maple.
<langsyntaxhighlight lang=Maple>
> use StringTools in
> IsBalanced( "", "[", "]" );
Line 4,669:
 
false
</syntaxhighlight>
</lang>
Furthermore, Maple can check whether multiple fences are balanced in the same string.
<langsyntaxhighlight lang=Maple>
> StringTools:-IsBalanced( "[()()]", "[(", "])" );
true
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight lang=mathematica>(* Generate open/close events. *)
gen[n_] := RandomSample[Table[{1, -1}, {n}] // Flatten]
 
Line 4,689:
Print[str <> If[match[lst, 0],
" is balanced.",
" is not balanced."]])</langsyntaxhighlight>
 
=={{header|MATLAB}} / {{header|Octave}}==
<langsyntaxhighlight lang=matlab>function x = isbb(s)
t = cumsum((s=='[') - (s==']'));
x = all(t>=0) && (t(end)==0);
end;
</syntaxhighlight>
</lang>
Output:
<pre>
Line 4,715:
 
=={{header|Maxima}}==
<langsyntaxhighlight lang=maxima>brack(s) := block(
[n: slength(s), r: 0, c],
catch(
Line 4,745:
 
brack("[[[]][]]]");
false</langsyntaxhighlight>
 
=={{header|Mercury}}==
<langsyntaxhighlight lang=Mercury>
:- module balancedbrackets.
:- interface.
Line 4,789:
; print(" is unbalanced\n", !IO)
).
</syntaxhighlight>
</lang>
 
=={{header|MiniScript}}==
Line 4,795:
We start by defining a function:
 
<langsyntaxhighlight lang=MiniScript>isBalanced = function(str)
level = 0
for c in str
Line 4,803:
end for
return level == 0
end function</langsyntaxhighlight>
 
We can evaluate the example strings with this code:
 
<langsyntaxhighlight lang=MiniScript>examples = [
"",
"[]",
Line 4,821:
if balanced then outcome = "is OK" else outcome = "NOT OK"
print """" + str + """ " + outcome
end for</langsyntaxhighlight>
 
{{out}}
Line 4,836:
{{works with|TopSpeed (JPI) Modula-2 under DOSBox-X}}
An interesting point is how to ensure that all strings of N left plus N right brackets are equally likely. The program below shows one way of doing this.
<langsyntaxhighlight lang=modula2>
MODULE Brackets;
IMPORT IO, Lib;
Line 4,884:
END;
END Brackets.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,901:
=={{header|Nanoquery}}==
{{trans|Python}}
<langsyntaxhighlight lang=Nanoquery>import Nanoquery.Util
 
def gen(N)
Line 4,933:
println format("%-22s is not balanced", txt)
end
end</langsyntaxhighlight>
{{out}}
<pre> is balanced
Line 4,948:
 
=={{header|Nim}}==
<langsyntaxhighlight lang=nim>
from random import random, randomize, shuffle
from strutils import repeat
Line 4,972:
for n in 0..9:
let s = gen(n)
echo "'", s, "' is ", (if balanced(s): "balanced" else: "not balanced")</langsyntaxhighlight>
Output:
<pre>'' is balanced
Line 4,987:
=={{header|Oberon-2}}==
{{works with|oo2c version 2}}
<langsyntaxhighlight lang=oberon2>
MODULE BalancedBrackets;
IMPORT
Line 5,090:
Do
END BalancedBrackets.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 5,102:
 
=={{header|Objeck}}==
<langsyntaxhighlight lang=objeck>
bundle Default {
class Balanced {
Line 5,135:
}
}
</syntaxhighlight>
</lang>
<pre>
: true
Line 5,148:
=={{header|OCaml}}==
 
<langsyntaxhighlight lang=ocaml>let generate_brackets n =
let rec aux i acc =
if i <= 0 then acc else
Line 5,172:
List.iter print_char brk;
Printf.printf " %B\n" (is_balanced brk);
;;</langsyntaxhighlight>
 
<pre>
Line 5,183:
=={{header|Oforth}}==
 
<langsyntaxhighlight lang=Oforth>String method: isBalanced
| c |
0 self forEach: c [
Line 5,193:
: genBrackets(n)
"" #[ "[" "]" 2 rand 2 == ifTrue: [ swap ] rot + swap + ] times(n) ;</langsyntaxhighlight>
 
{{out}}
Line 5,211:
 
=={{header|ooRexx}}==
<langsyntaxhighlight lang=ooRexx>
tests = .array~of("", "[]", "][", "[][]", "][][", "[[][]]", "[]][[]")
 
Line 5,259:
end
return answer~string
</syntaxhighlight>
</lang>
Sample output (uses randomly generated groupings, so it should be different on each run):
<pre>
Line 5,280:
 
=={{header|OxygenBasic}}==
<langsyntaxhighlight lang=oxygenbasic>function CheckBrackets(string s) as bool
'=======================================
sys co, le=len s
Line 5,307:
print CheckBrackets "[][]"'1
print CheckBrackets "][" '0
</syntaxhighlight>
</lang>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang=parigp>balanced(s)={
my(n=0,v=Vecsmall(s));
for(i=1,#v,
Line 5,322:
};
rnd(n)=Strchr(vectorsmall(n,i,if(random(2),91,93)))
forstep(n=0,10,2,s=rnd(n);print(s"\t"if(balanced(s),"true","false")))</langsyntaxhighlight>
 
=={{header|Pascal}}==
Line 5,331:
Idiomatic solution, using a regex that performs subpattern recursion ''(works with Perl 5.10 and newer)'':
 
<langsyntaxhighlight lang=Perl>sub generate {
my $n = shift;
my $str = '[' x $n;
Line 5,345:
my $input = generate($_);
print balanced($input) ? " ok:" : "bad:", " '$input'\n";
}</langsyntaxhighlight>
 
{{out}}
Line 5,362:
If input strings are allowed to contain unrelated characters, this can be extended to:
 
<langsyntaxhighlight lang=Perl>sub balanced {
shift =~ /^ ( [^\[\]]++ | \[ (?1)* \] )* $/x;
}</langsyntaxhighlight>
 
<code>Regexp::Common::balanced</code> can give such a regexp too (non-bracket chars allowed). Its recent versions use the subpattern recursion and are hence also only for Perl 5.10 and up.
 
<langsyntaxhighlight lang=Perl>use Regexp::Common 'balanced';
my $re = qr/^$RE{balanced}{-parens=>'[]'}$/;
sub balanced {
return shift =~ $re;
}</langsyntaxhighlight>
 
Alternative implementation, using straightforward depth counting:
 
<langsyntaxhighlight lang=Perl>sub balanced {
my $depth = 0;
for (split //, shift) {
Line 5,383:
}
return !$depth
}</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<langsyntaxhighlight lang=Phix>(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">check_brackets</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
Line 5,409:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 5,435:
 
=={{header|Phixmonti}}==
<langsyntaxhighlight lang=Phixmonti>"[[]][]"
0 var acc
 
Line 5,451:
" is OK"
endif
print</langsyntaxhighlight>
 
=={{header|PHP}}==
The sample is given as unix shell script, you need to have ''php-cli'' (or what your package manager calls it) installed.
 
<langsyntaxhighlight lang=PHP>#!/usr/bin/php
<?php
 
Line 5,489:
printf("%s\t%s%s", $s, printbool(isbalanced($s)), PHP_EOL);
}
</syntaxhighlight>
</lang>
Sample run:
<pre>
Line 5,507:
=={{header|Picat}}==
===Foreach loop===
<langsyntaxhighlight lang=picat>go1 ?=>
tests(Tests),
member(Test,Tests),
Line 5,531:
"][][", "[]][[]", "[][][][][][][][][][]",
"[[[[[[[]]]]]]]", "[[[[[[[]]]]]]",
"[][[]][]","[[][]][]", "[][][[]][]"]).</langsyntaxhighlight>
 
{{out}}
Line 5,550:
===DCG===
Here is an implementation using DCG (Definite Clause Grammars).
<langsyntaxhighlight lang=Picat>go_dcg ?=>
tests(Tests),
foreach(Test in Tests)
Line 5,564:
 
balanced --> "".
balanced --> "[", balanced, "]", balanced.</langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight lang=PicoLisp>(load "@lib/simul.l") # For 'shuffle'
 
(de generateBrackets (N)
Line 5,583:
 
(for N 10
(prinl (if (checkBrackets (prin (generateBrackets N))) " OK" "not OK")) )</langsyntaxhighlight>
Output:
<pre>[] OK
Line 5,597:
 
=={{header|PL/I}}==
<langsyntaxhighlight lang=pli>*process m or(!) s attributes source;
cb: Proc Options(main);
/* PL/I program to check for balanced brackets [] ********************
Line 5,658:
End;
 
End;</langsyntaxhighlight>
Output:
<pre> balanced ''
Line 5,689:
=={{header|PowerShell}}==
{{works with|PowerShell|2}}
<langsyntaxhighlight lang=PowerShell>
function Get-BalanceStatus ( $String )
{
Line 5,708:
return $Status
}
</syntaxhighlight>
</lang>
<langsyntaxhighlight lang=PowerShell>
# Test
$Strings = @( "" )
Line 5,718:
$String.PadRight( 12, " " ) + (Get-BalanceStatus $String)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 5,731:
 
===PowerShell (Regex Version)===
<langsyntaxhighlight lang=PowerShell>
function Test-BalancedBracket
{
Line 5,789:
"{0}: {1}" -f $s.PadRight(8), "$(if (Test-BalancedBracket Brace $s) {'Is balanced.'} else {'Is not balanced.'})"
}
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 5,803:
=={{header|Prolog}}==
DCG are very usefull for this kind of exercice !
<langsyntaxhighlight lang=Prolog>rosetta_brackets :-
test_brackets([]),
test_brackets(['[',']']),
Line 5,855:
bracket(0) --> ['['].
bracket(1) --> [']'].
</syntaxhighlight>
</lang>
Sample output :
<pre> ?- balanced_brackets.
Line 5,882:
 
=={{header|PureBasic}}==
<langsyntaxhighlight lang=PureBasic>Procedure.s Generate(N)
For i=1 To N
sample$+"[]"
Line 5,925:
PrintN(" is not balanced")
EndIf
Next</langsyntaxhighlight>
Output sample
<pre>
Line 5,937:
=={{header|Python}}==
===Procedural===
<langsyntaxhighlight lang=python>>>> def gen(N):
... txt = ['[', ']'] * N
... random.shuffle( txt )
Line 5,963:
'[[]]]]][]][[[[' is not balanced
'[[[[]][]]][[][]]' is balanced
'][[][[]]][]]][[[[]' is not balanced</langsyntaxhighlight>
 
=== Functional ===
Line 5,969:
Rather than explicitly track the count, we can just write the per-element test and use stdlib functions to turn it into a whole-sequence test. It's straightforwardly declarative, and hard to get wrong, but whether it's actually easier to understand depends on how familiar the reader is with thinking in `itertools` style.
 
<langsyntaxhighlight lang=python>>>> from itertools import accumulate
>>> from random import shuffle
>>> def gen(n):
Line 5,992:
'][]][][[]][[][' is not balanced
'][[]]][][[]][[[]' is not balanced
'][[][[]]]][[[]][][' is not balanced</langsyntaxhighlight>
 
=== Array Programming ===
Line 5,998:
The numpy library gives us a way to write just the elementwise tests and automatically turn them into whole-sequence tests, although it can be a bit clumsy to use for character rather than numeric operations. The simplicity of the final expression probably doesn't make up for all that extra clumsiness in this case.
 
<langsyntaxhighlight lang=python>>>> import numpy as np
>>> from random import shuffle
>>> def gen(n):
Line 6,022:
'[][[[]][[]]][]' is balanced
'[[][][[]]][[[]]]' is balanced
'][]][][[]][]][][[[' is not balanced</langsyntaxhighlight>
 
=={{header|Qi}}==
 
<langsyntaxhighlight lang=qi>(define balanced-brackets-0
[] 0 -> true
[] _ -> false
Line 6,048:
(balanced-brackets "[]][[]")
 
</syntaxhighlight>
</lang>
 
=={{header|Quackery}}==
 
<langsyntaxhighlight lang=Quackery> [ char [ over of
swap
char ] swap of
Line 6,072:
[ say "un" ]
say "balanced."
cr ]</langsyntaxhighlight>
 
{{out}}
Line 6,091:
=={{header|R}}==
 
<langsyntaxhighlight lang=r>balanced <- function(str){
str <- strsplit(str, "")[[1]]
str <- ifelse(str=='[', 1, -1)
all(cumsum(str) >= 0) && sum(str) == 0
}</langsyntaxhighlight>
 
Alternately, using perl 5.10-compatible regexps,
 
<langsyntaxhighlight lang=r>balanced <- function(str) {
regexpr('^(\\[(?1)*\\])*$', str, perl=TRUE) > -1
}</langsyntaxhighlight>
 
To generate some some examples:
 
<langsyntaxhighlight lang=R>rand.parens <- function(n) paste(sample(c("[","]"),2*n,replace=T),collapse="")
 
as.data.frame(within(list(), {
parens <- replicate(10, rand.parens(sample.int(10,size=1)))
balanced <- sapply(parens, balanced)
}))</langsyntaxhighlight>
 
Output:
<langsyntaxhighlight lang=r> balanced parens
1 FALSE ][][
2 FALSE [][[]]][[]][]]][[[
Line 6,123:
8 FALSE []]]][[[]][[[]
9 TRUE [[[[][[][]]]]]
10 TRUE []</langsyntaxhighlight>
 
=={{header|Racket}}==
 
<langsyntaxhighlight lang=Racket>
#lang racket
 
Line 6,145:
 
(for ([n 10]) (try n))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 6,154:
{{works with|Rakudo|2015.12}}
 
<syntaxhighlight lang=raku perl6lines>sub balanced($s) {
my $l = 0;
for $s.comb {
Line 6,170:
my $n = prompt "Number of brackets";
my $s = (<[ ]> xx $n).flat.pick(*).join;
say "$s {balanced($s) ?? "is" !! "is not"} well-balanced"</langsyntaxhighlight>
 
===FP oriented===
Here's a more idiomatic solution using a hyperoperator to compare all the characters to a backslash (which is between the brackets in ASCII), a triangle reduction to return the running sum, a <tt>given</tt> to make that list the topic, and then a topicalized junction and a topicalized subscript to test the criteria for balance.
<syntaxhighlight lang=raku perl6lines>sub balanced($s) {
.none < 0 and .[*-1] == 0
given ([\+] '\\' «leg« $s.comb).cache;
Line 6,181:
my $n = prompt "Number of bracket pairs: ";
my $s = <[ ]>.roll($n*2).join;
say "$s { balanced($s) ?? "is" !! "is not" } well-balanced"</langsyntaxhighlight>
 
===String munging===
Of course, a Perl 5 programmer might just remove as many inner balanced pairs as possible and then see what's left.
{{works with|Rakudo|2015.12}}
<syntaxhighlight lang=raku perl6lines>sub balanced($_ is copy) {
Nil while s:g/'[]'//;
$_ eq '';
Line 6,193:
my $n = prompt "Number of bracket pairs: ";
my $s = <[ ]>.roll($n*2).join;
say "$s is", ' not' x not balanced($s), " well-balanced";</langsyntaxhighlight>
 
===Parsing with a grammar===
{{works with|Rakudo|2015.12}}
<syntaxhighlight lang=raku perl6lines>grammar BalBrack { token TOP { '[' <TOP>* ']' } }
 
my $n = prompt "Number of bracket pairs: ";
my $s = ('[' xx $n, ']' xx $n).flat.pick(*).join;
say "$s { BalBrack.parse($s) ?? "is" !! "is not" } well-balanced";</langsyntaxhighlight>
 
=={{header|Red}}==
<langsyntaxhighlight lang=Red>; Functional code
balanced-brackets: [#"[" any balanced-brackets #"]"]
rule: [any balanced-brackets end]
Line 6,225:
str: random copy/part "[][][][][][][][][][]" i * 2
print [mold str "is" either balanced? str ["balanced"]["unbalanced"]]
]</langsyntaxhighlight>
 
=={{header|REXX}}==
===with 40 examples===
<langsyntaxhighlight lang=rexx>/*REXX program checks for balanced brackets [ ] ─── some fixed, others random.*/
parse arg seed . /*obtain optional argument from the CL.*/
if datatype(seed,'W') then call random ,,seed /*if specified, then use as RANDOM seed*/
Line 6,267:
else do; !=!-1; if !<0 then return 0; end
end /*j*/
return !==0 /* [↑] "!" is the nested ][ counter.*/</langsyntaxhighlight>
'''output''' &nbsp; using the (some internal, others random) expressions:
<pre>
Line 6,313:
 
===with examples + 30 permutations===
<langsyntaxhighlight lang=rexx>
/*REXX program to check for balanced brackets [] **********************
* test strings and random string generation copied from Version 1
Line 6,381:
end
return nest=0 /* nest=0 -> balanced */
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 6,430:
Naturally, each of the one hundred thousand character strings aren't displayed (for balanced/not-balanced),
<br>but a count is displayed, as anyone can generate the same strings in other languages and compare results.
<langsyntaxhighlight lang=rexx>/*REXX program checks for around 125,000 generated balanced brackets expressions [ ] */
bals=0
#=0; do j=1 until L>20 /*generate lots of bracket permutations*/
Line 6,450:
/*──────────────────────────────────────────────────────────────────────────────────────*/
countStr: procedure; parse arg n,h,s; if s=='' then s=1; w=length(n)
do r=0 until _==0; _=pos(n,h,s); s=_+w; end; return r</langsyntaxhighlight>
'''output''' &nbsp; when using the default input:
<pre>
Line 6,457:
 
=={{header|Ring}}==
<langsyntaxhighlight lang=ring>
nr = 0
while nr < 10
Line 6,484:
next
return "ok."
</syntaxhighlight>
</lang>
Output:
<pre>
Line 6,502:
{{trans|D}}
{{works with|Ruby|1.9}}
<langsyntaxhighlight lang=ruby>re = /\A # beginning of string
(?<bb> # begin capture group <bb>
\[ # literal [
Line 6,518:
t = s.gsub(/[^\[\]]/, "")
puts (t =~ re ? " OK: " : "bad: ") + s
end</langsyntaxhighlight>
 
One output: <pre>
Line 6,537:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang=runbasic>dim brk$(10)
brk$(1) = "[[[][]]]"
brk$(2) = "[[[]][[[][[][]]]]]"
Line 6,557:
if trim$(b$) = "" then print " OK "; else print "Not OK ";
print brk$(i)
next i</langsyntaxhighlight>
 
One output: <pre> OK
Line 6,575:
 
{{libheader|rand}}
<langsyntaxhighlight lang=rust>extern crate rand;
 
trait Balanced {
Line 6,614:
println!("{} {}", brackets, brackets.is_balanced())
}
}</langsyntaxhighlight>
Output: <pre>
true
Line 6,634:
=== Scala Version 1 ===
{{works with|Scala|2.9.1}}
<langsyntaxhighlight lang=scala>import scala.collection.mutable.ListBuffer
import scala.util.Random
 
Line 6,669:
println("\n"+"check all permutations of given length:")
(1 to 5).map(generate(_)).flatten.map(s=>Pair(s,checkBalance(s))).foreach(p=>println((if(p._2) "balanced: " else "unbalanced: ")+p._1))
}</langsyntaxhighlight>
 
<pre style="height:30ex;overflow:scroll">arbitrary random order:
Line 7,045:
=== Scala Version 2 ===
{{works with|Scala|2.10.1}}
<langsyntaxhighlight lang=scala>import scala.util.Random.shuffle
 
object BalancedBracketsApp extends App {
Line 7,072:
}
 
}</langsyntaxhighlight>
 
Alternate implementation of "isBalanced" using tail-recursion instead of var and return:
 
<langsyntaxhighlight lang=scala>import scala.util.Random.shuffle
import scala.annotation.tailrec
 
Line 7,095:
isBalanced(rest, newBalance)
}
</syntaxhighlight>
</lang>
 
Slightly modified implementation of "isBalanced" using tail-recursion
{{works with|Scala|2.11.7}}
<langsyntaxhighlight lang=scala>
@scala.annotation.tailrec
final def isBalanced(
Line 7,118:
}
}
</syntaxhighlight>
</lang>
 
Sample output:
Line 7,135:
 
=={{header|Scheme}}==
<langsyntaxhighlight lang=scheme>(define (balanced-brackets string)
(define (b chars sum)
(cond ((< sum 0)
Line 7,160:
(balanced-brackets "][][")
(balanced-brackets "[]][[]")
</syntaxhighlight>
</lang>
 
=={{header|Scilab}}==
{{trans|MATLAB}}
<syntaxhighlight lang=text>function varargout=isbb(s)
st=strsplit(s);
t=cumsum((st=='[')-(st==']'));
balanced=and(t>=0) & t(length(t))==0;
varargout=list(balanced)
endfunction</langsyntaxhighlight>
{{out}}
The following code was used to generate random strings of length 5, 16, and 22 chars. It also displays the generated string, and the output (true of false) of <code>isbb()</code>.
<syntaxhighlight lang=text>for j=[5 16 22]
s=[];
for i=1:j
Line 7,185:
x=isbb(s);
disp(x);
end</langsyntaxhighlight>
Console output:
<pre> ][]][
Line 7,200:
 
=={{header|Seed7}}==
<langsyntaxhighlight lang=seed7>$ include "seed7_05.s7i";
 
const func string: generateBrackets (in integer: count) is func
Line 7,252:
end for;
end for;
end func;</langsyntaxhighlight>
 
Output:
Line 7,274:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang=ruby>func balanced (str) {
 
var depth = 0
Line 7,287:
for str [']','[','[[]','][]','[[]]','[[]]]][][]]','x[ y [ [] z ]][ 1 ][]abcd'] {
printf("%sbalanced\t: %s\n", balanced(str) ? "" : "NOT ", str)
}</langsyntaxhighlight>
 
{{out}}
Line 7,301:
 
=={{header|Simula}}==
<langsyntaxhighlight lang=simula>BEGIN
INTEGER U;
U := ININT;
Line 7,346:
 
END;
END</langsyntaxhighlight>
{{in}}
<pre>710</pre>
Line 7,396:
{{works with|PolyML}}
 
<langsyntaxhighlight lang=sml>fun isBalanced s = checkBrackets 0 (String.explode s)
and checkBrackets 0 [] = true
| checkBrackets _ [] = false
Line 7,402:
| checkBrackets counter (#"["::rest) = checkBrackets (counter + 1) rest
| checkBrackets counter (#"]"::rest) = checkBrackets (counter - 1) rest
| checkBrackets counter (_::rest) = checkBrackets counter rest</langsyntaxhighlight>
 
An example of usage
 
<langsyntaxhighlight lang=sml>val () =
List.app print
(List.map
Line 7,416:
(* A set of strings to test *)
["", "[]", "[][]", "[[][]]", "][", "][][", "[]][[]"]
)</langsyntaxhighlight>
 
Output:
Line 7,431:
=={{header|Stata}}==
 
<langsyntaxhighlight lang=stata>mata
function random_brackets(n) {
return(invtokens(("[","]")[runiformint(1,2*n,1,2)],""))
Line 7,442:
return(all(a:>=0) & a[n]==0)
}
end</langsyntaxhighlight>
 
'''Test'''
Line 7,469:
Checks balance function:
 
<langsyntaxhighlight lang=swift>import Foundation
 
func isBal(str: String) -> Bool {
Line 7,478:
}
</langsyntaxhighlight>output:<syntaxhighlight lang =swift>
isBal("[[[]]]") // true
 
isBal("[]][[]") // false
 
</langsyntaxhighlight>Random Bracket function:<syntaxhighlight lang =swift>
 
func randBrack(n: Int) -> String {
Line 7,499:
}
 
</langsyntaxhighlight>output:<syntaxhighlight lang =swift>
 
randBrack(2) // "]][["
 
</langsyntaxhighlight>Random check balance function:<syntaxhighlight lang =swift>
 
func randIsBal(n: Int) {
Line 7,518:
randIsBal(4)
 
</langsyntaxhighlight>output:<syntaxhighlight lang =swift>
 
// ][ is unbalanced
Line 7,526:
// []][[] is unbalanced
//
// [][][[]] is balanced</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang=tcl>proc generate {n} {
if {!$n} return
set l [lrepeat $n "\[" "\]"]
Line 7,556:
set s [generate $i]
puts "\"$s\"\t-> [expr {[balanced $s] ? {OK} : {NOT OK}}]"
}</langsyntaxhighlight>
Sample output:
<pre>
Line 7,577:
===Constructing correctly balanced strings===
It is, of course, possible to directly construct such a balanced string, this being much more useful as the length of the string to generate grows longer. This is done by conceptually building a random tree (or forest) and then walking the tree, with open brackets being appended when a node is entered from its root and close brackets being appended when a node is left for its root. This is equivalent to inserting a balanced pair of brackets at a random place in an initially-empty string <math>n</math> times, which might be done like this:
<langsyntaxhighlight lang=tcl>proc constructBalancedString {n} {
set s ""
for {set i 0} {$i < $n} {incr i} {
Line 7,584:
}
return $s
}</langsyntaxhighlight>
As noted, because the generated string is guaranteed to be balanced, it requires no further filtering and this results in much more efficient generation of balanced strings at longer lengths (because there's no need to backtrack).
 
Line 7,591:
 
Generation program in Unix TMG:
<langsyntaxhighlight lang=UnixTMG>program: readint(n) [n>0] readint(seed)
loop: parse(render) [--n>0?]/done loop;
render: random(i, 15) [i = (i+1)*2] loop2 = { 1 * };
Line 7,609:
>>;
 
n: 0; i: 0; b: 0; seed: 0;</langsyntaxhighlight>
 
Sample output:
Line 7,619:
 
Analysis can be done easily using grammar specification, rather than counting brackets:
<langsyntaxhighlight lang=UnixTMG>loop: parse(corr)\loop parse(incorr)\loop;
corr: brkts * = { < OK: > 1 * };
brkts: brkt/null brkts = { 2 1 };
Line 7,629:
 
nonl: !<<
>>;</langsyntaxhighlight>
 
Sample output:
Line 7,642:
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang=tuscript>
$$ MODE TUSCRIPT
 
Line 7,672:
PRINT b," ",status
ENDLOOP
</syntaxhighlight>
</lang>
Output:
<pre>
Line 7,692:
=={{header|TXR}}==
 
<langsyntaxhighlight lang=txr>@(define paren)@(maybe)[@(coll)@(paren)@(until)]@(end)]@(end)@(end)
@(do (defvar r (make-random-state nil))
 
Line 7,714:
@{parens 15} @{matched 15} @{mismatched 15}
@ (end)
@(end)</langsyntaxhighlight>
 
The recursive pattern function <code>@(paren)</code> gives rise to a grammar which matches parentheses:
Line 7,751:
== {{header|TypeScript}} ==
{{trans|JavaScript}}
<langsyntaxhighlight lang=javascript>// Balanced brackets
 
function isStringBalanced(str: string): bool {
Line 7,795:
console.log(`The string '${test}' is ${(isStringBalanced(test) ? "OK." : "not OK.")}`);
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 7,822:
=={{header|UNIX Shell}}==
{{works with|bash}}
<langsyntaxhighlight lang=bash>generate() {
local b=()
local i j tmp
Line 7,859:
balanced "$test" && result=OK || result="NOT OK"
printf "%s\t%s\n" "$test" "$result"
done</langsyntaxhighlight>
 
{{output}}
Line 7,876:
=={{header|Ursala}}==
 
<langsyntaxhighlight lang=Ursala>#import std
#import nat
 
Line 7,883:
#cast %bm
 
main = ^(2-$'[]'*,balanced)* eql@ZFiFX*~ iota64</langsyntaxhighlight>
output:
<pre><
Line 7,903:
 
=={{header|VBA}}==
<syntaxhighlight lang=vb>
<lang vb>
Public Function checkBrackets(s As String) As Boolean
'function checks strings for balanced brackets
Line 7,970:
Next
End Sub
</syntaxhighlight>
</lang>
 
sample output:
Line 7,990:
 
=={{header|VBScript}}==
<langsyntaxhighlight lang=vb>For n = 1 To 10
sequence = Generate_Sequence(n)
WScript.Echo sequence & " is " & Check_Balance(sequence) & "."
Line 8,025:
Check_Balance = "Balanced"
End If
End Function</langsyntaxhighlight>
 
{{out}}
Line 8,042:
 
Antother version not using libraries. The generator works as intended (more difficult to do than the checking)
<syntaxhighlight lang=vb>
<lang vb>
option explicit
 
Line 8,083:
& s & vbtab & " Checks as " & iif(bb,"","un")&"balanced"
next
</syntaxhighlight>
</lang>
Sample run
<pre>
Line 8,099:
 
=={{header|Visual Basic .NET}}==
<langsyntaxhighlight lang=vbnet>Module Module1
 
Private rand As New Random
Line 8,142:
Return numOpen = numClosed
End Function
End Module</langsyntaxhighlight>
 
{{out}}
Line 8,159:
 
=={{header|Vlang}}==
<langsyntaxhighlight lang=vlang>import datatypes as dt
 
fn is_valid(bracket string) bool {
Line 8,182:
println('$b ${is_valid(b)}')
}
}</langsyntaxhighlight>
 
{{out}}
Line 8,198:
=={{header|Wren}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang=ecmascript>import "random" for Random
 
var isBalanced = Fn.new { |s|
Line 8,227:
for (j in 1..8) s = s + ((rand.int(2) == 0) ? "[" : "]")
System.print("%(s) %(isBalanced.call(s) ? "OK" : "NOT OK")")
}</langsyntaxhighlight>
 
{{out}}
Line 8,251:
 
=={{header|X86 Assembly}}==
<langsyntaxhighlight lang=X86Assembly>
section .data
 
Line 8,318:
syscall
ret
</syntaxhighlight>
</lang>
 
=={{header|XBasic}}==
{{trans|JavaScript}}
{{works with|Windows XBasic}}
<langsyntaxhighlight lang=xbasic>' Balanced brackets
PROGRAM "balancedbrackets"
VERSION "0.001"
Line 8,422:
 
END PROGRAM
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 8,448:
 
=={{header|XBS}}==
<langsyntaxhighlight lang=xbs>const Chars:[string] = ["[","]"];
func GenerateString(Amount:number=4):string{
set Result:string = "";
Line 8,464:
set s = GenerateString(math.random(2,4)*2);
log(`{s}: {IsBalanced(s)}`);
}</langsyntaxhighlight>
{{out}}
<pre>
Line 8,480:
 
=={{header|XPL0}}==
<langsyntaxhighlight lang=XPL0>include c:\cxpl\codes; \intrinsic code declarations
 
int N, I, C, Nest;
Line 8,505:
Text(0,"OK
");
]</langsyntaxhighlight>
 
Example output:
Line 8,517:
 
=={{header|Ya}}==
<langsyntaxhighlight lang=Ya>@Balanced[]s // each source must be started by specifying its file name; std extension .Ya could be ommitted and auto added by compiler
 
// all types are prefixed by `
Line 8,553:
//@Std/StdIO/ is used here to use Print function; else it maybe changed to Use @Std/StdIO at global level before this For loop
@Std/StdIO/Print(; "%s : %s\n" ;`Char[=] \brackets = MakeNew_[]s(10) /* all bracket strings are of length 10 */; AreBalanced(brackets) ? "Ok" : "bad")
// note that starting arg of Print is missed by using ';' - default arg value is allowed to use for any arg, even if next args are written</langsyntaxhighlight>
 
=={{header|Yabasic}}==
<langsyntaxhighlight lang=Yabasic>sub check_brackets(s$)
local level, i
Line 8,573:
 
if not check_brackets(s$) print "not ";
print "ok"</langsyntaxhighlight>
 
=={{header|zkl}}==
<langsyntaxhighlight lang=zkl>fcn bb(bs){ while(a:=bs.span("[","]")) {bs=bs[a[1],*]} (Void!=a) }</langsyntaxhighlight>
The span method finds the start and length of a balanced span. This algorithm assumes the string only contains brackets; a matched span is chopped off the front of the string and a new balanced span is searched for. Stops when the string is empty or unbalanced (span returns Void).
<pre>
Line 8,597:
=={{header|ZX Spectrum Basic}}==
{{trans|AWK}}
<langsyntaxhighlight lang=zxbasic>10 FOR n=1 TO 7
20 READ s$
25 PRINT "The sequence ";s$;" is ";
Line 8,614:
1100 RETURN
2000 DATA "[]","][","][][","[][]","[][][]","[]][[]","[[[[[]]]]][][][]][]["
</syntaxhighlight>
</lang>
10,327

edits