Namuna testdan o‘tdi. Nega yana Wrong Answer? 🤔
Masalani o‘qidingiz. G‘oya keldi. Kodni yozdingiz.
Birinchi namuna — to‘g‘ri. Ikkinchisi ham — to‘g‘ri.
«Bo‘ldi, bu aniq Accepted!»
Submit tugmasini bosasiz:
Wrong Answer on test 3.
Kodni qayta ochasiz. Hammasi joyida ko‘rinadi. Hatto judge’dan shubhalanishni boshlaysiz. 🙂
Competitive programming bilan shug‘ullangan bo‘lsangiz, bu holat sizga tanish bo‘lishi mumkin. Lekin aynan shu yerda qiziq savol tug‘iladi: biz kodimizni tekshiryapmizmi yoki uning to‘g‘riligiga o‘zimizni ishontiryapmizmi?
Miyamiz ham o‘z kodiga yon bosadi
Biror yechimni o‘ylab topganimizdan keyin unga mos misollarni tanlash oson.
«Mana, bunda ishladi. Bunisida ham ishladi!»
Ammo algoritm bir nechta qulay misolda ishlagani uchun to‘g‘ri bo‘lib qolmaydi. Uni xato qiladigan bitta ruxsat etilgan holatning o‘zi yetarli.
Masalan, quyidagi masalani tasavvur qiling:
Berilgan qiymatdagi pulni eng kam miqdordagi tangalar bilan yig‘ish kerak. Har bir turdagi tangadan cheksiz foydalanish mumkin.
Birinchi fikr: har safar qolgan summadan oshmaydigan eng katta tangani olamiz.
Tanga qiymatlari 1, 3 va 4 bo‘lsin.
5 uchun usul ishlaydi: 4 + 1, jami 2 ta tanga.
8 uchun ham ishlaydi: 4 + 4, jami 2 ta tanga.
Endi 6 ni tekshiring.
Bizning usul: 4 + 1 + 1 — 3 ta tanga.
Yaxshiroq yechim esa: 3 + 3 — 2 ta tanga.
Kod xatosiz yozilgan bo‘lishi mumkin. Xato — g‘oyaning o‘zida. Bunday paytda int ni long long ga almashtirish yordam bermaydi.
Kod yozishdan oldin o‘z g‘oyangizga qarshi o‘ynang
Yechim topdingizmi? Darhol klaviaturaga yopishishdan oldin quyidagilarni so‘rang:
- Nega bu usul barcha ruxsat etilgan holatlarda ishlaydi?
- Men qaysi taxminni isbotsiz qabul qildim?
- Shu taxminni buzadigan eng kichik misol qanday?
Ayniqsa, greedy yechimlarda «eng kattasini olamiz», «eng kichigidan boshlaymiz», «saralab chiqamiz» degan fikrlardan keyin «nega?» savoli kelishi kerak.
Oson ko‘ringan g‘oya ham isbot talab qiladi.
Yaxshi test kodga noqulay savol beradi
Tasodifiy bir nechta son yozish bilan cheklanib qolmang. Masala shartiga mos bo‘lsa, quyidagi holatlarni tekshiring:
- Faqat bitta element.
- Barcha elementlar bir xil.
- O‘suvchi va kamayuvchi tartib.
- Nol va manfiy qiymatlar.
- Takrorlanuvchi elementlar.
- Javob birinchi yoki oxirgi elementga bog‘liq holat.
- Eng katta ruxsat etilgan qiymatlar.
Masalan, «massivning eng katta elementini topish» masalasida boshlang‘ich javobni 0 deb olsangiz, musbat sonli testlar o‘tadi. Ammo [-8,-3,-11] massivi xatoni darrov ochib beradi: javob -3 bo‘lishi kerak.
Kichkina test. Katta saboq.
Sekin yechim ham foydali qurol
Optimal algoritmga ishonchingiz komil emasmi? Kichik ma’lumotlarda ishlaydigan, to‘g‘riligini tekshirish oson bo‘lgan sodda yechim yozing.
Keyin:
- Kichik testlar yarating.
- Har birini sodda va tezkor yechimga bering.
- Javoblarni solishtiring.
- Farq chiqsa, o‘sha testni tahlil qiling.
Bu usul stress testing deb ataladi. Etalon yechimning o‘zi ham to‘g‘ri bo‘lishi kerak, albatta. Testlarda javoblar mos chiqishi matematik isbot o‘rnini bosmaydi, ammo xatoni topishda juda qo‘l keladi.
Ba’zan yuz qator kodga tikilib o‘tirgandan ko‘ra, uchta sondan iborat qarshi misol ko‘proq narsani tushuntiradi.
Keyingi submit oldidan bitta odat
O‘zingizdan faqat «Qaysi testda ishlaydi?» deb so‘ramang.
«Qaysi testda yiqilishi mumkin?» deb ham so‘rang.
Shu savol sizni kod yozayotgan odamdan o‘z yechimini asoslay oladigan masala yechuvchiga aylantirishga yordam beradi.
Accepted kelganda esa yana bir savol qolsin: «Nega ishlaganini tushuntirib bera olamanmi?»
💬 Sizdagi eng esda qolarli Wrong Answer nimadan chiqqan? Noto‘g‘ri g‘oyami, overflow’mi yoki bitta <= o‘rniga yozilgan < belgisimidi?
