Fácil Go

Contando palavras

Enunciado

Escreva um programa que conte quantas vezes cada palavra aparece em uma frase e imprima o resultado. Use um map[string]int.

Requisitos

  • Crie o map com make.
  • Use strings.Fields para separar as palavras.
  • Imprima cada palavra e sua contagem.

Código inicial

package main

import (
    "fmt"
    "strings"
)

func main() {
    frase := "go é divertido go é rápido"
    // seu código aqui
}

Saída esperada

go: 2
é: 2
divertido: 1
rápido: 1
Ver dica

Use strings.Fields(frase) para obter uma slice de palavras. Depois itere sobre ela e incremente o map.

Mostrar solução
package main

import (
    "fmt"
    "strings"
)

func main() {
    frase := "go é divertido go é rápido"
    contagem := make(map[string]int) // cria o map vazio

    for _, palavra := range strings.Fields(frase) {
        contagem[palavra]++ // incrementa a contagem da palavra
    }

    for palavra, n := range contagem {
        fmt.Printf("%s: %d\n", palavra, n)
    }
}

Passo a passo

  1. Declaramos a frase e criamos um map vazio com make(map[string]int).
  2. strings.Fields(frase) divide a frase em palavras, ignorando espaços múltiplos.
  3. No loop, para cada palavra, contagem[palavra]++ incrementa o valor associado. Se a palavra não existir, o valor zero (0) é usado e depois incrementado.
  4. No segundo loop, iteramos sobre o map e imprimimos cada par chave-valor.

Por que funciona

O map armazena a contagem de cada palavra. A operação contagem[palavra]++ é segura mesmo se a palavra ainda não estiver no map, pois o valor zero do tipo int é 0. A iteração com range percorre todos os pares, mas a ordem é aleatória; por isso a saída pode variar.

Erros comuns

  • Esquecer de inicializar o map: var contagem map[string]int e depois contagem[palavra]++ causa panic (assignment to entry in nil map). Use make.
  • Usar strings.Split sem tratar espaços vazios: strings.Split pode gerar strings vazias se houver espaços extras. Prefira strings.Fields.
  • Assumir ordem na saída: a ordem das linhas pode mudar a cada execução. Se precisar de ordem, ordene as chaves.

Outra forma de resolver

Usar um slice de palavras e ordenar antes de contar, mas isso não é necessário. Uma alternativa é usar for _, palavra := range strings.Fields(frase) { contagem[palavra] = contagem[palavra] + 1 }, mas ++ é mais idiomático.

Saída esperada

go: 2
é: 2
divertido: 1
rápido: 1

(Nota: a ordem pode variar.)