"""Sesi 13 — String Manipulation | Kode Pendamping Lengkap
SMAS St. John · Ekskul CSSE (Python)

Cara pakai:
  1. Simpan file ini, buka di VS Code
  2. Tekan Run (F5) (atau ketik di terminal: python kode.py)
  3. Baca output di terminal — lalu baca komentar di dalamnya:
     setiap BAGIAN sesuai urutan slide deck Sesi 13
  4. BAGIAN 6 (challenge penilaian) minta input — isi nama apa saja,
     contoh: "   budi sanTOso  "

File ini mengikuti alur deck:
  BAGIAN 1 = string = deretan karakter: indexing & slicing  (slide 04-05)
  BAGIAN 2 = immutable: string tidak bisa diubah langsung   (slide 06)
  BAGIAN 3 = method pembersih & pengubah huruf              (slide 07-08)
  BAGIAN 4 = tugas 1: transformasi teks                     (slide 09)
  BAGIAN 5 = split & join, f-string, cek isi                (slide 10-12)
  BAGIAN 6 = tugas 2 + challenge: perbaiki input user       (slide 13-15)
  BAGIAN 7 = case kumulatif: format daftar siswa            (slide 15)
"""

# ============================================================
# BAGIAN 1 — string = deretan karakter: indexing & slicing
# ============================================================
# Analogi: string = rangkaian GERBONG KERETA.
# Tiap huruf satu gerbong, tiap gerbong punya nomor — mulai dari 0!

teks = "BINUS"
print(teks[0])       # B  — gerbong pertama (Python mulai hitung dari 0)
print(teks[4])       # S  — gerbong ke-5 (indeks 4!)
print(teks[-1])      # S  — hitung MUNDUR dari belakang: -1 = terakhir
print(len(teks))     # 5  — jumlah gerbong

# Slicing: [mulai : berhenti] — potong beberapa gerbong sekaligus
# ATURAN EMAS: kiri TERMASUK, kanan TIDAK IKUT.
kalimat = "BINUS International"
print(kalimat[0:5])   # BINUS           (indeks 0,1,2,3,4 — 5 tidak ikut)
print(kalimat[6:10])  # Inte
print(kalimat[6:])    # International   (dari 6 sampai habis)
print(kalimat[-3:])   # ion             (3 gerbong terakhir)

# ============================================================
# BAGIAN 2 — immutable: string tidak bisa diubah langsung
# ============================================================
# List boleh diganti isinya (Sesi 11), string TIDAK.
# Mau "mengubah" string? Bikin RANGKAIAN BARU, lalu simpan ke variabel.

nilai = [70, 80]
nilai[0] = 95         # sah — list mutable
print("List berubah:", nilai)   # [95, 80]

kata = "budi"
# kata[0] = "B"       # TypeError! 'str' object does not support item assignment
# Penjelasan: string immutable — Python menolak mengubah gerbong aslinya.
# Solusi: rangkai string BARU lalu simpan:
kata = "B" + kata[1:] # "B" + "udi" -> "Budi"
print("String baru:", kata)

# ============================================================
# BAGIAN 3 — method pembersih & pengubah huruf
# ============================================================
# SEMUA method string mengembalikan STRING BARU — aslinya tidak disentuh.
# Karena itu hasilnya HARUS disimpan ke variabel, kalau tidak -> hilang.

nama = "  budi Santoso  "
print(nama.strip())          # budi Santoso    (spasi ujung kiri-kanan dipotong)
print(nama.upper())          #   BUDI SANTOSO  (kapital semua)
print(nama.lower())          #   budi santoso  (kecil semua)
print(nama.title())          #   Budi Santoso  (tiap kata diawali kapital)
print(nama)                  #   budi Santoso   <- ASLINYA MASIH KOTOR! bukti immutable

# Pola yang benar: simpan hasilnya
nama_rapi = nama.strip()
print("Sudah disimpan:", nama_rapi, "| panjang:", len(nama_rapi))   # 12

# replace: ganti kata (dua bahan dalam kurung)
judul = "aku suka kopi"
print(judul.replace("kopi", "teh"))   # aku suka teh
print(judul)                          # aku suka kopi — asli tetap! (immutable lagi)

# Chaining: hasil kiri jadi bahan kanan — urutan penting
print("   budi santoso".strip().title())   # Budi Santoso

# ============================================================
# BAGIAN 4 — Tugas 1: transformasi teks (slide 09)
# ============================================================
# Level 1 — teriak semua: kapital, HASIL DISIMPAN dulu

kalimat = "python itu seru"
teriak = kalimat.upper()
print(teriak)          # PYTHON ITU SERU

# Level 2 — bisik semua: kecil semua, simpan ke variabel lain
bisik = kalimat.lower()
print(bisik)           # python itu seru

# Level 3 — bedah kalimat: kata pertama + 3 huruf terakhir (slicing)
print(kalimat[0:6])    # python — kata pertama
print(kalimat[-3:])    # eru    — 3 huruf terakhir

# Bonus pemantik: spasi dihitung juga!
print(len(" a b"))     # 4 — bukan 3! dua spasi ikut dihitung

# ============================================================
# BAGIAN 5 — split & join, f-string, cek isi (slide 10-12)
# ============================================================
# split = GUNTING (string jadi list) · join = LEM (list jadi string)

kata2 = kalimat.split()
print(kata2)              # ['python', 'itu', 'seru']
print(kata2[0])           # python
print(len(kata2))         # 3 — jumlah kata
print("-".join(kata2))    # python-itu-seru
print(" ".join(kata2))    # python itu seru — kembali seperti semula

# f-string: cara modern merangkai teks + angka tanpa TypeError
nama_anak = "Kevin"
umur = 16
print(f"Halo {nama_anak}, umur {umur}")    # Halo Kevin, umur 16
print(f"Tahun depan: {umur + 1}")          # bisa hitung di dalam {kurung}!

# JEBAKAN (jangan di-run): gabung teks + angka dengan +
# print("Umur: " + umur)   # TypeError! can only concatenate str (not "int") to str
# Solusi: koma print("Umur:", umur), atau f-string di atas.

# cek isi: in / find / count — tiga detektif teks
teks2 = "Halo Kevin, umur 16"
print("Kevin" in teks2)       # True  — ada/tidak?
print(teks2.find("umur"))     # 12    — di posisi berapa?
print(teks2.find("keluar"))   # -1    — tidak ketemu = kode rahasia -1
print(teks2.count("a"))       # 2     — muncul berapa kali?

# JEBAKAN (jangan di-run): cek ada/tidak pakai find di dalam if
# if teks2.find("keluar"):    # -1 dianggap True — JEBAKAN! logika terbalik
#     print("ada")            # ini tercetak padahal "keluar" tidak ada!
# Solusi: untuk cek ada/tidak pakai `in` yang mengembalikan True/False murni:
print("keluar" in teks2)      # False — ini cara yang benar

# ============================================================
# BAGIAN 6 — Tugas 2 + Challenge: perbaiki input user (slide 13-15)
# ============================================================
# Tugas 2 — data kotor jadi rapi (slide 13):

berita = "eksul coding st john buka pendaftaran"
kata_berita = berita.split()
print("Jumlah kata:", len(kata_berita))          # 6
print("Dirangkai ulang:", "-".join(kata_berita)) # eksul-coding-st-john-buka-pendaftaran
print("Ada 'coding'?", "coding" in berita)       # True
print("Posisi 'coding':", berita.find("coding")) # 6
print("Huruf 'a' muncul:", berita.count("a"))    # 4

# CHALLENGE (penilaian sesi ini): program membersihkan nama user.
# User bebas ngetik acak — spasi berlebih, kapital kacau — keluarannya rapi.
# Jalankan file ini, lalu ketik contoh:    budi sanTOso

nama_kotor = input("Masukkan nama: ")
nama_rapi = nama_kotor.strip().title()    # strip dulu BARU title — urutan penting!
print("Nama rapi  :", nama_rapi)          # Budi Santoso
print("Panjang    :", len(nama_rapi))     # 12
print("Huruf kecil:", nama_rapi.lower())  # budi santoso
print("Awalan 'b'?", nama_rapi[0].lower() == "b")   # True

# Bonus untuk yang cepat: cek awalan bisa juga pakai startswith
# print(nama_rapi.startswith("B"))        # True

# ============================================================
# BAGIAN 7 — case kumulatif: format daftar siswa (slide 15)
# ============================================================
# Gabungan challenge + loop Sesi 09: bersihkan banyak nama sekaligus.

nama = ["budi", "ani", "cici"]
for item in nama:
    label = item.strip().title()
    print(f"Siswa: {label}")
# Siswa: Budi
# Siswa: Ani
# Siswa: Cici

# Bukti immutable penutup — label tidak pernah berubah sendiri:
print(label)           # Cici — aslinya tetap
print(label.upper())   # CICI — hanya hasil cetakannya yang kapital
