Skip to content

Commit 8000e1d

Browse files
committed
day4 complete
1 parent b6d57fa commit 8000e1d

File tree

2 files changed

+244
-0
lines changed

2 files changed

+244
-0
lines changed

day4/main.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package main
2+
3+
import "strconv"
4+
5+
import "log"
6+
7+
func main() {
8+
from := 264360
9+
to := 746325
10+
11+
inRange := 0
12+
correctNumbers := []string{}
13+
14+
for i := from; i <= to; i++ {
15+
16+
current := strconv.Itoa(i)
17+
18+
hasSameDigits := false
19+
hasMixedNumbers := false
20+
var lastDigit rune
21+
22+
for _, c := range current {
23+
digitInt, _ := strconv.Atoi(string(c))
24+
lastInt, _ := strconv.Atoi(string(lastDigit))
25+
26+
if digitInt == lastInt {
27+
hasSameDigits = true
28+
29+
//log.Print("hasSameDigits")
30+
31+
}
32+
33+
//log.Printf("Digit: %d , Last %d", digitInt, lastInt)
34+
if digitInt < lastInt {
35+
hasMixedNumbers = true
36+
}
37+
38+
lastDigit = c
39+
}
40+
// log.Printf("hasSameDigits %v hasMixedNumbers %v", hasSameDigits, hasMixedNumbers)
41+
if hasSameDigits && !hasMixedNumbers {
42+
inRange++
43+
correctNumbers = append(correctNumbers, current)
44+
}
45+
}
46+
47+
wrongNumbers := []string{}
48+
49+
for _, cn := range correctNumbers {
50+
incorrect := getIncorrectList(cn)
51+
52+
isValid := false
53+
for _, v := range incorrect {
54+
55+
if v == 2 {
56+
isValid = true
57+
}
58+
}
59+
if isValid {
60+
wrongNumbers = append(wrongNumbers, cn)
61+
}
62+
// if isInvalid {
63+
// inRange--
64+
// }
65+
}
66+
67+
log.Printf("In range %d in list %d , in wrong: %d , left: %d", inRange, len(correctNumbers), len(wrongNumbers), len(correctNumbers)-len(wrongNumbers))
68+
// for _, c := range correctNumbers {
69+
// existIn := false
70+
// for _, w := range wrongNumbers {
71+
// if c == w {
72+
// existIn = true
73+
// }
74+
// }
75+
// if existIn {
76+
// log.Printf("incorrect2:%s", c)
77+
// } else {
78+
// log.Printf("correct2:%s", c)
79+
// }
80+
// }
81+
82+
}
83+
84+
func getIncorrectList(cn string) map[rune]int {
85+
incorrect := map[rune]int{}
86+
87+
for i, r := range cn {
88+
if i == 0 {
89+
continue
90+
}
91+
92+
prev := rune(cn[i-1])
93+
94+
var prev2 rune
95+
96+
if i-2 > -1 {
97+
prev2 = rune(cn[i-2])
98+
}
99+
100+
if prev == r {
101+
if prev2 == r {
102+
incorrect[r]++
103+
} else {
104+
if incorrect[r] != 2 {
105+
incorrect[r] += 2
106+
}
107+
}
108+
109+
}
110+
}
111+
return incorrect
112+
}

day4/main_test.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestCrossinglinesBasic(t *testing.T) {
11+
cases := []struct {
12+
name string
13+
input string
14+
expected bool
15+
}{
16+
{
17+
name: "example 1",
18+
input: "112233",
19+
expected: true,
20+
},
21+
{
22+
name: "example 2",
23+
input: "123444",
24+
expected: false,
25+
},
26+
{
27+
name: "example 3",
28+
input: "111122",
29+
expected: true,
30+
},
31+
{
32+
name: "example 4",
33+
input: "111122",
34+
expected: true,
35+
},
36+
{
37+
name: "example 5",
38+
input: "221444",
39+
expected: true,
40+
},
41+
{
42+
name: "example 6",
43+
input: "42244",
44+
expected: true,
45+
},
46+
{
47+
name: "example 7",
48+
input: "24144",
49+
expected: true,
50+
},
51+
{
52+
name: "example 8",
53+
input: "44144",
54+
expected: true,
55+
},
56+
{
57+
name: "example 9",
58+
input: "111114",
59+
expected: false,
60+
},
61+
{
62+
name: "example 10",
63+
input: "411111",
64+
expected: false,
65+
},
66+
{
67+
name: "example 11",
68+
input: "411122",
69+
expected: true,
70+
},
71+
{
72+
name: "example 12",
73+
input: "111111",
74+
expected: false,
75+
},
76+
{
77+
name: "example 13",
78+
input: "255515",
79+
expected: false,
80+
},
81+
{
82+
name: "example 14",
83+
input: "331331",
84+
expected: true,
85+
},
86+
{
87+
name: "example 15",
88+
input: "331133",
89+
expected: true,
90+
},
91+
{
92+
name: "example 16",
93+
input: "688999",
94+
expected: true,
95+
},
96+
{
97+
name: "example 17",
98+
input: "441111",
99+
expected: true,
100+
},
101+
{
102+
name: "example 18",
103+
input: "421111",
104+
expected: false,
105+
},
106+
}
107+
108+
for _, c := range cases {
109+
t.Run(c.name, func(t *testing.T) {
110+
res := false
111+
got := getIncorrectList(c.input)
112+
113+
log.Printf("got: %+v , %s", got, c.name)
114+
115+
isValid := false
116+
for k, v := range got {
117+
if v == 2 {
118+
log.Printf("correct %v: %d", k, v)
119+
isValid = true
120+
}
121+
}
122+
if isValid {
123+
res = true
124+
} else {
125+
res = false
126+
}
127+
128+
assert.Equal(t, c.expected, res)
129+
})
130+
131+
}
132+
}

0 commit comments

Comments
 (0)