Sha256: 86781d6016fb6044b1cadb7355b232278b0f517f31b5e74374ae51cfa3417436

Contents?: true

Size: 1.48 KB

Versions: 167

Compression:

Stored size: 1.48 KB

Contents

package brackets

import (
	"fmt"
)

// testVersion shows the version of the exercise.
const testVersion = 4

type bracketKind int

const (
	kindParen  bracketKind = iota
	kindSquare bracketKind = iota
	kindBrace  bracketKind = iota
)

// Whether a bracket is an opening or closing bracket
type bracketForm bool

const (
	formOpen  bracketForm = true
	formClose bracketForm = false
)

type charInfo struct {
	kind bracketKind
	form bracketForm
}

// Bracket returns whether all the brackets in the input string are
// correctly nested.
func Bracket(input string) (bool, error) {
	var stack []bracketKind
	for _, char := range input {
		ci, err := info(char)
		if err != nil {
			return false, err
		}
		if ci.form == formOpen {
			stack = append(stack, ci.kind)
		} else {
			if len(stack) == 0 {
				return false, nil
			} else if stack[len(stack)-1] == ci.kind {
				stack = stack[:len(stack)-1]
			} else {
				return false, nil
			}
		}
	}
	return len(stack) == 0, nil
}

func info(char rune) (charInfo, error) {
	switch char {
	case '(':
		return charInfo{kind: kindParen, form: formOpen}, nil
	case '[':
		return charInfo{kind: kindSquare, form: formOpen}, nil
	case '{':
		return charInfo{kind: kindBrace, form: formOpen}, nil
	case ')':
		return charInfo{kind: kindParen, form: formClose}, nil
	case ']':
		return charInfo{kind: kindSquare, form: formClose}, nil
	case '}':
		return charInfo{kind: kindBrace, form: formClose}, nil
	default:
		return charInfo{}, fmt.Errorf("Unknown bracket %v", char)
	}
}

Version data entries

167 entries across 167 versions & 1 rubygems

Version Path
trackler-2.1.0.11 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.10 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.9 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.8 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.7 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.6 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.5 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.4 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.3 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.2 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.1 tracks/go/exercises/bracket-push/example.go
trackler-2.1.0.0 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.55 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.54 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.53 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.52 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.51 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.50 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.49 tracks/go/exercises/bracket-push/example.go
trackler-2.0.8.48 tracks/go/exercises/bracket-push/example.go