elemes/docs/07-quiz-authoring.md

103 lines
3.9 KiB
Markdown

# 07. Quiz Authoring (Format Soal Kuis)
Kuis ditulis sebagai Markdown di dalam marker `---QUIZ_FLASHCARD---` sampai `---END_QUIZ_FLASHCARD---`. Setiap blok diawali `###` (heading level 3). Opsi pilihan ganda ditulis sebagai list item dengan tanda kurung: `- [x]` = jawaban benar, `- []` = salah. **Wajib tepat satu `[x]` per soal** — parser menolak soal tanpa jawaban benar atau dengan lebih dari satu.
```
---QUIZ_FLASHCARD---
### Pertanyaan pertama?
- [] Opsi A
- [x] Opsi B (benar)
### Pertanyaan kedua?
...
---END_QUIZ_FLASHCARD---
```
## Dua tipe soal
### 1. Pilihan Ganda (MCQ) — format flat (kompatibel)
Heading langsung diikuti daftar opsi:
```markdown
### Apa output dari `printf("%d", 5 + 5);`?
- [] 55
- [x] 10
- [] 5 + 5
- [] Error
> Penjelasan: Operasi `5 + 5` dihitung terlebih dahulu menjadi `10`.
```
### 2. Pilihan Ganda (MCQ) — format kaya (baru)
Blok Markdown apa pun boleh mendahului daftar opsi: paragraf, code fence, tabel, math (`$...$` / `$$...$$`), bahkan embed (Canva/YouTube/Figma). Seluruh blok tersebut dirender sebagai **lembar soal** di area materi; opsi muncul di **lembar jawaban** (tab kuis). Kode tidak boleh berisi baris yang diawali `- [` (akan terbaca sebagai opsi) — gunakan code fence.
```markdown
### Perhatikan program berikut:
```c
int x = 2;
printf("%d", x * 3);
```
Berapakah keluaran program di atas?
- [] 5
- [] 8
- [x] 6
- [] Error
> Pembahasan: `x * 3` menghasilkan `6`.
```
```markdown
### Berdasarkan tabel berikut, tipe data mana yang tepat untuk menyimpan `3.14`?
| Tipe | Ukuran | Rentang |
|--------|--------|----------------|
| int | 4 byte | -2^31 s/d 2^31-1 |
| double | 8 byte | ~1e-308 s/d ~1e308 |
- [x] double
- [] int
```
```markdown
### Berapakah nilai dari $\int_0^1 2x \, dx$?
- [x] 1
- [] 2
- [] 0.5
```
### 3. Flashcard
Heading diikuti langsung jawaban (tanpa daftar opsi):
```markdown
### Apa fungsi dari `return 0;` di dalam fungsi `main()`?
Menandakan bahwa program telah selesai berjalan dengan sukses tanpa ada error.
```
Selama mengerjakan, murid hanya melihat sisi depan (heading). Sisi belakang ditampilkan di pembahasan setelah kuis selesai.
## Gambar soal
| Cara | Contoh | Hasil |
|------|--------|-------|
| Directive `image:` (baris apa pun di blok soal) | `image: https://.../c.png` atau `image: gambar.png` (relatif → `/assets/`) | Field `image` soal; baris directive dibuang dari prompt |
| Markdown image di body, sebelum opsi (format kaya) | `![C Logo](https://.../c.svg)` | Field `image` soal; markup dihapus dari prompt agar tidak ganda |
| Markdown image di dalam opsi | `- [x] ![C Logo](https://.../c.svg)` | Gambar dirender sebagai bagian teks opsi |
Gambar di heading (`### ... ![alt](url)`) juga diekstrak ke field `image` selama URL-nya http(s) atau `/assets/`.
## Penjelasan / pembahasan
Blockquote `>` di bagian akhir soal (setelah opsi) menjadi field `explanation` dan hanya ditampilkan di pembahasan setelah kuis selesai — murid tidak melihatnya saat mengerjakan.
## Perilaku (wajib dipahami)
- **ID stabil**: soal diberi id `q-0`, `q-1`, ...; opsi `q-0-o-0`, ... sesuai urutan penulisan di file. ID tidak pernah berubah karena urutan tampil diacak.
- **Randomisasi**: saat murid menekan "Mulai Kuis", urutan soal dan urutan opsi diacak **sekali**, lalu dibekukan sampai kuis selesai. Pindah soal / kembali tidak mengacak ulang.
- **Skor**: `benar/total-MCQ` (flashcard tidak masuk penyebut). Soal MCQ yang tidak dijawab saat keluar = salah. Ambang lulus 75%.
- **Submit**: tombol "Selesai Kuis" aktif hanya jika semua soal dijawab/ditandai. Keluar, pindah halaman, atau reload = submit final (penalti).
- **Satu kesempatan**: token `---QUIZ_TOKEN---` menandai kuis sekali jalan; hanya guru yang bisa reset.
- **Feedback**: benar/salah + pembahasan hanya muncul di ringkasan setelah kuis tersimpan. Tidak ada indikator benar/salah selama mengerjakan (jawaban boleh diganti).
## Contoh lengkap
Lihat `content/dasar/quiz_test.md` (atau `examples/content/dasar/quiz_test.md`).