116 lines
2.3 KiB
Go
116 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"strings"
|
|
)
|
|
|
|
func printRunes() {
|
|
fmt.Println("lowercase")
|
|
alphabet := "abcdefghijklmnopqrstuvwxyz"
|
|
|
|
for _, v := range alphabet {
|
|
fmt.Println(string(v), v)
|
|
}
|
|
|
|
fmt.Println("")
|
|
fmt.Println("uppercase")
|
|
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
|
for _, v := range alphabet {
|
|
fmt.Println(string(v), v)
|
|
}
|
|
}
|
|
|
|
func compare(f string, s string) (result rune) {
|
|
minLength := math.Min(float64(len(f)), float64(len(s)))
|
|
|
|
for i := 0; i < int(minLength); i++ {
|
|
// check each character of each string
|
|
if strings.Contains(s, string(f[i])) {
|
|
result = rune(f[i])
|
|
maxValue := math.Max(float64(result), float64(f[i]))
|
|
|
|
// assign the greatest value (between the current stored value
|
|
// and the newly found value) to our result
|
|
result = rune(maxValue)
|
|
} else if strings.Contains(f, string(s[i])) {
|
|
result = rune(s[i])
|
|
maxValue := math.Max(float64(result), float64(s[i]))
|
|
result = rune(maxValue)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func unique(e string) (result string, duplicated rune) {
|
|
for _, v := range e {
|
|
if strings.Contains(result, string(v)) {
|
|
duplicated = v
|
|
continue
|
|
}
|
|
|
|
result += string(v)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func runeToScore(input rune) int32 {
|
|
// filter out non-alphabetical runes
|
|
isBetweenRanges := input > 90 && input < 97
|
|
isAboveRange := input > 122
|
|
isBelowRange := input < 65
|
|
|
|
// for these, return zero (will not affect total score of solution)
|
|
if isBetweenRanges || isAboveRange || isBelowRange {
|
|
fmt.Println(input)
|
|
return 0
|
|
}
|
|
|
|
if input <= 90 {
|
|
// is uppercase
|
|
return int32(input - 38)
|
|
} else {
|
|
// is lowercase
|
|
return int32(input - 96)
|
|
}
|
|
}
|
|
|
|
func dayThree(input string) (solution int32) {
|
|
// split input by newlines
|
|
var eachPart = strings.Split(input, "\n")
|
|
|
|
// trim all remaining whitespace
|
|
for j := range eachPart {
|
|
eachPart[j] = strings.TrimSpace(eachPart[j])
|
|
}
|
|
|
|
for i := 0; i < len(eachPart); i++ {
|
|
part := eachPart[i]
|
|
|
|
if part == "" {
|
|
continue
|
|
}
|
|
|
|
// split string into two halves
|
|
front, back := part[0:len(part)/2], part[len(part)/2:]
|
|
|
|
fmt.Println(part)
|
|
fmt.Println(front, back)
|
|
|
|
// check each character against each other string
|
|
result := compare(front, back)
|
|
score := runeToScore(result)
|
|
fmt.Println(string(result), result, score)
|
|
|
|
// add each value to total score
|
|
solution += score
|
|
fmt.Println("")
|
|
}
|
|
|
|
return
|
|
}
|