题解 | #密码强度等级#

密码强度等级

http://www.nowcoder.com/practice/52d382c2a7164767bca2064c1c9d5361

package main

import "fmt"

func main() {
	for {
		var a string
		if _, err := fmt.Scan(&a); err != nil {
			break
		}
		solution(a)
	}
}

func solution(s string) {
	r := []rune(s)
	total := 0
	c := count(r)
	total = judgeLen(c) + judgeNum(c) + judgeAlph(c) + judgeSymbol(c) + award(c)
	grade(total)
}

// 评分
func grade(n int) {
	switch {
	case n >= 90:
		fmt.Println("VERY_SECURE")
	case n >= 80:
		fmt.Println("SECURE")
	case n >= 70:
		fmt.Println("VERY_STRONG")
	case n >= 60:
		fmt.Println("STRONG")
	case n >= 50:
		fmt.Println("AVERAGE")
	case n >= 25:
		fmt.Println("WEAK")
	default:
		fmt.Println("VERY_WEAK")
	}
}

type Counter struct {
	length, num, lower, upper, symbol int
}

// 一次遍历统计所有次数
func count(r []rune) *Counter {
	var c Counter
	c.length = len(r)
	for _, v := range r {
		switch {
		case v >= 'a' && v <= 'z':
			c.lower++
		case v >= 'A' && v <= 'Z':
			c.upper++
		case v >= '0' && v <= '9':
			c.num++
		default:
			c.symbol++
		}
	}
	return &c
}

// 长度评分
func judgeLen(c *Counter) int {
	l := c.length
	switch {
	case l <= 4:
		return 5
	case l <= 7:
		return 10
	default:
		return 25
	}
}

// 数字评分
func judgeNum(c *Counter) int {
	n := c.num
	switch {
	case n == 0:
		return 0
	case n == 1:
		return 10
	default:
		return 20
	}
}

// 字母评分
func judgeAlph(c *Counter) int {
	l, u := c.lower, c.upper
	switch {
	case l+u == 0:
		return 0
	case l == 0 || u == 0:
		return 10
	default:
		return 20
	}
}

// 符号评分
func judgeSymbol(c *Counter) int {
	s := c.symbol
	switch {
	case s == 0:
		return 0
	case s == 1:
		return 10
	default:
		return 25
	}
}

// 奖励
func award(c *Counter) int {
	l, u, n, s := c.lower, c.upper, c.num, c.symbol
	switch {
	case l > 0 && u > 0 && n > 0 && s > 0:
		return 5
	case l+u > 0 && n > 0 && s > 0:
		return 3
	case l+u > 0 && n > 0:
		return 2
	default:
		return 0
	}
}

全部评论

相关推荐

09-29 00:03
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务