Mengenal Soal OSN · Pelajaran 2 dari 10
Soal logika dan analitika
9 menit baca · BelajarCode
Soal logika OSN biasanya memberikan beberapa pernyataan lalu meminta kesimpulan. Teknik paling andal adalah analisis kasus: coba setiap kemungkinan, lalu buang yang bertentangan dengan pernyataan.
Contoh 1: siapa yang jujur?
Ada tiga siswa: Andi, Budi, dan Cici. Salah satu dari mereka mengambil spidol kelas.
- Andi berkata: "Budi yang mengambil."
- Budi berkata: "Bukan aku."
- Cici berkata: "Bukan aku."
Diketahui hanya satu yang berkata jujur. Siapa yang mengambil spidol?
| Jika pelakunya | Andi jujur? | Budi jujur? | Cici jujur? | Banyak yang jujur |
|---|---|---|---|---|
| Andi | Tidak | Ya | Ya | 2 |
| Budi | Ya | Tidak | Ya | 2 |
| Cici | Tidak | Ya | Tidak | 1 |
Hanya kasus "Cici pelakunya" yang membuat tepat satu orang jujur. Jawabannya Cici.
Kalau ragu dengan jawabanmu, cara berpikir yang sama bisa diperiksa dengan program:
1siswa = ["Andi", "Budi", "Cici"]2for pelaku in siswa:3 pernyataan = [4 pelaku == "Budi",5 pelaku != "Budi",6 pelaku != "Cici",7 ]8 if sum(pernyataan) == 1:9 print("Pelakunya:", pelaku)Pelakunya: Cici
sum pada list berisi True dan False menghitung banyaknya True, karena True bernilai 1.
Contoh 2: urutan antrean
Lima siswa, yaitu Andi, Budi, Cici, Dodi, dan Euis, mengantre di kantin.
- Budi tepat di belakang Andi.
- Cici tidak berada di ujung antrean.
- Dodi di depan Euis.
- Euis bukan yang paling belakang.
- Andi bukan yang paling depan.
- Cici bersebelahan dengan Dodi.
Mulailah dari syarat yang paling mengikat: pasangan Andi dan Budi (syarat 1) hanya bisa di posisi 2 dan 3, 3 dan 4, atau 4 dan 5.
- Andi 2, Budi 3: sisa posisi 1, 4, 5. Cici harus di 4 (syarat 2), Dodi di 1 dan Euis di 5. Melanggar syarat 4.
- Andi 3, Budi 4: sisa posisi 1, 2, 5. Cici harus di 2, Dodi di 1 dan Euis di 5. Melanggar syarat 4.
- Andi 4, Budi 5: sisa posisi 1, 2, 3. Jika Cici di 3, Dodi di 1 dan Euis di 2, tetapi Cici tidak bersebelahan dengan Dodi. Jadi Cici di 2, Dodi di 1, Euis di 3.
Jawabannya: Dodi, Cici, Euis, Andi, Budi.
1from itertools import permutations23nama = ["Andi", "Budi", "Cici", "Dodi", "Euis"]4for urutan in permutations(nama):5 pos = {n: i + 1 for i, n in enumerate(urutan)}6 if (pos["Budi"] == pos["Andi"] + 17 and pos["Cici"] not in (1, 5)8 and pos["Dodi"] < pos["Euis"]9 and pos["Euis"] != 510 and pos["Andi"] != 111 and abs(pos["Cici"] - pos["Dodi"]) == 1):12 print(urutan)('Dodi', 'Cici', 'Euis', 'Andi', 'Budi')permutations mencoba semua 120 susunan antrean. Program hanya mencetak susunan yang memenuhi keenam syarat, dan ternyata hanya ada satu.
Strategi umum
Tulis semua syarat dengan simbol singkat, mulai dari syarat yang paling membatasi, lalu buat tabel kemungkinan. Saat lomba tanpa komputer, cara manual ini yang kamu pakai. Programnya berguna untuk memeriksa saat berlatih.
Cek pemahaman
Ada empat kemungkinan jawaban dan kamu sudah membuktikan tiga di antaranya bertentangan dengan soal. Apa kesimpulannya?
Latihan
Kotak berlabel salah
Ada tiga kotak berlabel "Apel", "Jeruk", dan "Campur". Semua label salah. Kamu boleh mengambil satu buah dari satu kotak tanpa melihat isinya. Dari kotak mana kamu harus mengambil supaya bisa menentukan isi ketiga kotak?
Pembahasan
Ambil dari kotak berlabel "Campur". Karena labelnya salah, kotak itu pasti berisi hanya apel atau hanya jeruk.
- Jika yang terambil apel, kotak "Campur" berisi apel. Kotak berlabel "Jeruk" tidak mungkin berisi jeruk (labelnya salah) dan bukan apel (sudah dipakai), jadi berisi campuran. Kotak berlabel "Apel" berisi jeruk.
- Jika yang terambil jeruk, dengan cara yang sama: "Campur" berisi jeruk, "Apel" berisi campuran, dan "Jeruk" berisi apel.
Kotak "Campur" dipilih karena hanya kotak itulah yang isinya pasti satu jenis, sehingga satu buah cukup untuk mengetahui seluruh isinya.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.