aboutsummaryrefslogtreecommitdiff
path: root/2021/03/second.go
diff options
context:
space:
mode:
authorJulien Dessaux2021-12-07 14:26:36 +0100
committerJulien Dessaux2021-12-07 14:26:36 +0100
commit6ed18289c89eaff3557907df63cf58bd2009b3ee (patch)
tree903d730030c18ab25c212938794c1c03f65f800f /2021/03/second.go
parentInitial import (diff)
downloadadvent-of-code-6ed18289c89eaff3557907df63cf58bd2009b3ee.tar.gz
advent-of-code-6ed18289c89eaff3557907df63cf58bd2009b3ee.tar.bz2
advent-of-code-6ed18289c89eaff3557907df63cf58bd2009b3ee.zip
Added the first days
Diffstat (limited to '')
-rw-r--r--2021/03/second.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/2021/03/second.go b/2021/03/second.go
new file mode 100644
index 0000000..33938a1
--- /dev/null
+++ b/2021/03/second.go
@@ -0,0 +1,96 @@
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "log"
+ "os"
+)
+
+func findBitCount(data []string) []int {
+ bits := make([]int, 12)
+ for _, line := range data {
+ for n := 0; n < 12; n++ {
+ if line[n] == '1' {
+ bits[n]++
+ }
+ }
+ }
+ return bits
+}
+
+func main() {
+ f, err := os.Open("input")
+ if err != nil {
+ log.Fatalf("%+v", err)
+ }
+ defer f.Close()
+
+ scanner := bufio.NewScanner(f)
+ scanner.Split(bufio.ScanLines)
+
+ data := make([]string, 0)
+ for scanner.Scan() {
+ data = append(data, scanner.Text())
+ }
+
+ datacsr := make([]string, len(data))
+ copy(datacsr, data)
+
+ var ogr int
+ for n := 0; n < 12; n++ {
+ if len(data) == 1 {
+ break
+ }
+ bits := findBitCount(data)
+ var i byte
+ if 2*bits[n] >= len(data) {
+ i = '1'
+ } else {
+ i = '0'
+ }
+ newdata := make([]string, 0)
+ for j := 0; j < len(data); j++ {
+ if data[j][n] == i {
+ newdata = append(newdata, data[j])
+ }
+ }
+ data = newdata
+ }
+ for n := 0; n < 12; n++ {
+ ogr *= 2
+ if data[0][n] == '1' {
+ ogr++
+ }
+ }
+
+ data = datacsr
+ var csr int
+ for n := 0; n < 12; n++ {
+ if len(data) == 1 {
+ break
+ }
+ bits := findBitCount(data)
+ var i byte
+ if 2*bits[n] < len(data) {
+ i = '1'
+ } else {
+ i = '0'
+ }
+ newdata := make([]string, 0)
+ for j := 0; j < len(data); j++ {
+ if data[j][n] == i {
+ newdata = append(newdata, data[j])
+ }
+ }
+ data = newdata
+ }
+ for n := 0; n < 12; n++ {
+ csr *= 2
+ if data[0][n] == '1' {
+ csr++
+ }
+ }
+
+ fmt.Println(ogr * csr)
+}