Skip to content

Commit

Permalink
Merge 508bc5a into d4bce72
Browse files Browse the repository at this point in the history
  • Loading branch information
vaskoz committed Dec 30, 2019
2 parents d4bce72 + 508bc5a commit 2240698
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -403,4 +403,5 @@ problems from
* [Day 403](https://github.com/vaskoz/dailycodingproblem-go/issues/815)
* [Day 404](https://github.com/vaskoz/dailycodingproblem-go/issues/817)
* [Day 405](https://github.com/vaskoz/dailycodingproblem-go/issues/819)
* [Day 406](https://github.com/vaskoz/dailycodingproblem-go/issues/821)

62 changes: 62 additions & 0 deletions day406/problem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package day406

// CountParensEqualTrue returns the number of possible
// paren patterns that evaluate to True.
// Runs in O(N^3) time and O(N^2) extra space.
func CountParensEqualTrue(input []rune) int {
var sym, ops []rune

for i := range input {
if i%2 == 0 {
sym = append(sym, input[i])
} else {
ops = append(ops, input[i])
}
}

f := make([][]int, len(sym))
t := make([][]int, len(sym))

for i := range f {
f[i] = make([]int, len(sym))
t[i] = make([]int, len(sym))

if sym[i] == 'F' {
f[i][i] = 1
}

if sym[i] == 'T' {
t[i][i] = 1
}
}

for gap := 1; gap < len(sym); gap++ {
for i, j := 0, gap; j < len(sym); i, j = i+1, j+1 {
t[i][j] = 0
f[i][j] = 0

for g := 0; g < gap; g++ {
k := i + g
tik := t[i][k] + f[i][k]
tkj := t[k+1][j] + f[k+1][j]

if ops[k] == '&' {
t[i][j] += t[i][k] * t[k+1][j]
f[i][j] += tik*tkj - t[i][k]*t[k+1][j]
}

if ops[k] == '|' {
f[i][j] += f[i][k] * f[k+1][j]
t[i][j] += tik*tkj - f[i][k]*f[k+1][j]
}

if ops[k] == '^' {
t[i][j] += f[i][k]*t[k+1][j] + t[i][k]*f[k+1][j]
f[i][j] += t[i][k]*t[k+1][j] + f[i][k]*f[k+1][j]
}
}
}
}

return t[0][len(t[0])-1]
}
30 changes: 30 additions & 0 deletions day406/problem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package day406

import "testing"

// nolint
var testcases = []struct {
input []rune
expected int
}{
{[]rune{'F', '|', 'T', '&', 'T'}, 2},
{[]rune{'T', '|', 'T', '&', 'F', '^', 'T'}, 4},
}

func TestCountParensEqualTrue(t *testing.T) {
t.Parallel()

for _, tc := range testcases {
if result := CountParensEqualTrue(tc.input); result != tc.expected {
t.Errorf("Expected %v, got %v", tc.expected, result)
}
}
}

func BenchmarkCountParensEqualTrue(b *testing.B) {
for i := 0; i < b.N; i++ {
for _, tc := range testcases {
CountParensEqualTrue(tc.input)
}
}
}

0 comments on commit 2240698

Please sign in to comment.