12. String — Solusi PR

File solusi .lua ada di exercises/12/homework/solutions/.

Soal 1 — Keras dan pelan

Soal. Cetak sebuah nama tiga kali: aslinya, huruf besar semua, huruf kecil semua.

Cara mikirnya. Kamu butuh dua fungsi baru: string.upper(s) dan string.lower(s). Keduanya tidak mengubah variabel aslinya, jadi ketiga print merujuk ke name yang sama.

Solusi.

local name = "Keiko"

print(name)
print(string.upper(name))
print(string.lower(name))

Kesalahan umum.

  • Menulis name = string.upper(name) di antara print. Itu menimpa nilai aslinya, jadi print berikutnya memakai teks yang sudah berubah, bukan "Keiko" lagi. Biarkan yang asli tidak berubah dan lakukan transformasi hanya di dalam setiap pemanggilan print.

Soal 2 — Baris status

Soal. Gunakan string.format untuk menghasilkan Keiko Lv 7 HP 95.

Cara mikirnya. Tiga nilai, tiga placeholder: %s untuk nama, %d untuk level, %d untuk HP. Label (Lv, HP) dan spasi di antara kolom ada di dalam format string itu sendiri.

Solusi.

local name = "Keiko"
local level = 7
local hp = 95

print(string.format("%s  Lv %d   HP %d", name, level, hp))

Spasi ganda setelah %s dan spasi tiga kali setelah level menyesuaikan keluaran yang diminta. Sesuaikan spasinya sesuai keinginan.

Kesalahan umum.

  • Memakai %d untuk string atau %s untuk angka. Placeholder yang salah menghasilkan error seperti bad argument to format. Pasangkan %s dengan string dan %d dengan bilangan bulat.
  • Lupa mengoper cukup argumen. Tiga placeholder butuh tiga nilai.

Soal 3 — Puisi tiga baris dalam satu print

Soal. Satu pemanggilan print, tiga baris keluaran, dipisahkan oleh \n.

Cara mikirnya. Di dalam string biasa, \n adalah karakter baris baru, jadi satu string dengan dua \n dicetak sebagai tiga baris. Komentar harus menjelaskan kenapa: print mencetak apapun yang diterima, dan string ini sudah mengandung karakter baris baru.

Solusi.

print("Code is poetry,\nbugs are typos,\nfix them and ship.")
-- One print call still produced three lines because the string itself
-- contained two `\n` characters, each of which Lua replaces with a
-- newline before sending to the terminal.

Kesalahan umum.

  • Menulis \\n alih-alih \n. Dua backslash berarti backslash literal diikuti huruf n, yang tidak dianggap sebagai baris baru oleh Lua.

Tantangan — Blok judul

Soal. Cetak sebuah judul dengan border garis putus-putus di atas dan bawah. Panjang border dihitung dari panjang judul, bukan diketik manual.

Cara mikirnya. Border harus sepanjang #title + 4 karakter (dua tanda hubung di setiap sisi " TITLE "). Buat baris tanda hubung sepanjang itu dengan string.rep("-", n), dan buat baris tengah dengan menyambung tanda hubung, spasi, judul, spasi lagi, dan tanda hubung.

Solusi.

local title = "INVENTORY"

local border = string.rep("-", #title + 4)
local middle = "-- " .. title .. " --"

print(border)
print(middle)
print("Inside text goes here")
print(middle)
print(border)

Keluaran untuk title = "INVENTORY":

-------------
-- INVENTORY --
Inside text goes here
-- INVENTORY --
-------------

Ganti title ke "SHOP" dan bordernya mengecil. Makanya kamu pakai #title dan tidak perlu menghitung tanda hubung secara manual.

Kesalahan umum.

  • Hard-coding jumlah tanda hubung. Tantangannya adalah menghitung panjangnya dari #title.
  • Bingung antara #title + 4 (panjang border dalam karakter) dengan isi string. Yang pertama adalah angka yang dioper ke string.rep; yang kedua adalah teks sebenarnya.

Sudah selesai?

Berikutnya adalah Angka dan matematika, lalu Menerima input, kemudian mini-proyek Bagian 3.