Menu
Coddy logo textTech

Eliminar una tarea

Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 24 de 68.

challenge icon

Desafío

Fácil

En esta parte de tu sistema de gestión de tareas, implementarás la capacidad de eliminar tareas de tu lista. Este desafío se centra en la manipulación de slices utilizando la función append para reconstruir un slice sin un elemento específico, demostrando cómo eliminar permanentemente elementos de tu estructura de datos.

Recibirás tres entradas:

  • Una cadena que representa el número de tareas (por ejemplo, "4")
  • Una cadena que contiene los datos de las tareas en el formato: "name1:status1,name2:status2,name3:status3" donde el estado es "true" o "false" (por ejemplo, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:true")
  • Una cadena que representa el índice de la tarea a eliminar (por ejemplo, "1" para la segunda tarea, utilizando indexación basada en 0)

Tu tarea es:

  1. Definir la misma estructura Task de desafíos anteriores con los campos Name (string) y Completed (bool)
  2. Crear una función llamada removeTask que reciba un slice de estructuras Task y un índice (int) como parámetros
  3. Dentro de la función removeTask, devolver un nuevo slice con la tarea en el índice dado eliminada, utilizando append para combinar los elementos antes y después del índice objetivo
  4. Analizar los datos de las tareas de la segunda entrada para crear tu slice de tareas:
    • Dividir la entrada por comas para obtener las entradas de tareas individuales
    • Para cada entrada, dividir por dos puntos para separar el nombre y el estado
    • Convertir la cadena de estado a un booleano ("true" se convierte en true, "false" se convierte en false)
  5. Convertir la tercera cadena de entrada a un entero para obtener el índice de la tarea
  6. Almacenar el nombre de la tarea que se va a eliminar antes de llamar a la función removeTask
  7. Llamar a tu función removeTask con tu slice y el índice, almacenando el slice devuelto
  8. Después de eliminar la tarea, mostrar todas las tareas restantes utilizando el mismo formato que en desafíos anteriores:
    • Para tareas completadas: "[x] [task_name]"
    • Para tareas incompletas: "[ ] [task_name]"
  9. Imprimir un mensaje de confirmación: "Task '[task_name]' removed successfully!"
  10. Imprimir el resumen actualizado: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Utiliza el paquete strconv para convertir la cadena del índice en un entero. Este desafío demuestra cómo usar append para reconstruir slices combinando porciones antes y después de un elemento objetivo, eliminando eficazmente elementos de tu colección mientras se mantiene el orden de los elementos restantes.

Pruébalo tú mismo

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 las lecciones de Lógica y Flujo