Menu
CoddyTech

Ringkasan: List Kustom

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 34 dari 65.

challenge icon

Tantangan

Sedang

Tulis CustomList di custom_list.gd, sebuah class yang membungkus Array privat _items dan menyediakan hal-hal yang dibutuhkan sebuah list melalui method dan method virtual:

  • _init(items = []) menyimpan salinan items, sehingga perubahan berikutnya pada Array yang diteruskan tidak memengaruhi list.
  • append(item) menambahkan item di bagian akhir. pop_back() menghapus dan mengembalikan item terakhir, atau mengembalikan null saat list kosong.
  • get_at(index) mengembalikan item, atau null saat index berada di luar rentang 0 hingga size() - 1. set_at(index, value) mengganti item dan mengembalikan true, atau mengembalikan false jika index berada di luar list.
  • size(), has(item), dan clear() bekerja seperti method Array dengan nama yang sama.
  • concat(other) menggantikan operator +: fungsi ini mengembalikan CustomList baru yang berisi item dari list ini, diikuti item dari other, dan tidak mengubah kedua list.
  • _to_string() mengembalikan item seperti cara Array mencetaknya, misalnya [3, 1, 4].
  • _iter_init(), _iter_next(), dan _iter_get() memungkinkan perulangan for menelusuri item.

Kode yang disediakan membaca angka awal (satu baris, dipisahkan spasi, boleh kosong), membuat list, menambahkan 99 ke Array yang diteruskan, lalu mencetak list. Setelah itu, kode membaca jumlah perintah dan menjalankan satu perintah pada setiap baris: append N, pop, get I, set I N, has N, size, sum (perulangan for untuk menelusuri list), clear, dan concat N N .... Untuk input ini:

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

hasilnya:

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

Tulis kodemu di custom_list.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan tetap seperti semula
	var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
	var list := CustomList.new(numbers)
	# list harus menyimpan salinannya sendiri
	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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online