-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy path377.go
97 lines (86 loc) · 1.64 KB
/
377.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// UVa 377 - Cowculations
package main
import (
"fmt"
"os"
)
var (
charMap = map[byte]int{'V': 0, 'U': 1, 'C': 2, 'D': 3}
numMap = map[int]string{0: "V", 1: "U", 2: "C", 3: "D"}
)
func convert(n string) [8]int {
var num [8]int
for idx, i := 7, len(n)-1; i >= 0; idx, i = idx-1, i-1 {
num[idx] = charMap[n[i]]
}
return num
}
func add(num1, num2 [8]int) [8]int {
for carry, i := false, 7; i >= 0; i-- {
num2[i] += num1[i]
if carry {
num2[i]++
carry = false
}
if num2[i] > 3 {
carry = true
num2[i] -= 4
}
}
return num2
}
func toString(num [8]int) string {
var str string
for i := range num {
str += numMap[num[i]]
}
return str
}
func shiftLeft(num [8]int) [8]int {
for i := 0; i < 7; i++ {
num[i] = num[i+1]
}
num[7] = 0
return num
}
func shiftRight(num [8]int) [8]int {
for i := 7; i > 0; i-- {
num[i] = num[i-1]
}
num[0] = 0
return num
}
func calc(n1, n2, op string) string {
switch op {
case "A":
return toString(add(convert(n1), convert(n2)))
case "R":
return toString(shiftRight(convert(n2)))
case "L":
return toString(shiftLeft(convert(n2)))
default:
return n2
}
}
func main() {
in, _ := os.Open("377.in")
defer in.Close()
out, _ := os.Create("377.out")
defer out.Close()
var kase int
var op, n1, n2, result string
fmt.Fprintln(out, "COWCULATIONS OUTPUT")
for fmt.Fscanf(in, "%d", &kase); kase > 0; kase-- {
fmt.Fscanf(in, "%s\n%s", &n1, &n2)
for i := 0; i < 3; i++ {
fmt.Fscanf(in, "%s", &op)
n2 = calc(n1, n2, op)
}
if fmt.Fscanf(in, "%s", &result); n2 == result {
fmt.Fprintln(out, "YES")
} else {
fmt.Fprintln(out, "NO")
}
}
fmt.Fprintln(out, "END OF OUTPUT")
}