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) } 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) }