Menu
Coddy logo textTech

Removendo uma Tarefa

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 24 de 68.

challenge icon

Desafio

Fácil

Nesta parte do seu sistema de gerenciamento de tarefas, você implementará a capacidade de remover tarefas da sua lista. Este desafio foca na manipulação de fatias (slices) usando a função append para reconstruir um slice sem um elemento específico, demonstrando como remover itens permanentemente da sua estrutura de dados.

Você receberá três entradas:

  • Uma string representando o número de tarefas (ex: "4")
  • Uma string contendo os dados das tarefas no formato: "name1:status1,name2:status2,name3:status3" onde o status é "true" ou "false" (ex: "Buy groceries:false,Call dentist:true,Finish project:false,Review code:true")
  • Uma string representando o índice da tarefa a ser removida (ex: "1" para a segunda tarefa, usando indexação baseada em 0)

Sua tarefa é:

  1. Definir a mesma struct Task dos desafios anteriores com os campos Name (string) e Completed (bool)
  2. Criar uma função chamada removeTask que recebe um slice de structs Task e um índice (int) como parâmetros
  3. Dentro da função removeTask, retornar um novo slice com a tarefa no índice fornecido removida, usando append para combinar os elementos antes e depois do índice alvo
  4. Analisar os dados das tarefas da segunda entrada para criar seu slice de tarefas:
    • Dividir a entrada por vírgulas para obter as entradas de tarefas individuais
    • Para cada entrada, dividir por dois pontos para separar o nome e o status
    • Converter a string de status para um booleano ("true" torna-se true, "false" torna-se false)
  5. Converter a terceira string de entrada para um inteiro para obter o índice da tarefa
  6. Armazenar o nome da tarefa a ser removida antes de chamar a função removeTask
  7. Chamar sua função removeTask com seu slice e o índice, armazenando o slice retornado
  8. Após remover a tarefa, exibir todas as tarefas restantes usando o mesmo formato dos desafios anteriores:
    • Para tarefas concluídas: "[x] [task_name]"
    • Para tarefas incompletas: "[ ] [task_name]"
  9. Imprimir uma mensagem de confirmação: "Task '[task_name]' removed successfully!"
  10. Imprimir o resumo atualizado: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Use o pacote strconv para converter a string do índice em um inteiro. Este desafio demonstra como usar append para reconstruir slices combinando porções antes e depois de um elemento alvo, removendo efetivamente itens de sua coleção enquanto mantém a ordem dos elementos restantes.

Experimente você mesmo

package main

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

type Task struct {
	Name      string
	Completed bool
}

func completeTask(tasks *[]Task, index int) {
	(*tasks)[index].Completed = true
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskDataStr := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskDataStr, ",")
	tasks := make([]Task, len(taskEntries))
	
	for i, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks[i] = Task{Name: name, Completed: status}
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Complete the task
	taskName := tasks[index].Name
	completeTask(&tasks, index)
	
	// Display all tasks
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' marked as completed!\n", taskName)
	
	// Count completed and incomplete tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			completedCount++
		}
	}
	incompleteCount := len(tasks) - completedCount
	
	// Print summary
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), completedCount, incompleteCount)
}

Todas as lições de Lógica & Fluxo