From 7900c3d3a70ae416205e1d72dc34b208ceb380eb Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Mon, 30 Dec 2019 10:52:07 -0700 Subject: [PATCH 1/2] day 406 is exactly day 308 --- day406/problem.go | 62 ++++++++++++++++++++++++++++++++++++++++++ day406/problem_test.go | 30 ++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 day406/problem.go create mode 100644 day406/problem_test.go diff --git a/day406/problem.go b/day406/problem.go new file mode 100644 index 0000000..a872903 --- /dev/null +++ b/day406/problem.go @@ -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] +} diff --git a/day406/problem_test.go b/day406/problem_test.go new file mode 100644 index 0000000..cb299c2 --- /dev/null +++ b/day406/problem_test.go @@ -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) + } + } +} From 508bc5a9a10ecb48997a4452e917dacfc1e06709 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Mon, 30 Dec 2019 10:52:33 -0700 Subject: [PATCH 2/2] add day 406 to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9ba14eb..71bbb13 100644 --- a/README.md +++ b/README.md @@ -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)