Menu
CoddyTech

Повторение: пользовательский список

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 34 из 65.

challenge icon

Задание

Средне

Напиши CustomList в custom_list.gd — класс, который оборачивает приватный массив _items и предоставляет необходимые списку возможности с помощью методов и виртуальных методов:

  • _init(items = []) сохраняет копию items, поэтому последующие изменения переданного массива не влияют на список.
  • append(item) добавляет элемент в конец. pop_back() удаляет и возвращает последний элемент или возвращает null, если список пуст.
  • get_at(index) возвращает элемент или null, если индекс находится вне диапазона от 0 до size() - 1. set_at(index, value) заменяет элемент и возвращает true либо возвращает false, если индекс находится за пределами списка.
  • size(), has(item) и clear() работают так же, как одноимённые методы Array.
  • concat(other) заменяет оператор +: он возвращает новый CustomList, содержащий сначала элементы этого списка, а затем элементы other, и не изменяет ни один из списков.
  • _to_string() возвращает элементы в том же виде, в каком Array выводит их, например [3, 1, 4].
  • _iter_init(), _iter_next() и _iter_get() позволяют циклу for перебирать элементы.

Предоставленный код считывает начальные числа (одна строка, числа разделены пробелами; строка может быть пустой), создаёт список, добавляет 99 в переданный массив и выводит список. Затем он считывает количество команд и выполняет по одной команде в каждой строке: append N, pop, get I, set I N, has N, size, sum (цикл for по списку), clear и concat N N .... Для этих входных данных:

3 1 4
8
append 1
get 2
get 9
set 0 5
has 4
sum
pop
concat 9 2

он выводит:

[3, 1, 4]
[3, 1, 4, 1]
Item 2: 4
No item at 9
[5, 1, 4, 1]
Has 4: true
Sum: 11
Popped 1
[5, 1, 4] + [9, 2] = [5, 1, 4, 9, 2]

Твой код должен находиться в custom_list.gd. В main.gd находится предоставленный код ввода/вывода, его нельзя редактировать.

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

extends Node

func _ready():
	# Предоставленный код ввода-вывода: оставьте его без изменений
	var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
	var list := CustomList.new(numbers)
	# Список должен хранить собственную копию
	numbers.append(99)
	print(list)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ", false)
		match parts[0]:
			"append":
				list.append(int(parts[1]))
				print(list)
			"pop":
				var item = list.pop_back()
				print("Empty" if item == null else "Popped %d" % item)
			"get":
				var item = list.get_at(int(parts[1]))
				print(("No item at " + parts[1]) if item == null else "Item %s: %d" % [parts[1], item])
			"set":
				if list.set_at(int(parts[1]), int(parts[2])):
					print(list)
				else:
					print("No item at " + parts[1])
			"has":
				print("Has %s: %s" % [parts[1], list.has(int(parts[1]))])
			"size":
				print("Size: %d" % list.size())
			"sum":
				var total := 0
				for item in list:
					total += item
				print("Sum: %d" % total)
			"clear":
				list.clear()
				print(list)
			"concat":
				var other := CustomList.new(to_numbers(parts.slice(1)))
				print("%s + %s = %s" % [list, other, list.concat(other)])

func to_numbers(words: PackedStringArray) -> Array:
	var result := []
	for word in words:
		result.append(int(word))
	return result

Все уроки раздела Объектно-ориентированное программирование

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