写题记录-锤子剪刀布
题目相对简单,给出了输入轮次 N
,只需要按照题目所描述的逻辑逐个实现即可。
首先实现猜拳比较的函数:
func compare(a, b string) int {
if a == b {
return 0
}
switch {
case (a == "C" && b == "J") || (a == "J" && b == "B") || (a == "B" && b == "C"):
return 1
case (a == "C" && b == "B") || (a == "J" && b == "C") || (a == "B" && b == "J"):
return -1
default:
return 0
}
}
再实现甲乙双方各手势的胜率函数:
func updateWinrate(player string, cnt []int) {
switch player {
case "C":
cnt[0]++
case "J":
cnt[1]++
case "B":
cnt[2]++
}
}
最后输出胜率最高手势这部分有些麻烦,为了代码可读性,将其封装成若干个函数:
func winrate_output() {
Amax := max(A_cnt[0], A_cnt[1], A_cnt[2])
Bmax := max(B_cnt[0], B_cnt[1], B_cnt[2])
printMax(Amax, A_cnt, "C", "J", "B")
fmt.Print(" ")
printMax(Bmax, B_cnt, "C", "J", "B")
}
func printMax(maxVal int, cnt []int, c, j, b string) {
// 检查是否有多个最大值
hasMultipleMax := (boolToInt(cnt[0] == maxVal) + boolToInt(cnt[1] == maxVal) + boolToInt(cnt[2] == maxVal)) > 1
if hasMultipleMax {
// 输出所有最大值对应的字符
if cnt[2] == maxVal {
fmt.Print(b)
} else if cnt[0] == maxVal {
fmt.Print(c)
} else if cnt[1] == maxVal {
fmt.Print(j)
}
} else {
// 输出单个最大值对应的字符
switch {
case maxVal == cnt[0]:
fmt.Print(c)
case maxVal == cnt[1]:
fmt.Print(j)
case maxVal == cnt[2]:
fmt.Print(b)
}
}
}
func max(nums ...int) int {
maxVal := nums[0]
for _, num := range nums {
if num > maxVal {
maxVal = num
}
}
return maxVal
}
最后加上主函数和一些声明,小小优化一下,完整代码如下:
package main
import (
"fmt"
)
// C: 石头, J: 剪刀, B: 布
var A_cnt = []int{0, 0, 0}
var B_cnt = []int{0, 0, 0}
func compare(a, b string) int {
if a == b {
return 0
}
winMap := map[string]string{"C": "J", "J": "B", "B": "C"}
if winMap[a] == b {
return 1
}
return -1
}
func updateWinrate(player string, cnt []int) {
switch player {
case "C":
cnt[0]++
case "J":
cnt[1]++
case "B":
cnt[2]++
}
}
func max(nums ...int) int {
maxVal := nums[0]
for _, num := range nums {
if num > maxVal {
maxVal = num
}
}
return maxVal
}
func boolToInt(b bool) int {
if b {
return 1
}
return 0
}
func printMax(maxVal int, cnt []int, c, j, b string) {
// 检查是否有多个最大值
hasMultipleMax := (boolToInt(cnt[0] == maxVal) + boolToInt(cnt[1] == maxVal) + boolToInt(cnt[2] == maxVal)) > 1
if hasMultipleMax {
// 输出所有最大值对应的字符
if cnt[2] == maxVal {
fmt.Print(b)
} else if cnt[0] == maxVal {
fmt.Print(c)
} else if cnt[1] == maxVal {
fmt.Print(j)
}
} else {
// 输出单个最大值对应的字符
switch {
case maxVal == cnt[0]:
fmt.Print(c)
case maxVal == cnt[1]:
fmt.Print(j)
case maxVal == cnt[2]:
fmt.Print(b)
}
}
}
func winrate_output() {
Amax := max(A_cnt[0], A_cnt[1], A_cnt[2])
Bmax := max(B_cnt[0], B_cnt[1], B_cnt[2])
printMax(Amax, A_cnt, "C", "J", "B")
fmt.Print(" ")
printMax(Bmax, B_cnt, "C", "J", "B")
}
func main() {
var N int
a_win, b_win, equl := 0, 0, 0
var a, b string
fmt.Scanf("%d", &N)
for i := 0; i < N; i++ {
fmt.Scanf("%s %s", &a, &b)
switch compare(a, b) {
case 1:
a_win++
updateWinrate(a, A_cnt)
case -1:
b_win++
updateWinrate(b, B_cnt)
case 0:
equl++
}
}
fmt.Println(a_win, equl, b_win)
fmt.Println(b_win, equl, a_win)
winrate_output()
}