上机编程认证03


/*
* Copyright (c) Huawei Technologies Co., Ltd. 2019-2020. All rights reserved.
* Description: 上机编程认证
* Note: 缺省代码仅供参考,可自行决定使用、修改或删除
* 只能import Go标准库
*/

package main

import (
"bufio"
"fmt"
"io"
"os"
"strconv"
"strings"
)


func inputStrVerify(input string) bool {
//判断是否是string是否合规
inputLens := len(input)
//长度范围内
if inputLens < 2 && inputLens > 12 {
return false
}
//长度为偶数
if inputLens % 2 != 0 {
return false
}
for _,value := range input {
//判断字符是否是16进制
stringValue := string(value)
if stringValue < "0" || stringValue > "F" {
return false
}
}
//判断header的两个字节是否符合要求
doubleLens := len(input) / 2
otc,_ := strconv.ParseInt(input[0:2],16,64)
firOtc := otc >> (8-doubleLens)
headRightOtc := int64(1 << doubleLens - 1)
if firOtc != headRightOtc {
return false
}
//判断第二个字节后
for key,value := range input[2:]{
nodeIntVal,_ := strconv.ParseInt(string(value),16,64)
if key % 2 == 0{
nodeVal := nodeIntVal >> 2
if nodeVal != 2 {
return false
}
}
}
return true
}

func getHeaderBitStr(doubleLens int,input string) string{
otc,_ := strconv.ParseInt(input,16,64)
firOtc := otc >> (8-doubleLens)
firDec := otc ^ (firOtc << (8-doubleLens))
strFirDec := strconv.FormatInt(firDec,2)
return strFirDec
}

func getNodeBitStr(input string) string {
bitStr := ""
for key,value := range input{
nodeIntVal,_ := strconv.ParseInt(string(value),16,64)
nodeStr := ""
if key % 2 == 0{
nodeStr = strconv.FormatInt(nodeIntVal ^ 8,2)
if len(nodeStr) < 2 {
for i := 0;i< (2-len(nodeStr));i++ {
bitStr += "0"
}
}
} else {
nodeStr = strconv.FormatInt(nodeIntVal,2)
if len(nodeStr) < 4 {
for i := 0;i< (4-len(nodeStr));i++ {
bitStr += "0"
}
}
}
bitStr += nodeStr
}
return bitStr
}

// 待实现函数,在此函数中填入答题代码
func encodingVerify(input string) int {
//判断字符是否合规
if !inputStrVerify(input) {
return -1
}
//抽取二进制字符
bitStr := ""
doubleLens := len(input) / 2
//获取头结点二进制字符
headerBitStr := getHeaderBitStr(doubleLens,input[0:2])
bitStr += headerBitStr
//获取其他结点二进制字符
nodeBitStr := getNodeBitStr(input[2:])
bitStr += nodeBitStr
resStr, _ := strconv.ParseInt(bitStr,2,64)
return int(resStr)
}

func main() {
inputReader := bufio.NewReader(os.Stdin)
input, err := inputReader.ReadString('\n')
if err != nil && err != io.EOF {
fmt.Println(err.Error())
return
}
input = strings.TrimRight(input, "\r\n")
input = strings.TrimSpace(input)
fmt.Println(encodingVerify(input))
}


E980A5
36901

C0C0
-1


//test

package main

import (
"testing"
)

func TestEncodingVerify(t *testing.T) {
var expStr = []int{
36901,
33,
0,
-1,
}
var inputStr = []string{
"E980A5",
"A1",
"C080",
"C0C0",
}
for key,value := range inputStr{
resStr := encodingVerify(value)
if expStr[key] != resStr {
t.Errorf("resStr %d is not the expected value %d",
resStr, expStr[key])
}
}
}