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 mediante la función append para reconstruir un slice sin un elemento específico, demostrando cómo eliminar elementos permanentemente 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 con 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 que se eliminará (por ejemplo, "1" para la segunda tarea, usando indexación basada en 0)

Tu tarea consiste en:

  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 como parámetros un slice de estructuras Task y un índice (int)
  3. Dentro de la función removeTask, devolver un nuevo slice con la tarea del índice indicado eliminada mediante el uso de append para combinar los elementos anteriores y posteriores al í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 individuales de las tareas
    • Para cada entrada, dividir por dos puntos para separar el nombre y el estado
    • Convertir la cadena de estado en un booleano ("true" se convierte en true, "false" se convierte en false)
  5. Convertir la cadena de la tercera entrada en un entero para obtener el índice de la tarea
  6. Almacenar el nombre de la tarea que se 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 usando el mismo formato que en los desafíos anteriores:
    • Para las tareas completadas: "[x] [task_name]"
    • Para las 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)"

Usa el paquete strconv para convertir la cadena del índice en un entero. Este desafío demuestra cómo usar append para reconstruir slices combinando las partes anteriores y posteriores a un elemento objetivo, eliminando así elementos de tu colección de manera efectiva mientras mantienes 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

Practica por tu cuenta: Compilador de Go online