Язык Go. Количество букв в предложении


Подсчитаем количество символов в тексте — сколько какой буквы сколько раз встречается. Можно сделать это при помощи карт (map), но есть и другой, С-style способ — через знаковую арифметику:

package main

import "fmt"

const AZ = 'z' - 'a' + 1 // 26

func main() {
	s := "lets calculate how much times each letter presented in sentance"

	var counter [AZ]int

	for _, a := range s {
		if a >= 'a' && a <= 'z' {
			counter[a-'a']++
		}
	}

	for i := 0; i < AZ; i++ {
		fmt.Printf("%c: %d \n", i+'a', counter[i])
	}
}

При помощи дополнительного if можно модифицировать этот код, чтобы также учитывать заглавные буквы:

package main

import "fmt"

const AZ = 'z' - 'a' + 1 // 26

func main() {
	s := "Lets calculate how much times each letter presented in sentance"

	var counter [AZ]int

	for _, a := range s {
		if a >= 'a' && a <= 'z' {
			counter[a-'a']++
		} else if a >= 'A' && a <= 'Z' {
			counter[a-'A']++
		}
	}

	for i := 0; i < AZ; i++ {
		fmt.Printf("%c: %d \n", i+'a', counter[i])
	}
}

И еще один вариант с другим циклом:

package main

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

func getInput(r *bufio.Reader) string {
	input, _ := r.ReadString('\n')

	input = strings.TrimSpace(input)

	input = strings.ToLower(input)

	return input
}

func main() {
	r := bufio.NewReader(os.Stdin)

	line := getInput(r)

	var az [26]int

	// 97 a

	for _, v := range line {
		if v >= 'a' && v <= 'z' {
			az[v-97]++
		}
	}

	for i, v := range az {
		fmt.Printf("%c - %d\n", i+97, v)
	}

}

И еще один извращенский способ с использованием карт (map), чисто как упражнение:

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strings"
)

func getInput(r *bufio.Reader) string {
	input, _ := r.ReadString('\n')

	return strings.ToLower(strings.TrimSpace(input))
}

func main() {
	r := bufio.NewReader(os.Stdin)

	line := getInput(r)

	// 97 a... lets make it with maps

	az := map[rune]int{}
	var keys []int // for sorting

	for _, v := range line {
		if v >= 'a' && v <= 'z' {
			az[v] += 1
		}
	}

	for v := range az {
		keys = append(keys, int(v))
	}

	sort.Ints(keys)

	for _, v := range keys {
		fmt.Printf("%c - %d\n", v, az[rune(v)])
	}

}

 


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.