Dodanie lab01

This commit is contained in:
Michał Zaręba 2023-10-16 09:54:11 +02:00
parent c56509c098
commit 3d7e684724
1 changed files with 389 additions and 0 deletions

389
lab-01/lab-01.ipynb Normal file
View File

@ -0,0 +1,389 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"# Języki formalne i złożoność obliczeniowa\n",
"## Część 1: Wprowadzenie do Pythona: Listy i Słowniki"
],
"metadata": {
"collapsed": false
},
"id": "f2f83e23-5da0-48a5-a1f8-0e9c1d278054"
},
{
"cell_type": "markdown",
"source": [
"### Listy"
],
"metadata": {
"collapsed": false
},
"id": "76a7aeff-27be-40b8-ab65-5c335bb43ab0"
},
{
"cell_type": "code",
"execution_count": null,
"id": "abedc115-5ac2-41e4-ad54-d3b0204000fc",
"metadata": {},
"outputs": [],
"source": [
"# Definicja listy\n",
"lista = [1, 2, 3, 4, 5]\n",
"\n",
"# Dodawanie elementu na koniec listy\n",
"lista.append(6)\n",
"\n",
"# Usuwanie elementu z listy\n",
"lista.remove(3)\n",
"\n",
"# Wyciąganie i zwracanie ostatniego elementu z listy\n",
"element = lista.pop()\n",
"\n",
"print(lista)\n",
"print(element)"
]
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Prosta funkcja, która zwraca długość ciągu znaków\n",
"def dlugosc_ciagu(s):\n",
" return len(s)\n",
"\n",
"# Testowanie funkcji\n",
"print(dlugosc_ciagu(\"Hello\")) # Powinno zwrócić 5"
],
"metadata": {
"collapsed": false
},
"id": "28253e73f0cf6cdf"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Funkcja, która sprawdza, czy dany ciąg znaków kończy się na danym sufiksie\n",
"def konczy_sie_na(s, sufiks):\n",
" return s.endswith(sufiks)\n",
"\n",
"# Testowanie funkcji\n",
"print(konczy_sie_na(\"Automat\", \"mat\")) # Powinno zwrócić True\n",
"print(konczy_sie_na(\"Automat\", \"tom\")) # Powinno zwrócić False"
],
"metadata": {
"collapsed": false
},
"id": "76669dd5fdc80ae3"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"lista = [\"a\", \"b\", \"c\"]\n",
"for indeks, wartość in enumerate(lista):\n",
" print(indeks, wartość)"
],
"metadata": {
"collapsed": false
},
"id": "76ab87d1fada40b4"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"lista1 = [1, 2, 3]\n",
"lista2 = [\"a\", \"b\", \"c\"]\n",
"for liczba, litera in zip(lista1, lista2):\n",
" print(liczba, litera)"
],
"metadata": {
"collapsed": false
},
"id": "5f02c815b173da71"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"kwadraty = [x**2 for x in range(10)]\n",
"print(kwadraty)"
],
"metadata": {
"collapsed": false
},
"id": "c5dd20abbdf5436"
},
{
"cell_type": "markdown",
"source": [
"#### Zadanie 1: \n",
"Stwórz listę `alfabet`, która będzie zawierać litery alfabetu od 'a' do 'z'. Następnie stwórz listę `stany`, która będzie zawierać stany automatu w postaci \"q0\", \"q1\", ..., \"q25\". Wykorzystaj pętlę for oraz funkcję `range()` do generowania listy `stany`. Wykorzystaj `list comprehension` \n"
],
"metadata": {
"collapsed": false
},
"id": "ab397b83e524d8c0"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
"id": "e2ea41507ffa87cf"
},
{
"cell_type": "markdown",
"source": [
"### Słowniki\n",
"\n",
"Słowniki w Pythonie to nieuporządkowane kolekcje par klucz-wartość. Klucze w słowniku muszą być unikalne."
],
"metadata": {
"collapsed": false
},
"id": "1e5ec4e26f0c50f7"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"# Definicja słownika\n",
"slownik = {\n",
" \"klucz1\": \"wartość1\",\n",
" \"klucz2\": \"wartość2\",\n",
" \"klucz3\": \"wartość3\"\n",
"}\n",
"\n",
"# Dodawanie nowej pary klucz-wartość\n",
"slownik[\"klucz4\"] = \"wartość4\"\n",
"\n",
"# Usuwanie pary klucz-wartość\n",
"del slownik[\"klucz2\"]\n",
"\n",
"print(slownik)"
],
"metadata": {
"collapsed": false
},
"id": "f9c9f57242145098"
},
{
"cell_type": "markdown",
"source": [
"#### Zadanie 2: \n",
"Stwórz słownik `delta`, który będzie reprezentować funkcję przejścia dla automatu rozpoznającego ciągi nad alfabetem {a, b}, które kończą się na \"ab\". Słownik powinien mieć postać:\n",
"\n"
],
"metadata": {
"collapsed": false
},
"id": "6f0f5a0585b51651"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"delta = {}"
],
"metadata": {
"collapsed": false
},
"id": "3d6214e7ae9fcb1e"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"def akceptuje(delta, ciag, stan_poczatkowy='q0', stan_akceptujacy='q2'):\n",
" stan = stan_poczatkowy\n",
" for symbol in ciag:\n",
" stan = delta[stan][symbol]\n",
" return stan == stan_akceptujacy\n",
"\n",
"# Przykładowy input i output\n",
"input1 = \"aabb\"\n",
"output1 = akceptuje(delta, input1)\n",
"print(f\"Ciąg '{input1}' jest akceptowany: {output1}\") # False, bo kończy się na \"bb\"\n",
"\n",
"input2 = \"aaabaaa\"\n",
"output2 = akceptuje(delta, input2)\n",
"print(f\"Ciąg '{input2}' jest akceptowany: {output2}\") # False, bo kończy się na \"aa\"\n",
"\n",
"input3 = \"ab\"\n",
"output3 = akceptuje(delta, input3)\n",
"print(f\"Ciąg '{input3}' jest akceptowany: {output3}\") # True, bo to dokładnie ciąg \"ab\"\n"
],
"metadata": {
"collapsed": false
},
"id": "f8abadaa6bf0e2f6"
},
{
"cell_type": "markdown",
"source": [
"## Część 2: Implementacja DFA w Pythonie"
],
"metadata": {
"collapsed": false
},
"id": "392d7fbc05a6eb53"
},
{
"cell_type": "markdown",
"source": [
"## Definicja DFA\n",
"\n",
"DFA to piątka (Q, Σ, δ, q_0, F), gdzie:\n",
"\n",
"- Q to zbiór stanów\n",
"- Σ to alfabet wejściowy\n",
"- δ to funkcja przejścia\n",
"- q_0 to stan początkowy\n",
"- F to zbiór stanów akceptujących\n"
],
"metadata": {
"collapsed": false
},
"id": "5fa20c2c91c62833"
},
{
"cell_type": "code",
"execution_count": 11,
"outputs": [],
"source": [
"class DFA:\n",
" def __init__(self, Q, Sigma, delta, q0, F):\n",
" self.Q = Q\n",
" self.Sigma = Sigma\n",
" self.delta = delta\n",
" self.q0 = q0\n",
" self.F = F\n",
"\n",
" def akceptuje(self, string):\n",
" stan = self.q0\n",
" for symbol in string:\n",
" stan = self.delta[stan][symbol]\n",
" return stan in self.F"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-10-15T15:25:55.448167Z",
"start_time": "2023-10-15T15:25:55.437Z"
}
},
"id": "7832429ab35cf033"
},
{
"cell_type": "markdown",
"source": [
"#### Zadanie 3: Zaimplementuj automat, który akceptuje ciągi nad alfabetem {a,b}, które mają parzystą liczbę liter a."
],
"metadata": {
"collapsed": false
},
"id": "6e469ff8ae2db729"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"Q1 = {}\n",
"Sigma1 = {}\n",
"delta1 = {\n",
" 'q0': {'a': '', 'b': ''},\n",
" 'q1': {'a': '', 'b': ''}\n",
"}\n",
"q01 = ''\n",
"F1 = {''}\n",
"\n",
"dfa1 = DFA(Q1, Sigma1, delta1, q01, F1)\n",
"print(dfa1.akceptuje(\"abab\")) # True\n",
"print(dfa1.akceptuje(\"aba\")) # True\n",
"print(dfa1.akceptuje(\"aaab\")) # False"
],
"metadata": {
"collapsed": false
},
"id": "df161735ce34418d"
},
{
"cell_type": "markdown",
"source": [
"### Zadanie domowe:\n",
"\n",
"#### Zadanie 1 (5 pkt):\n",
"Zaimplementuj automat deterministyczny, który akceptuje ciągi nad alfabetem {0,1} (liczby binarne), które są podzielne przez 2.\n",
"#### Zadanie 2 (5 pkt):\n",
"Automat rozpoznający ciągi z dokładnie trzema literami 'a'\n",
"Zaimplementuj automat, który akceptuje ciągi nad alfabetem {a,b}, które zawierają dokładnie trzy litery 'a'.\n",
"\n",
"Rozwiązania zadań należy wysłać na adres email: **miczar1@amu.edu.pl** z tytułem: **[DJFZ][NrIndeksu] Zadanie domowe Zajęcia 1**. Jako załącznik należy wysłać dwa pliki .py (zadanie1.py, zadanie2.py) z rozwiązaniem. Skrpyty na wejściu mają przyjmować plik tekstowy `in.txt` i mają zwracać True/False dla każdego wiersza w pliku a następnie zapisać rezultaty do pliku `out.txt`. Przykładowe wywołanie skryptu: `python zadanie1.py in.txt`.\n",
"\n",
"## Termin wysłania zadań: 27.10.2023 godzina 23:59\n",
"## Przykładowy plik in.txt:\n",
"```\n",
"aaba\n",
"aabaa\n",
"abab\n",
"aaa\n",
"```\n",
"## Przykładowy plik out.txt:\n",
"```\n",
"True\n",
"False\n",
"False\n",
"True\n",
"```"
],
"metadata": {
"collapsed": false
},
"id": "347ede9e88ff27d0"
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"collapsed": false
},
"id": "e93220c2185b827b"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}