Menu
Coddy logo textTech

Rimuovere un’attività

Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 24 di 68.

challenge icon

Sfida

Facile

In questa parte del tuo sistema di gestione delle attività, implementerai la possibilità di rimuovere attività dal tuo elenco. Questa sfida si concentra sulla manipolazione delle slice usando la funzione append per ricostruire una slice senza un elemento specifico, mostrando come rimuovere definitivamente elementi dalla tua struttura dati.

Riceverai tre input:

  • Una stringa che rappresenta il numero di attività (ad esempio, "4")
  • Una stringa contenente i dati delle attività nel formato: "name1:status1,name2:status2,name3:status3", dove lo stato è "true" oppure "false" (ad esempio, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:true")
  • Una stringa che rappresenta l'indice dell'attività da rimuovere (ad esempio, "1" per la seconda attività, usando l'indicizzazione a partire da 0)

Il tuo compito è:

  1. Definire la stessa struct Task delle sfide precedenti, con i campi Name (string) e Completed (bool)
  2. Creare una funzione chiamata removeTask che accetta come parametri una slice di struct Task e un indice (int)
  3. All'interno della funzione removeTask, restituire una nuova slice senza l'attività all'indice specificato, usando append per combinare gli elementi prima e dopo l'indice dell'elemento da rimuovere
  4. Analizzare i dati delle attività dal secondo input per creare la tua slice di attività:
    • Suddividere l'input in base alle virgole per ottenere le singole voci delle attività
    • Per ogni voce, suddividerla in base ai due punti per separare il nome dallo stato
    • Convertire la stringa dello stato in un valore booleano ("true" diventa true, "false" diventa false)
  5. Convertire la stringa del terzo input in un intero per ottenere l'indice dell'attività
  6. Memorizzare il nome dell'attività da rimuovere prima di chiamare la funzione removeTask
  7. Chiamare la funzione removeTask con la tua slice e l'indice, memorizzando la slice restituita
  8. Dopo aver rimosso l'attività, visualizzare tutte le attività rimanenti usando lo stesso formato delle sfide precedenti:
    • Per le attività completate: "[x] [task_name]"
    • Per le attività incomplete: "[ ] [task_name]"
  9. Stampare un messaggio di conferma: "Task '[task_name]' removed successfully!"
  10. Stampare il riepilogo aggiornato: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Usa il pacchetto strconv per convertire la stringa dell'indice in un intero. Questa sfida mostra come usare append per ricostruire le slice combinando le parti che precedono e seguono un elemento specifico, rimuovendo così gli elementi dalla tua raccolta e mantenendo l'ordine di quelli rimanenti.

Provalo tu

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)
}

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online