Menu
CoddyTech

Удаление задачи

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 24 из 68.

challenge icon

Задание

Легко

В этой части системы управления задачами ты реализуешь возможность удалять задачи из списка. В этом задании основное внимание уделяется манипуляциям со срезами с помощью функции append, чтобы восстановить срез без определённого элемента и продемонстрировать, как навсегда удалять элементы из структуры данных.

Тебе будут переданы три входных значения:

  • Строка, представляющая количество задач (например, "4")
  • Строка с данными задач в формате: "name1:status1,name2:status2,name3:status3", где статус — это либо "true", либо "false" (например, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:true")
  • Строка, представляющая индекс задачи, которую нужно удалить (например, "1" для второй задачи при нумерации индексов с 0)

Тебе нужно:

  1. Определить ту же структуру Task, что и в предыдущих заданиях, с полями Name (string) и Completed (bool)
  2. Создать функцию с именем removeTask, которая принимает в качестве параметров срез структур Task и индекс (int)
  3. Внутри функции removeTask вернуть новый срез, в котором удалена задача с заданным индексом. Для этого используй append, чтобы объединить элементы до целевого индекса и после него
  4. Разобрать данные задач из второго входного значения и создать срез задач:
    • Разделить входную строку по запятым, чтобы получить отдельные записи задач
    • Для каждой записи разделить её по двоеточию, чтобы отделить имя от статуса
    • Преобразовать строку статуса в логическое значение ("true" становится true, "false" становится false)
  5. Преобразовать строку из третьего входного значения в целое число, чтобы получить индекс задачи
  6. Сохранить имя задачи, которую нужно удалить, до вызова функции removeTask
  7. Вызвать функцию removeTask, передав ей срез и индекс, и сохранить возвращённый срез
  8. После удаления задачи вывести все оставшиеся задачи в том же формате, что и в предыдущих заданиях:
    • Для выполненных задач: "[x] [task_name]"
    • Для невыполненных задач: "[ ] [task_name]"
  9. Вывести сообщение с подтверждением: "Task '[task_name]' removed successfully!"
  10. Вывести обновлённую сводку: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Используй пакет strconv, чтобы преобразовать строку с индексом в целое число. В этом задании показано, как с помощью append восстанавливать срезы, объединяя части до целевого элемента и после него, эффективно удаляя элементы из коллекции и сохраняя порядок оставшихся элементов.

Попробуйте сами

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

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go