Menu
CoddyTech

Repaso: lista personalizada

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 34 de 65.

challenge icon

Desafío

Intermedio

Escribe CustomList en custom_list.gd, una clase que envuelve un Array privado _items y ofrece lo que necesita una lista mediante métodos y métodos virtuales:

  • _init(items = []) guarda una copia de items, para que los cambios posteriores en el Array pasado no afecten a la lista.
  • append(item) añade un elemento al final. pop_back() elimina y devuelve el último elemento, o devuelve null cuando la lista está vacía.
  • get_at(index) devuelve el elemento, o null cuando el índice está fuera del rango de 0 a size() - 1. set_at(index, value) reemplaza el elemento y devuelve true, o devuelve false si el índice está fuera de la lista.
  • size(), has(item) y clear() funcionan como los métodos de Array con los mismos nombres.
  • concat(other) sustituye al operador +: devuelve un nuevo CustomList con los elementos de esta lista seguidos por los elementos de other, y no modifica ninguna de las dos listas.
  • _to_string() devuelve los elementos tal como los imprime un Array, por ejemplo [3, 1, 4].
  • _iter_init(), _iter_next() y _iter_get() permiten que un bucle for recorra los elementos.

El código proporcionado lee los números iniciales (una línea, separados por espacios, posiblemente vacía), crea la lista, añade 99 al Array que le pasó y la imprime. Después lee la cantidad de comandos y ejecuta uno por línea: append N, pop, get I, set I N, has N, size, sum (un bucle for sobre la lista), clear y concat N N .... Para esta entrada:

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

imprime:

[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]

Tu código va en custom_list.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
	var list := CustomList.new(numbers)
	# La lista debe conservar su propia copia
	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

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online