forked from miczar1/DJFZ-2023
Dodanie lab01
This commit is contained in:
parent
c56509c098
commit
3d7e684724
389
lab-01/lab-01.ipynb
Normal file
389
lab-01/lab-01.ipynb
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user