84 lines
1.3 KiB
Odin
84 lines
1.3 KiB
Odin
package main
|
|
|
|
import "core:fmt"
|
|
import "core:os"
|
|
import "core:strconv"
|
|
import "core:strings"
|
|
import "core:unicode/utf8"
|
|
|
|
main :: proc() {
|
|
|
|
if len(os.args) < 2 {
|
|
fmt.println("Error: file required")
|
|
os.exit(-1)
|
|
}
|
|
filename := os.args[1]
|
|
|
|
sum, ok := getSum(filename)
|
|
if !ok {
|
|
os.exit(-1)
|
|
}
|
|
fmt.println(sum)
|
|
|
|
}
|
|
|
|
|
|
getSum :: proc(filename: string) -> (int, bool) {
|
|
data, err := os.read_entire_file(filename, context.allocator)
|
|
if err != nil {
|
|
fmt.println("error opening file", err)
|
|
return -1, false
|
|
}
|
|
defer delete(data, context.allocator)
|
|
sum := 0
|
|
|
|
iter := string(data)
|
|
|
|
for line in strings.split_lines_iterator(&iter) {
|
|
first := getFirst(line)
|
|
last := getLast(line)
|
|
|
|
// convert to rune array
|
|
digits := []rune{first, last}
|
|
// convert rune array to string first?
|
|
str := utf8.runes_to_string(digits, context.allocator)
|
|
// covert string to int..
|
|
val, ok := strconv.parse_int(str)
|
|
if !ok {
|
|
fmt.println("error converting to int")
|
|
continue
|
|
}
|
|
sum += val
|
|
|
|
}
|
|
|
|
return sum, true
|
|
}
|
|
|
|
getFirst :: proc(line: string) -> rune {
|
|
first: rune
|
|
|
|
for ch in line {
|
|
if ch >= '0' && ch <= '9' {
|
|
first = ch
|
|
break
|
|
}
|
|
}
|
|
|
|
return first
|
|
}
|
|
|
|
getLast :: proc(line: string) -> rune {
|
|
last: rune
|
|
|
|
length := len(line) - 1
|
|
for i := length; i >= 0; i -= 1 {
|
|
if line[i] >= '0' && line[i] <= '9' {
|
|
last = rune(line[i])
|
|
break
|
|
}
|
|
|
|
}
|
|
return last
|
|
}
|