package main import ( "fmt" "github.com/dariubs/percent" "io/ioutil" "sort" "strings" ) type letter struct { upperCase string lowerCase string count int frequency float64 } type letterList []letter func (l letterList) Len() int { return len(l) } func (l letterList) Less(i, j int) bool { return l[i].frequency > l[j].frequency } func (l letterList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } var alphabet = []rune{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', } var letters = make([]letter, len(alphabet)) func initLetterStruct() { for index := range alphabet { letters[index].upperCase = string(alphabet[index]) letters[index].lowerCase = string(alphabet[index] + 32) } } func readFile(relativePath string) string { content, err := ioutil.ReadFile(relativePath) if err != nil { fmt.Println(err) } return string(content) } func countLetters(inputText string) int { totalCount := 0 for index := range alphabet { letters[index].count += strings.Count(inputText, letters[index].lowerCase) + strings.Count(inputText, letters[index].upperCase) totalCount += letters[index].count } return totalCount } func calculateFrequency(totalCount int) { for index := range alphabet { letters[index].frequency = percent.PercentOf(letters[index].count, totalCount) } } func printResult() { for index := range alphabet { l := letters[index] fmt.Printf( "The letter %s (%s) occurs %d times in the text and the frequencyArray in percent is %0.2f\n", l.upperCase, l.lowerCase, l.count, l.frequency, ) } } func main() { initLetterStruct() totalCount := countLetters(readFile("plaintext.txt")) calculateFrequency(totalCount) sort.Sort(letterList(letters)) printResult() }