105 lines
2.6 KiB
Odin
105 lines
2.6 KiB
Odin
package day02;
|
|
|
|
import "core:os";
|
|
import "core:fmt";
|
|
|
|
Move :: enum {
|
|
ROCK = 1,
|
|
PAPER = 2,
|
|
SCISSORS = 3,
|
|
}
|
|
|
|
rune_move : map[u8]Move
|
|
|
|
init :: proc () {
|
|
rune_move := make(map[u8]Move)
|
|
rune_move['A'] = Move.ROCK
|
|
rune_move['X'] = Move.ROCK
|
|
rune_move['B'] = Move.PAPER
|
|
rune_move['Y'] = Move.PAPER
|
|
rune_move['C'] = Move.SCISSORS
|
|
rune_move['Z'] = Move.SCISSORS
|
|
}
|
|
|
|
determine_score :: proc(friendly: Move, enemy: Move) -> int {
|
|
result: int;
|
|
if enemy == friendly {
|
|
result = 3
|
|
} else if friendly == Move.ROCK && enemy == Move.PAPER {
|
|
result = 0
|
|
} else if friendly == Move.PAPER && enemy == Move.SCISSORS {
|
|
result = 0
|
|
} else if friendly == Move.SCISSORS && enemy == Move.ROCK {
|
|
result = 0
|
|
} else {
|
|
result = 6
|
|
}
|
|
return result + int(friendly)
|
|
}
|
|
|
|
determine_score_alt :: proc(friendly: Move, outcome: Move) -> int {
|
|
// X = lose round
|
|
// Y = draw round
|
|
// Z = win round
|
|
// 3 defeats 2, 2 defeats 1, 1 defeats 3
|
|
// If w := enemy input and v := friendly input, then w = (v - 1) % 2 is a defeat
|
|
return 0
|
|
}
|
|
|
|
main :: proc () {
|
|
init()
|
|
if len(os.args) < 2 {
|
|
fmt.printf("Usage: %s FILENAME\n", os.args[0])
|
|
os.exit(-1)
|
|
}
|
|
|
|
fh, errno := os.open(os.args[1])
|
|
if errno != os.ERROR_NONE {
|
|
fmt.printf("Cannot open %s: %s\n", os.args[1], os.get_last_error_string())
|
|
os.exit(int(errno))
|
|
}
|
|
defer os.close(fh)
|
|
|
|
buffer: []u8 = make([]u8, 1);
|
|
defer delete(buffer);
|
|
|
|
num_read, error := os.read(fh, buffer)
|
|
total_score : int = 0;
|
|
friendly : Move
|
|
enemy : Move
|
|
chr : u8
|
|
|
|
for ; error == os.ERROR_NONE && num_read > 0; num_read, error = os.read(fh, buffer) {
|
|
chr = buffer[0]
|
|
switch chr {
|
|
case '\n':
|
|
fmt.printf("Score for this line: %d\n", determine_score(friendly, enemy))
|
|
total_score += determine_score(friendly, enemy)
|
|
case 'A':
|
|
enemy = .ROCK
|
|
case 'B':
|
|
enemy = .PAPER
|
|
case 'C':
|
|
enemy = .SCISSORS
|
|
case 'X':
|
|
friendly = .ROCK
|
|
case 'Y':
|
|
friendly = .PAPER
|
|
case 'Z':
|
|
friendly = .SCISSORS
|
|
case:
|
|
// this is the default
|
|
}
|
|
}
|
|
if chr != '\n' {
|
|
total_score += determine_score(friendly, enemy)
|
|
}
|
|
/// Handle potential errors
|
|
if error != os.ERROR_NONE {
|
|
fmt.printf("Error reading file: %s", os.get_last_error_string())
|
|
os.exit(-1)
|
|
}
|
|
delete(rune_move);
|
|
fmt.printf("Your score is: %d\n", total_score)
|
|
}
|