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
%duntuk string atau%suntuk angka. Placeholder yang salah menghasilkan error seperti bad argument to format. Pasangkan%sdengan string dan%ddengan 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
\\nalih-alih\n. Dua backslash berarti backslash literal diikuti hurufn, 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 kestring.rep; yang kedua adalah teks sebenarnya.
Sudah selesai?
Berikutnya adalah Angka dan matematika, lalu Menerima input, kemudian mini-proyek Bagian 3.