Kilka zadań z Pythona

Autorzy: Piotr Biegański, Julia Jakubowska, Adam Kardasz

1. Wprowadzenie

1.1 Liczby podzielne przez 7

Twoim zadaniem jest wylosowanie N liczb całkowitych z zakresu od 2 do 1000, a następnie podzielenie ich na dwa oddzielne zbiory – na liczby podzielne przez 7 i niepodzielne przez 7. Powstałe tak zbiory posortuj rosnąco i wypisz w konsoli wraz z długością każdego zbioru. Przykładowy wynik działania programu:

Wylosowane liczby dla N = 10:  
[423 633 403 427 785  22 301 595 956  55]

Liczby podzielne przez 7:  
[301, 427, 595], wielkosc zbioru:  3

Liczby niepodzielne przez 7:  
[22, 55, 403, 423, 633, 785, 956], wielkosc zbioru:  7

Wskazówka: skorzystaj z tej funkcji w numpy do losowania liczb całkowitych:

1.2 Dzielniki sumy liczb

Wprowadź dwie dowolne liczby całkowite w konsoli. Następnie wyznacz wszystkie dzielniki ich sumy i wypisz je na ekran, przy czym każdy dzielnik może zostać wypisany tylko raz.

1.3 Kombinacje cyfr

Wprowadź do programu 3 dowolne cyfry (jako 3 oddzielne zmienne). Następnie, napisz program, który ułoży i wypisze wszystkie możliwe liczby, które mogą powstać przy jednokrotnym użyciu podanych cyfr. Przykład:

a = 1, b = 2, c = 4

Mozliwe kombinacje cyfr:
1, 2, 4, 12, 14, 21, 24, 124, 142, 214, 241, 412, 421

1.4 Trójkąt Pascala

Twoim zadaniem jest stworzenie programu, który generuje i wyświetla Trójkąt Pascala dla zadanej liczby wierszy. Trójkąt Pascala jest trójkątną tablicą liczb binarnych, w której na szczycie znajduje się 1, a każda liczba w trójkącie jest sumą dwóch liczb bezpośrednio nad nią.

Specyfikacja

  1. Program powinien zapytać użytkownika o liczbę wierszy n, dla których Trójkąt Pascala ma zostać wygenerowany.

  2. Dla podanej liczby wierszy n, program powinien wygenerować i wyświetlić Trójkąt Pascala.

  3. Liczby w każdym wierszu powinny być rozdzielone spacjami. Trójkąt powinien być wyśrodkowany, tak aby wyglądał jak trójkąt, a nie jak schody.

  4. Program powinien obsługiwać błędy wejścia, takie jak wprowadzenie niepoprawnej liczby.

Przykład

Dla n = 5, Trójkąt Pascala powinien wyglądać następująco:

        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1

Wskazówki

  • Wykorzystaj właściwości kombinatoryczne Trójkąta Pascala.

  • Możesz użyć dwuwymiarowej tablicy do przechowywania wartości trójkąta i wypełnić ją iteracyjnie.

  • Aby trójkąt był wyśrodkowany, liczba spacji przed pierwszą liczbą w każdym wierszu powinna maleć z każdym kolejnym wierszem.

1.5 H4CK3R5P33CH

Specyfikacja

Celem zadania Hackerspeech jest stworzenie programu, który konwertuje podane słowa lub zdania na tzw. hackerspeech, gdzie niektóre litery są zamieniane na cyfry, a pozostałe są zamieniane na wielkie litery.

Przykładowe dane i wyniki

Przykład 1:

Wejście: "white_pony"
Wyjście: "WH173_P0NY"

Przykład 2:

Wejście: "Hackerspeech"
Wyjście: "H4CK3R5P33CH"

Wskazówki

Poniżej znajduje się tabela alfabetu hackerspeech dla ułatwienia implementacji:


Litera     Hackerspeech

   a            4
   e            3
   i            1
   o            0
   s            5
   t            7
   z            2
pozostałe     CAPSLOCK

1.6 Cezar

Specyfikacja

Celem zadania jest stworzenie programu implementującego szyfr Cezara, który używa kodowania ASCII do szyfrowania i deszyfrowania tekstu. Użytkownik podaje dwa parametry: klucz szyfrujący (liczba całkowita) i słowo (ciąg znaków) do zaszyfrowania.

Szyfrowanie

Szyfr Cezara polega na przesunięciu każdej litery w tekście o ustaloną liczbę pozycji w alfabecie. W tej wersji, każdy znak tekstu jest przekształcany na jego kod ASCII, a następnie dodawany jest do niego klucz. Należy uwzględnić cykliczność alfabetu.

Deszyfrowanie

Deszyfrowanie polega na odwróceniu procesu szyfrowania. Użytkownik podaje zaszyfrowany tekst oraz klucz, a program powinien odszyfrować wiadomość, przesuwając każdy znak o wartość klucza w przeciwnym kierunku.

Przykładowe dane i wyniki

#Szyfrowanie

Wejście: Klucz: 3, Słowo: "Hello"
Wyjście: "Khoor"

#Deszyfrowanie
Wejście: Klucz: 3, Zaszyfrowany tekst: "Khoor"
Wyjście: "Hello"

Wskazówki

Poniżej znajdują się wskazówki, które mogą pomóc w implementacji:

  • Użyj funkcji ord() do konwersji znaku na kod ASCII i chr() do konwersji z powrotem na znak.

  • Pamiętaj o obsłudze zarówno wielkich, jak i małych liter.

  • Uwzględnij przypadek, gdy przesunięcie wychodzi poza zakres kodów dla liter, np. po przekroczeniu ‘z’ czy ‘Z’.

1.7 Sortowanie bąbelkowe

Napisz program realizujący algorytm sortowania bąbelkowego (opis problemu znajdziecie tutaj). Następnie przetestuj działanie algorytmu na liście N wylosowanych liczb.

2. Wczytywanie plików .txt

2.1 Średnie BPM – Beats Per Minute

Wczytaj plik bpms.txt, który zawiera tytuły piosenek wraz z ich wskażnikami BPMs. Oblicz średnie BPM wszystkich piosenek, znajdź największe i najmniejsze i wypisz je na ekran wraz z odpowiadającymi im tytułami. Plik znajduje się tutaj.

Wskazówka: liczba BPM zapisana jest jako ostatni “wyraz” po przecinku w każdej linijce dokumentu. Średnią możesz obliczyć używając standardowego wzoru ze statystyki, lub gotowej funkcji w Pythonie. Do przechowywania danych w tym podpunkcie możesz użyć dowolnej struktury danych.

Rozszerzenie zadania: wykonaj powyższe polecenie, ale tytuły piosenek wraz z ich BPMs przechowuj we wspólnej tablicy (obiekt numpy.ndarray z biblioteki numpy) i to na niej oblicz srednią, maksymalną i minimalną wartość wykorzystując gotowe do tego metody.

2.2 Guess Taylor Swift’s song

Twoim zadaniem jest wczytanie do programu pliku tekstowego tf-song.txt. Na podstawie tekstu piosenki wyznacz, jakie wyrazy w niej wystąpiły i ile razy. Znajdź najczęściej występujące wyrazy i na ich podstawie odgadnij, która piosenka Taylor Swift została umieszczona w pliku. Plik znajduje się tutaj.

Wskazówka: Przed rozpoczęciem zliczania zamień wszystkie litery w linijce na lowercase (funkcja lower w Pythonie). Do przechowywania informacji o słowach i częstości ich występowania użyj odpowiedniej struktury danych, np. słownika.

3. Podstawy Numpy

3.1 Co k-ta liczba

Napisz funkcję, która przyjmuje 3 argumenty typu int: N, a_0 i k, a następnie zwraca obiekt numpy.ndarray o wymiarze (N,), który zawiera N liczb poczynając od a_o, przy czym sąsiednie są odległe o k. W swojej implementacji nie używaj pętli ani funkcji bibliotecznych.

Przykład

Dla argumentów N = 5, a_0 = 2, k = 6 wynikiem powinno być [2, 8, 14, 20, 26].

3.2 Mnożenie macierzy

Mając do dyspozycji 2 obiekty numpy.ndarray o wymiarach (N, M) oraz (M, K) napisz funkcję, która wykonuje mnożenie algebraiczne tych macierzy. Nie używaj funkcji bibliotecznej. Informacje o mnożeniu macierzy można znaleźć tutaj.

3.3 Rozwinięcie Laplace’a

Napisz program, który korzystając z rozwinięcia Laplace’a oblicza wyznacznik macierzy wymiaru N \times N. Załóż, że macierz taka jest przechowywana jako numpy.ndarray o wymiarach (N, N), gdzie pierwszy indeks reprezentuje wiersze, a drugi kolumny macierzy. Nie korzystaj z funkcji bibliotecznych liczących wyznacznik. Informacje na temat rozwinięcia Laplace’a można znaleźć tutaj.

3.4 Iloczyn tensorowy

Dla wektorów W, V, takich, że \text{dim}W = N oraz \text{dim}V = M iloczyn tensorowy jest macierzą (N, M), określoną jako (W \otimes V)_{ij} = w_iv_j, gdzie w_i jest i-tą współrzędną wektora W, a v_j j-tą współrzędną wektora V. Napisz funkcję, która na wejściu przyjmuje 2 obiekty numpy.ndarray o wymiarach odpowienio N i M, oraz zwraca ich iloczyn tensorowy jako macierz (N, M). W implementacji nie korzystaj z funkcji bibliotecznych, ani z pętli.

3.5 Iloczyn skalarny (z tensorowego)

Jeśli \text{dim} V = \text{dim}W, to ślad macierzy W \otimes V jest iloczynem skalarnym W z V. Dodaj do swojej implementacji iloczynu tensorowego kod, który sprawia, że jeśli wektory wejściowe mają ten sam wymiar, to dodatkowo zwraca ich iloczyn skalarny (obliczony jako ślad macierzy iloczynu tensorowego). Nie korzystaj przy tym z funkcji bibliotecznych. Ślad macierzy to suma elementów leżących na głównej diagonali.

3.6 Przekształcenie sygnału

Załóż, że na wejściu funkcji podajesz:

  • tablicę T numpy.ndarray o wymiarach (N, M);
  • listę L_1, która zawiera i obiektów numpy.ndarray o wymiarach (N, K_i) lub (K_i, );
  • listę L_2, która zawiera i krotek zawierających obiekty typu int, przy czym każda krotka to (a_i, b_i), oraz M > b_i > a_i > 0.

Program powinien dla każdego elementu l \in L_1, który ma wymiary (N, K_i)

  • Jeśli odpowiadający mu indeksem element L_2 ma parzystą liczbę a_i w krotce, zamienić fragment T leżący pomiędzy a_i a b_i na l (na wszystkich kanałach).
  • Jeśli odpowiadający mu indeksem element L_2 ma nieparzystą liczbę a_i w krotce, zamienić fragment T leżący pomiędzy a_i a b_i na średnią z tego fragmentu oraz l (na wszystkich kanałach).

Program powinien dla każdego elementu l \in L_1, który ma wymiary (K_i, )

  • Jeśli odpowiadający mu indeksem element L_2 ma parzystą liczbę a_i w krotce, zamienić każdy parzysty kanał fragmentu T leżącego pomiędzy a_i a b_i na l.
  • Jeśli odpowiadający mu indeksem element L_2 ma nieparzystą liczbę a_i w krotce, zamienić każdy nieparzysty kanał fragmentu T leżącego pomiędzy a_i a b_i na \sin(l).

Elementy należy rozpatrywać w kolejności, w jakiej pojawiają się na liście (ten sam kawałek T może zostać zmodyfikowany kilkukrotnie).

4. Python w zastosowaniach matematycznych

4.1 Całki prostokątami

Stwórz program w Pythonie, który oblicza przybliżoną wartość całki oznaczonej funkcji \sin(x) na przedziale od 0 do \pi przy użyciu metody prostokątów.

Specyfikacja

  • Podziel przedział całkowania na równomierne prostokąty.

  • Oblicz sumę powierzchni tych prostokątów.

  • Wyświetl na wykresie funkcję oraz narysowane prostokąty.

4.2 Całki trapezami

Napisz program w Pythonie, który oblicza wartość całki oznaczonej funkcji \sin(x) na przedziale od 0 do \pi przy użyciu metody trapezów.

Specyfikacja

  • Podziel przedział całkowania na równomierne trapezy.

  • Oblicz sumę powierzchni tych trapezów.

  • Wyświetl na wykresie funkcję oraz narysowane trapezy.

4.3 Trójkąt Pascala + De moivera

Twoim zadaniem jest stworzenie programu, który dla danej liczby całkowitej n zwraca ogólne wzory dla \sin(n\alpha) i \cos(n\alpha) w oparciu o tożsamości trygonometryczne.

Specyfikacja

  1. Program powinien zapytać użytkownika o wartość n, będącą liczbą całkowitą.

  2. W oparciu o podaną wartość n, program powinien wyznaczyć i zaprezentować ogólne wzory dla \sin(n\alpha) i \cos(n\alpha).

  3. Dla n = 2, na przykład, program powinien zwrócić:

    • \sin(2\alpha) = 2\sin(\alpha)\cos(\alpha)

    • \cos(2\alpha) = \cos^2(\alpha) - \sin^2(\alpha)

  4. Program powinien również obsługiwać inne wartości n i generować odpowiednie wzory.

Przykład działania

Podaj n: 4
Wzór na sin(4x) = 4cos^3(x)sin^1(x) + -4cos^1(x)sin^3(x)
Wzór na cos(4x) = 1cos^4(x)sin^0(x) + -6cos^2(x)sin^2(x) + 1cos^0(x)sin^4(x)

Process finished with exit code 0

Wskazówki

  • Program może wykorzystać znane tożsamości trygonometryczne i metody rekurencyjne lub iteracyjne do generowania wzorów dla dowolnych wartości n.

  • Rozważ zastosowanie wzoru de Moivre’a lub innych znanych tożsamości trygonometrycznych do wyznaczania wzorów.

4.4 Całki punktami

Stwórz program w Pythonie, który oblicza przybliżoną wartość całki oznaczonej funkcji \sin(x) na przedziale od 0 do \pi przy użyciu metody Monte Carlo.

Specyfikacja

  • Użyj losowego próbkowania punktów w przedziale całkowania.

  • Oblicz średnią wartość funkcji w tych punktach.

  • Pomnóż średnią przez długość przedziału całkowania, aby uzyskać przybliżoną wartość całki.

  • Wyświetl na wykresie funkcję i wylosowane punkty.

5. Symulacje fizyczne

5.1 Rzut poziomy

Twoim zadaniem jest stworzenie programu w Pythonie, który symuluje rzut poziomy. Program powinien rysować tor ruchu oraz prędkość od czasu na wykresie na podstawie parametrów podanych przez użytkownika: prędkości wyrzutu, wysokości wyrzucenia oraz przyspieszenia grawitacyjnego. Dodatkowo, jako bonus, stwórz animację ruchu.

Specyfikacja

  1. Użytkownik podaje prędkość początkową, wysokość wyrzucenia i wartość przyspieszenia grawitacyjnego.

  2. Program oblicza tor ruchu i rysuje go na wykresie wraz z wektorami prędkości.

  3. Program tworzy animację ruchu, pokazującą jak obiekt porusza się po torze.

Wprowadzenie do Animacji w Matplotlib

Aby stworzyć animację w Matplotlib, możesz użyć modułu animation. Prosty przykład animacji to sinusoida o zmiennej częstotliwości. Kod do stworzenia takiej animacji może wyglądać następująco:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 200)
line, = ax.plot(x, np.sin(x))

def animate(frame):
    line.set_ydata(np.sin(x + frame / 10))
    return line,

ani = FuncAnimation(fig, animate, frames=100, interval=20)
plt.show()

W tym kodzie, funkcja animate jest wywoływana w każdej klatce animacji, przesuwając sinusoidę w prawo, tworząc efekt ruchu.

5.2 SIR

Symulować rozprzestrzenianie się choroby w populacji za pomocą prostego modelu SIR (podatni – zarażeni – wyleczeni).

Wymagania

  • Utworzyć model SIR z określonymi parametrami transmisji, zdrowienia i populacji.

  • Przeprowadzić symulację na określony czas.

  • Wygenerować wykresy ilustrujące zmiany liczby podatnych, zarażonych i wyleczonych osób w czasie.

Opis

Model SIR to prosty model matematyczny, który opisuje sposób, w jaki choroba może rozprzestrzeniać się w populacji. Składa się on z trzech głównych składników:

  • S (Susceptible): Liczba osób podatnych na zarażenie.

  • I (Infected): Liczba zarażonych osób.

  • R (Recovered): Liczba osób, które wyzdrowiały lub zmarły.

Równania Modelu

Model opiera się na następujących równaniach różniczkowych:

\frac{dS}{dt} = -\beta \frac{SI}{N}

\frac{dI}{dt} = \beta \frac{SI}{N} - \gamma I

\frac{dR}{dt} = \gamma I

gdzie:

  • S reprezentuje liczbę osób podatnych na zarażenie.

  • I to liczba aktualnie zarażonych osób.

  • R to liczba osób, które wyzdrowiały lub zmarły.

  • \beta oznacza współczynnik transmisji choroby.

  • \gamma to współczynnik zdrowienia.

  • N to całkowita liczba populacji, gdzie N = S + I + R.

Przykładowe wyniki

# Parametry modelu
N = 1000          # Populacja
I0 = 1            # Początkowa liczba zarażonych
S0 = N - I0       # Początkowa liczba podatnych
R0 = 0            # Początkowa liczba wyzdrowiałych
beta = 0.3        # Współczynnik transmisji
gamma = 0.1       # Współczynnik zdrowienia

# Czas symulacji
T = 160           # Liczba dni
dt = 1            # Krok czasowy
Nt = int(T/dt)    # Liczba kroków czasowych

English (UK)