Najpierw czytasz kod, potem go układasz, a na końcu bronisz specyfikacją
W parze jest programista i haker. Programista pisze program, haker szuka danych, na których ten program zawodzi. Do hakowania nie trzeba znać Pythona — wystarczy wiedzieć, co program powinien wypisać. W rundzie 2 role się odwracają.
| co znalazł haker | punkty dla hakera |
|---|---|
| Crash (program się wysypał) — kończy się czerwonym komunikatem o błędzie | 1 |
| Cicha zła odpowiedź — program coś wypisał i jest to nieprawda | 2 |
| Dane łamią warunek zapisany w specyfikacji programisty | 0 |
| Koperta z podpowiedzią — haker bierze ją od nauczyciela, gdy utknie | −1 |
int to liczba całkowita (7, -4, 0), str to tekst ("7", "abc"). input() zawsze daje str — dlatego "2" + "2" daje "22". Żeby dostać liczbę: int(input()).ValueError), po dwukropku — co poszło nie tak.Oto program z poprzedniej lekcji. Najpierw zapisz, co Twoim zdaniem wypisze. Dopiero potem zobaczysz wynik na rzutniku.
# Dane: liczba całkowita n
# Wynik: napis "parzysta" albo "nieparzysta"
n = int(input("Podaj liczbę całkowitą: "))
if n % 2 == 0:
print("parzysta")
else:
print("nieparzysta")
n % 2 to reszta z dzielenia n przez 2. Idź po kodzie linijka po linijce: co jest w n? ile wynosi n % 2? do którego print trafi program?
| wpisuję | przewiduję | wyszło |
|---|---|---|
4 | ||
7 | ||
0 | ||
-3 | ||
007 |
A ten program? Tu nie ma int.
n = input("n = ")
print(n * 3)
| wpisuję | przewiduję | wyszło |
|---|---|---|
2 |
Linijki programu z zadania 1 się pomieszały. Ułóż je tak, żeby program znowu działał. Plik: rozsypanka_parzystosc.
Jak to zrobić w PyCharmie: w oknie Project prawy przycisk na folderze → New → Python File → wpisz nazwę. Skopiuj kod poniżej i wklej do pliku. Linijkę przesuwasz tak: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓). Uruchamiasz: prawy przycisk w kodzie → Run. Czerwone IndentationError znaczy „jeszcze nie ułożone” — przesuwaj dalej.
# > ROZSYPANKA: linijki programu są pomieszane. Ułóż je w dobrej kolejności.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: prawy przycisk w kodzie → Run. Działa dla 4 i dla 7? Gotowe.
# Dane: liczba całkowita n
# Wynik: napis "parzysta" albo "nieparzysta"
print("nieparzysta")
if n % 2 == 0:
print("parzysta")
n = int(input("Podaj liczbę całkowitą: "))
else:
Działa dla 4 i dla 7? Zaznacz:
★ Trudniejsza wersja — jedna linijka jest tu zbędna i psuje program. Znajdź ją i usuń. Plik: rozsypanka_parzystosc_pulapka.
# > ROZSYPANKA ★: jedna linijka jest zbędna i psuje program. Znajdź ją i usuń.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: prawy przycisk w kodzie → Run. Działa dla 4 i dla 7 i pyta tylko raz? Gotowe.
# Dane: liczba całkowita n
# Wynik: napis "parzysta" albo "nieparzysta"
print("nieparzysta")
n = input("Podaj liczbę całkowitą: ")
if n % 2 == 0:
print("parzysta")
n = int(input("Podaj liczbę całkowitą: "))
else:
Która linijka była zbędna i dlaczego?
Kolega pisze program: dostaje trzy boki a, b, c i mówi, czy trójkąt jest prostokątny. Nie patrz w jego kod. Wymyśl trzy zestawy boków, na których program może się pomylić, i zapisz, co powinien wypisać.
Pomyśl: jaki trójkąt na pewno jest prostokątny (Pitagoras: 3² + 4² = 5²)? A jaki na pewno nie? Czy każde trzy liczby to w ogóle trójkąt?
| a | b | c | co powinien wypisać |
|---|---|---|---|
Program kolegi: Rodzaj: X — crash (1 pkt), C — cicha zła odpowiedź (2 pkt), S — łamie jego specyfikację (0 pkt).
Atak 1 (5 minut)
| dane | program wypisał | powinien wypisać | rodzaj | pkt |
|---|---|---|---|---|
Atak 2 — role odwrócone: atakujesz program, który kolega ułożył w rundzie 2 (3 minuty)
| dane | program wypisał | powinien wypisać | rodzaj | pkt |
|---|---|---|---|---|
Moje punkty jako haker: Punkty kolegi jako haker: Pojedynek wygrał:
Program dostaje długości trzech boków a, b, c (liczby całkowite) i ma powiedzieć, czy trójkąt jest prostokątny. Pitagoras: a² + b² = c². W Pythonie kwadrat to a * a, równość to ==.
Programista (runda 1): napisz trojkat.py sam. Wzoruj się na parzystości z zadania 1.
Uzupełnij specyfikację i warunek w if. Resztę masz gotową.
# Dane: ...
# Warunki na dane: ...
# Wynik: ...
a = int(input("a = "))
b = int(input("b = "))
c = int(input("c = "))
if ____________________:
print("prostokątny")
else:
print("nie jest prostokątny")
Rozsypanka (runda 2): ułóż program z pomieszanych linijek. Plik: rozsypanka_trojkat. Sprawdź: 3 4 5 → prostokątny, 2 3 4 → nie jest prostokątny. Potem uzupełnij specyfikację na górze — to Twoja tarcza przed hakerem.
# > ROZSYPANKA: ułóż linijki programu w dobrej kolejności.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: Run dla 3 4 5 → prostokątny, dla 2 3 4 → nie jest prostokątny.
# > Potem uzupełnij specyfikację — to twoja tarcza przed hakerem.
# Dane: ...
# Warunki na dane: ...
# Wynik: ...
print("nie jest prostokątny")
c = int(input("c = "))
if a * a + b * b == c * c:
a = int(input("a = "))
else:
print("prostokątny")
b = int(input("b = "))
★ Trudniejsza wersja — jeden warunek jest zły. Znajdź go i usuń. Plik: rozsypanka_trojkat_pulapka.
# > ROZSYPANKA ★: jedna linijka jest zbędna — to zły warunek. Znajdź ją i usuń.
# > Przesuwasz linijkę: kliknij w nią i Alt+Shift+↑ / ↓ (Mac: ⌥⇧↑ / ↓).
# > Sprawdzasz: Run dla 3 4 5 → prostokątny, dla 2 3 4 → nie jest prostokątny.
# > Potem uzupełnij specyfikację — to twoja tarcza przed hakerem.
# Dane: ...
# Warunki na dane: ...
# Wynik: ...
print("nie jest prostokątny")
c = int(input("c = "))
if a + b == c:
if a * a + b * b == c * c:
a = int(input("a = "))
else:
print("prostokątny")
b = int(input("b = "))
Specyfikacja — przepisz ją też jako komentarz (#) na górę pliku:
| Dane | Warunki na dane | Wynik |
|---|---|---|
Runda 2 — co wybrałeś?
Program na rzutniku dostaje dwie liczby całkowite i wypisuje TAK albo NIE. Kodu nie widać. Dla 2 i 4 wypisuje TAK. Przepisuj z tablicy kolejne próby:
| a | b | wynik |
|---|---|---|
| 2 | 4 | TAK |
Moja reguła:
Która para obaliła moją pierwszą hipotezę?
Napisz specyfikację (bez kodu) programu, który podaje większą z dwóch liczb. Potem oddaj kartę sąsiadowi — ma 30 sekund na znalezienie dziury.
| Dane | Warunki na dane | Wynik |
|---|---|---|
Dziura znaleziona przez sąsiada: