Dydaktyka:
Feedback
Do zaliczenia przedmiotu każda osoba musi napisać dwa wybrane przez siebie
skrypty i wysłać je mailem do 09.06. Proszę o wpisanie [SO]
na początku
tematu maila.
Poniżej lista tematów skryptów. Do listy tematów mogę dopisać inne – proszę
o propozycje mailem.
Temat 1 Generowanie miniaturek
Skrypt przyjmuje jako argument listę katalogów.
Skrypt generuje dla każdego obrazu znajdującego się bezpośrednio w podanych
katalogach miniaturę o określonym rozmiarze i umieszcza ją w podkatalogu tn
w katalogu w którym znajduje się obraz. Miniaturkom ustawia czasy modyfikacji,
zmiany i dostępu na identyczne jak odpowiednie czasy obrazu.
Skrypt wypisuje na ekranie nazwę każdego przetwarzanego obrazu.
W zadaniu zaleca się skorzystać z programu file
do wykrywania typu MIME
i programu convert
(wchodzącego w skład pakiety narzędzi imagemagick) do
generowania miniatur.
Temat 2 Ściąganie obrazków ze strony
Skrypt przyjmuje jako argument listę adresów URL do stron www.
Skrypt pobiera wskazane strony i wyciąga z nich adresy obrazów (przez obraz
należy rozumieć tag <img …
z argumentem src
). Następnie skrypt ściąga
wszystkie obrazy z nazwami nie istniejącymi w bieżącym katalogu. Skrypt ściąga
obrazy równolegle, ale z określoną górną ilością współbieżnych pobierań.
Skrypt wypisuje na ekranie każdy znaleziony na stronie obraz i wypisuje czy
istnieje w bieżącym katalogu czy będzie pobrany oraz wypisuje komunikat o
zakończniu pobierania każdego obrazu.
W zadaniu zaleca się skorzystać z programu wget
lub curl
do pobierania
plików z sieci.
Temat 3 Testowanie programu z kombinacjami parametrów
Skrypt do testowania programu przyjmującego dwa parametry. Skrypt ma uruchamiać
podany program z wszystkimi podanymi kombinacjami dla dwóch parametrów biorąc
możliwe wartości parametrów z odpowiednich list.
Standardowe wejście1) każdego uruchomienia ma trafić do katalogu z nazwą testowanego programu
i datą uruchomienia skryptu do pliku z nazwą jednoznacznie identyfikują
kombinację parametrów. Pliki mają być następnie skompresowane.
Skrypt nie przyjmuje argumentów, ale w pierwszych kilku liniach należy umieścić
zmienne pozwalające ustawić uruchamiane polecenie i zakresy parametrów.
Skrypt na standardowe wyjście ma wypisywać, przed uruchomieniem każdego testu,
informacje o testowanej kombinacji i bieżący czas.
Wybór testowanego programu dowolny. Przykładowy program który można testować to
np. program fio
do testu wydajności dysków; przykładowe wykonanie w Bashu to:
fio <(echo -e "[foo] \n time_based \n runtime=1s \n filename=/tmp/testFile \n filesize=10M \n ioengine=posixaio \n readwrite=randrw \n rwmixread=10 \n blocksize=4k")
Parametry do zmiany to np. rozmiar bloku i procent odczytów.
Temat 4 Przygotowywanie i uruchomienie testu na zdalnej maszynie
Skrypt ma utworzyć tymczasowy katalog w którym umieści pliki z listy (lista
czytana z pliku lub konfigurowalna na początku skryptu). Następnie skrypt ma
przygotować plik konfiguracyjny i umieszczając w nim wartości podane jako
argumenty skryptu. Następnie pliki mają być skopiowane do maszyny zdalnej (adres
maszyny ma być ustawialny w zmiennej na początku skryptu) i na zdalnej maszynie
ma zostać uruchomiony wskazany program (też ustawialny w zmiennej na początku
skryptu). Standardowe wyjście i standardowy błąd uruchomionego programu mają
trafić do pliku z nazwą programu i bieżącą datą.
Wybór testowanego programu i format pliku konfiguracyjnego dowolny. Przykładowy
program który można testować i format pliku konfiguracyjnego można wziąć z
poprzedniego tematu.
Temat 5 Rekurencyjne wyszukiwanie tekstu w katalogach
Skrypt przyjmuje jako pierwszy argument wyszukiwany tekst, jako kolejne listę
katalogów.
Skrypt wyszukuje w plikach w podanych katalogach (rekurencyjnie) podanego tekstu.
Dla plików pdf skrypt wyszukuje w tekście (pdftotext
), dla plików
skompresowanych z rozszerzeniem .gz
/.bz2
/.xz
… używa odpowiednio
zgrep
/bzgrep
/xzgrep
…, dla plików .zip
oraz dokumentów MS Office
(np. .docx
) i Open Document Format (np. .odt
) wyszukuje w wynikach
unzip -c
, dla pozostałych plików używa zwykłego grep
.
Skrypt ma wypisywać na standardowe wyjście nazwę pliku w którym znajduje się
szukany tekst.
Skrypt ma nie wyświetlać komunikatów o braku dostępu do plików.
Temat 6 Kopie zapasowe z wykorzystaniem rsync
Skrypt ma wykonywać kopię zapasową katalogów z listy (umieszczonej w osobnym
pliku).
Kopie zapasowe mają trafiać do określonego (w zmiennej na początku
skryptu) katalogu na zdalnej maszynie. Każdorazowe uruchomienie skryptu ma
tworzyć katalog z datą uruchomienia skryptu do którego trafiają zmienione od
ostatniego uruchomienia skryptu pliki. Po wykonaniu kopii skrypt ma stworzyć
plik z listą plików usuniętych od ostatniego uruchomienia skryptu, plik z listą
zmienionych plików oraz plik z listą nowych plików, pod nazwami składającymi się
z daty uruchomienia skryptu oraz przyrostków .del
, .mod
i .new
.
W trakcie działania skrypt ma wypisywać co robi.
W skrypcie należy użyć programu rsync
z opcjami --backup
i --backup-dir
(oraz zaleca się skorzystać z programów find
i comm
).
Temat 7 Porządkowanie zdjęć
Skrypt przyjmuje jako pierwszy argument katalog docelowy, a jako kolejne listę
katalogów źródłowych.
Skrypt ma porządkować katalog ze zdjęciami. Ma przenieść każdy plik z katalogów
źródłowych (rekurencyjnie) do podkatalogu rok/miesiąc/dzień
w katalogu
docelowym i zmienić plikom nazwy na godzina_minuta_sekunda__stara_nazwa
.
Jako datę skrypt ma brać dane EXIF (CreateDate, DateTimeOriginal) lub datę
modyfikacji pliku jeśli plik nie ma danych EXIF.
Jeśli dwa pliki z katalogów źródłowych mają tę samą nazwę i daty, skrypt ma
dodawać na koniec nazwy (przed rozszerzenie) kolejne numery tak żeby nie
stracić żadnego pliku.
W trackie pracy skrypt ma wypisywać linię plik źródłowy --> plik docelowy
W zadaniu zaleca się skorzystać z programu exiftool
.
Temat 8 Konfiguracja powłoki
Przygotuj plik .bashrc
który dla sesji interaktywnej ustawia kilka
użytecznych aliasów, ustawi ładny prompt, zmieni długość historii, doda
dodatkowe katalogi do zmiennej PATH, utworzy przynajmniej jedną użyteczną
funkcję (np. tworzącą katalog i wchodzącą do niego) i wyświetli coś na ekranie
(np. bieżącą zajętość dysków, fortunkę).
Temat 9 Porównanie metod kompresji
Skrypt przyjmuje jeden argument – nazwę pliku.
Skrypt kompresuje podany plik używając przynajmniej programów gzip
,
bzip2
, xz
izstd
z przynajmniej trzema ustawieniami (profilami) dla
każdego z tych programów (np. domyślne ustawienia, najwyższy poziom kompresji,
średni poziom kompresji i użycie wielu wątków). Skrypt mierzy czas kompresji
i rozmiar skompresowanych plików.
Na ekran wyświetlane są tabele czasu kompresji i poziomu kompresji mające
w kolumnach nazwy programów a w wierszach profile.
Temat 10 Wyszukiwanie identycznych plików
Skrypt przyjmuje jako argument listę katalogów.
Skrypt przeszukuje rekurencyjnie podane katalogi w poszukiwaniu identycznych
plików. Najpierw grupuje znalezione pliki rozmiarami, następnie w każdej grupie
w której jest więcej niż jeden plik liczy sumy md5 każdego pliku. Jeśli dwa lub
więcej plików ma tę samą sumę md5, porównuje je dla pewności programem cmp
.
Skrypt wypisuje na standardowe wyjście grupy identycznych plików (każda nazwa w
osobnej linii) oddzielone od siebie pustą linią.
Temat 11 Sprawdzanie czy program generuje poprawny wynik
Skrypt przyjmuje jako argument nazwę polecenia.
Skrypt z pliku (o nazwie ustawionej jako zmienna na początku skryptu) czyta
kolejno ścieżki do pliku z poprawnymi wynikami oraz listę argumentów z którymi
takie wyniki powinny zostać otrzymane.
Dla każdego takiego pliku skrypt uruchamia podane polecenie z odpowiadającymi
argumentami i porównuje wynik polecenia z oczekiwanym.
Skrypt wyświetla na standardowym wyjściu kolejne nazwy plików z oczekiwanymi
wynikami i jeśli testowany program wygenerował poprawne wyniki, to dodaje słowo
pass
, a jeśli nie, dodaje na czerwono słowo FAIL
i wypisuje pierwszą
różniącą się linię.
Temat 12 Histogram odpowiedzi w pytaniach z kolokwium.
Skrypt przyjmuje jako argument ścieżkę do pliku z wynikami kolokwium.
Przykładowy plik wejściowy zamieszczony jest poniżej. Fragment Q14[A+,D-]
oznacza, że w pytaniu 14 zaznaczono poprawną odpowiedź A i błędną D.
Skrypt dla każdego pytania liczy ile razy padła dana odpowiedź, następnie
wypisuje nazwę pytania i dla każdej odpowiedzi wypisuje linię składającą się
z odpowiedniej litery i znaku =
powtórzonego tyle razy ile ta odpowiedź
została zaznaczona. Linie z poprawnymi odpowiedziami mają być wypisane kolorem
zielonym, z błędnymi kolorem czerwonym.
Przykładowy plik wejściowy
07.16.52:8.6:17:Q6[A+](1);Q85[A+](1);Q83[E-](0);Q80[D+](1);Q58[E+](1);Q26[D-](0);Q61[D-](0);Q4[B+,A+](1);Q77[A+](1);Q69[B+](1);Q31[F+](1);Q94[A+](1);Q28[A+](1);Q57[D-,C-](0);Q70[D-,B+](0.5);Q23[A+](1);Q16[C-](0);Q89[C-](0);Q48[A+](1);Q20[D-](0);Q46[E-,B+](0.5);Q67[C+](1);Q40[B+,A+](1);Q12[A+](1);Q54[C-](0);Q39[A+](1) 07.18.23:10.1:19.5:Q79[D+](1);Q73[D+](1);Q29[A+](1);Q55[D+](1);Q84[E-](0);Q18[A+](1);Q91[A+](1);Q60[D+](1);Q5[A+](1);Q3[A+,B+](1);Q22[B-](0);Q44[A+,B-](0.5);Q50[B+](1);Q37[E-](0);Q40[A+,B+](1);Q63[C+](1);Q70[B+,A+](1);Q26[D-](0);Q66[B+](1);Q15[D-](0);Q35[C+](1);Q51[A+](1);Q81[B+,A+](1);Q89[A+](1);Q69[E-](0);Q12[A+](1) 07.19.14:10.8:17:Q59[C+](1);Q32[A+](1);Q13[A+](1);Q41[B-](0);Q69[B+](1);Q27[C-](0);Q85[A+](1);Q23[A+](1);Q47[F-,B+](0.5);Q7[D-](0);Q65[G-,E+](0.5);Q3[B+,A+](1);Q57[C-,A+](0.5);Q80[D+](1);Q48[A+](1);Q53[A-](0);Q20[B-](0);Q89[A+](1);Q62[B+](1);Q12[A+](1);Q81[H-,B+](0.5);Q77[A+](1);Q91[A+](1);Q30[A+](1);Q37[C-](0);Q71[E-](0) 07.20.12:12:16.5:Q54[E-](0);Q84[A+](1);Q10[F-](0);Q25[D-](0);Q39[A+](1);Q74[E-](0);Q72[A+](1);Q43[A+,E-](0.5);Q63[C+](1);Q4[B+,A+](1);Q55[D+](1);Q29[A+](1);Q49[E+](1);Q60[D+](1);Q16[A+](1);Q87[A+](1);Q7[D-](0);Q22[B-](0);Q68[B+](1);Q79[D+](1);Q34[D-](0);Q83[E-](0);Q40[A+,B+](1);Q20[D-](0);Q90[A+](1);Q64[C+,E+](1) 07.22.06:13.7:19:Q62[B+](1);Q80[D+](1);Q68[B+](1);Q10[B+](1);Q56[E+](1);Q72[A+](1);Q26[D-](0);Q33[E-,D+](0.5);Q42[A+](1);Q89[A+](1);Q67[C+](1);Q7[D-](0);Q86[B-](0);Q82[A+,D-](0.5);Q16[A+](1);Q17[A+](1);Q38[B-](0);Q59[C+](1);Q29[A+](1);Q54[D-](0);Q91[A+](1);Q49[E+](1);Q22[B-](0);Q43[A+,D+](1);Q73[D+](1);Q1[F+,A+](1) 07.23.10:14.9:24:Q91[A+](1);Q68[B+](1);Q60[D+](1);Q1[F+,A+](1);Q48[A+](1);Q17[A+](1);Q6[A+](1);Q39[A+](1);Q80[D+](1);Q88[A+](1);Q30[A+](1);Q84[A+](1);Q45[D+,B+](1);Q57[A+,C-](0.5);Q63[C+](1);Q27[B+](1);Q65[B+,A-](0.5);Q72[C-](0);Q83[A+](1);Q53[B+](1);Q16[A+](1);Q11[A+](1);Q32[A+](1);Q73[D+](1);Q22[A+](1);Q41[A+](1) 07.23.33:15.2:21:Q39[A+](1);Q40[B+,A+](1);Q79[D+](1);Q68[B+](1);Q60[D+](1);Q62[B+](1);Q50[B+](1);Q43[D+,A+](1);Q19[D-](0);Q9[A+](1);Q3[B+,A+](1);Q33[D+,B+](1);Q74[D+](1);Q88[A+](1);Q29[A+](1);Q91[A+](1);Q8[A+](1);Q64[C+,E+](1);Q56[E+](1);Q27[C-](0);Q81[B+,A+](1);Q84[B-](0);Q23[A+](1);Q72[C-](0);Q14[B+,A+](1);Q53[A-](0) 07.24.54:16.7:23.5:Q75[A+](1);Q63[C+](1);Q80[D+](1);Q72[A+](1);Q25[A+](1);Q85[A+](1);Q6[A+](1);Q55[D+](1);Q67[C+](1);Q82[C-,A+](0.5);Q34[A+](1);Q69[B+](1);Q3[A+,B+](1);Q89[A+](1);Q60[D+](1);Q21[A+](1);Q50[B+](1);Q42[A+](1);Q12[A+](1);Q18[A+](1);Q37[A-](0);Q29[A+](1);Q51[A+](1);Q47[B+,D+](1);Q91[A+](1);Q16[C-](0) 07.25.14:16.9:19:Q9[A+](1);Q71[A+](1);Q82[C-,A+](0.5);Q59[C+](1);Q63[C+](1);Q49[E+](1);Q26[D-](0);Q8[C-](0);Q15[C-,D-](0);Q3[B+,A+](1);Q87[A+](1);Q40[B+,A+](1);Q18[A+](1);Q44[A+,E-](0.5);Q28[A+](1);Q22[A+](1);Q66[A-](0);Q55[D+](1);Q79[D+](1);Q92[A+](1);Q39[A+](1);Q68[B+](1);Q85[A+](1);Q34[A+](1);Q51[B-](0);Q73[C-](0) 07.25.28:17.2:20.5:Q90[A+](1);Q38[C-](0);Q53[A-](0);Q87[A+](1);Q50[B+](1);Q62[B+](1);Q27[A-](0);Q7[C-](0);Q73[D+](1);Q59[C+](1);Q18[A+](1);Q1[F+,A+](1);Q78[D+](1);Q42[A+](1);Q72[A+](1);Q23[A+](1);Q56[E+](1);Q43[A+,D+](1);Q35[C+](1);Q69[B+](1);Q10[B+](1);Q14[C-,D-](0);Q85[A+](1);Q64[E+,F-](0.5);Q82[B+,A+](1);Q29[A+](1) 07.25.47:17.4:20:Q63[C+](1);Q93[B-](0);Q70[B+,D-](0.5);Q85[A+](1);Q74[E-](0);Q87[D-](0);Q53[A-](0);Q50[B+](1);Q34[A+](1);Q18[A+](1);Q80[D+](1);Q5[A+](1);Q81[A+,B+](1);Q67[C+](1);Q23[A+](1);Q14[A+,D-](0.5);Q55[D+](1);Q42[A+](1);Q27[A-](0);Q28[A+](1);Q1[F+,A+](1);Q60[D+](1);Q10[B+](1);Q37[B+](1);Q68[B+](1);Q47[D+,B+](1) 07.30.21:22.1:16.5:Q69[B+](1);Q57[C-,B+](0.5);Q23[A+](1);Q33[D+,B+](1);Q83[E-](0);Q9[A+](1);Q30[A+](1);Q27[B+](1);Q8[C-](0);Q18[A+](1);Q78[D+](1);Q38[C-](0);Q14[D-,A+](0.5);Q87[A+](1);Q85[A+](1);Q76[D-](0);Q48[A+](1);Q1[A+,F+](1);Q67[C+](1);Q52[C-](0);Q42[A+](1);Q62[B+](1);Q93[D-](0);Q43[E-,A+](0.5);Q71[D-](0);Q59[B-](0) 07.31.09:22.9:17.5:Q42[B-](0);Q60[D+](1);Q33[B+,D+](1);Q84[A+](1);Q21[E-](0);Q79[D+](1);Q17[A+](1);Q14[C-,D-](0);Q61[C-](0);Q82[D-,A+](0.5);Q6[A+](1);Q88[A+](1);Q56[C-](0);Q9[A+](1);Q51[A+](1);Q73[D+](1);Q48[A+](1);Q44[C+,A+](1);Q70[B+,A+](1);Q68[B+](1);Q26[D-](0);Q29[C-](0);Q39[A+](1);Q1[A+,F+](1);Q94[D-](0);Q65[B+,E+](1) 07.31.24:23.1:25:Q16[A+](1);Q62[B+](1);Q11[A+](1);Q58[E+](1);Q94[A+](1);Q45[B+,D+](1);Q23[A+](1);Q80[D+](1);Q87[A+](1);Q30[A+](1);Q49[E+](1);Q57[A+,B+](1);Q1[A+,F+](1);Q41[A+](1);Q76[A+](1);Q6[A+](1);Q82[A+,B+](1);Q27[C-](0);Q32[A+](1);Q64[E+,C+](1);Q38[A+](1);Q70[A+,B+](1);Q84[A+](1);Q69[B+](1);Q20[A+](1);Q54[B+](1) 09.02.43:7.2:20.5:Q78[D+](1);Q91[A+](1);Q20[D-](0);Q52[B+](1);Q4[B+,A+](1);Q71[E-](0);Q31[F+](1);Q28[A+](1);Q49[E+](1);Q58[A-](0);Q9[A+](1);Q25[B-](0);Q61[A+](1);Q5[A+](1);Q76[A+](1);Q89[A+](1);Q66[B+](1);Q81[B+,A+](1);Q86[A+](1);Q41[A+](1);Q23[A+](1);Q69[B+](1);Q46[B+,A-](0.5);Q14[D-,C-](0);Q57[A+,B+](1);Q38[A+](1) 09.04.59:9.5:12.5:Q87[A+](1);Q46[C-,A-](0);Q41[E-](0);Q28[A+](1);Q54[C-](0);Q12[A+](1);Q49[E+](1);Q20[D-](0);Q8[B-](0);Q83[E-](0);Q72[A+](1);Q57[B+,D-](0.5);Q64[E+,C+](1);Q69[A-](0);Q86[C-](0);Q16[A+](1);Q4[B+,A+](1);Q25[D-](0);Q63[C+](1);Q74[E-](0);Q38[B-](0);Q21[E-](0);Q80[D+](1);Q91[A+](1);Q58[B-](0);Q33[D+,B+](1) 09.05.50:10.2:15:Q1[B-,F+](0.5);Q42[A+](1);Q33[F-,B+](0.5);Q38[D-](0);Q30[A+](1);Q50[E-](0);Q20[D-](0);Q23[A+](1);Q11[A+](1);Q61[A+](1);Q67[C+](1);Q44[B-,D-](0);Q86[A+](1);Q68[B+](1);Q72[A+](1);Q56[E+](1);Q6[A+](1);Q81[E-,H-](0);Q60[D+](1);Q88[A+](1);Q76[D-](0);Q16[B-](0);Q90[A+](1);Q52[C-](0);Q78[C-](0);Q26[B-](0) 09.06.11:10.6:20:Q94[D-](0);Q6[A+](1);Q89[A+](1);Q21[A+](1);Q53[A-](0);Q10[F-](0);Q70[C-,B+](0.5);Q27[C-](0);Q69[B+](1);Q15[D-,B+](0.5);Q34[B-](0);Q37[B+](1);Q61[A+](1);Q42[A+](1);Q79[D+](1);Q49[E+](1);Q29[A+](1);Q81[B+,A+](1);Q43[D+,A+](1);Q60[D+](1);Q55[D+](1);Q18[A+](1);Q64[C+,E+](1);Q77[A+](1);Q4[A+,B+](1);Q84[A+](1) 09.06.12:10.7:16:Q34[E-](0);Q72[B-](0);Q29[C-](0);Q85[A+](1);Q94[A+](1);Q24[A+](1);Q67[C+](1);Q49[E+](1);Q88[A+](1);Q39[A+](1);Q17[B-](0);Q68[B+](1);Q1[A+,F+](1);Q57[F-,B+](0.5);Q61[D-](0);Q8[A+](1);Q22[B-](0);Q81[B+,A+](1);Q14[D-,C-](0);Q52[B+](1);Q40[B+,F-](0.5);Q60[D+](1);Q79[D+](1);Q73[B-](0);Q46[A-,E-](0);Q12[A+](1) 09.07.17:11.8:15:Q72[A+](1);Q19[D-](0);Q48[A+](1);Q21[E-](0);Q3[A+,B+](1);Q46[D+,A-](0.5);Q54[D-](0);Q15[D-,B+](0.5);Q64[D-,C+](0.5);Q80[D+](1);Q36[D+](1);Q10[F-](0);Q61[A+](1);Q92[A+](1);Q27[A-](0);Q8[](0);Q81[G-,B+](0.5);Q59[C+](1);Q57[A+,B+](1);Q29[A+](1);Q35[C+](1);Q89[D-](0);Q41[B-](0);Q75[D-](0);Q85[A+](1);Q69[B+](1) 09.07.36:12.1:18.5:Q49[E+](1);Q83[E-](0);Q6[A+](1);Q37[B+](1);Q85[A+](1);Q61[A+](1);Q78[D+](1);Q87[A+](1);Q9[B-](0);Q35[C+](1);Q41[D-](0);Q16[B-](0);Q73[C-](0);Q53[A-](0);Q24[A+](1);Q23[A+](1);Q60[D+](1);Q66[B+](1);Q55[D+](1);Q71[A+](1);Q46[B+,F-](0.5);Q91[A+](1);Q28[A+](1);Q19[D-](0);Q4[B+,A+](1);Q69[B+](1) 09.11.55:16.4:14:Q29[A+](1);Q9[F-](0);Q1[F+,A+](1);Q78[B-](0);Q71[D-](0);Q58[A-](0);Q73[C-](0);Q18[A+](1);Q91[A+](1);Q41[A+](1);Q48[A+](1);Q6[A+](1);Q13[A+](1);Q87[D-](0);Q54[D-](0);Q24[B-](0);Q36[D+](1);Q32[A+](1);Q45[D+,B+](1);Q82[D-,A+](0.5);Q65[E+,F-](0.5);Q61[D-](0);Q84[E-](0);Q55[D+](1);Q21[E-](0);Q68[B+](1) 09.13.46:18.2:22:Q57[A+,B+](1);Q30[A+](1);Q37[B+](1);Q1[A+,F+](1);Q58[A-](0);Q10[B+](1);Q82[B+,A+](1);Q51[C-](0);Q41[A+](1);Q34[A+](1);Q69[B+](1);Q86[A+](1);Q88[C-](0);Q13[A+](1);Q7[A+](1);Q23[A+](1);Q61[A+](1);Q78[D+](1);Q72[A+](1);Q24[A+](1);Q43[D+,A+](1);Q67[C+](1);Q90[A+](1);Q48[A+](1);Q75[A+](1);Q19[D-](0) 09.15.25:19.8:19.5:Q49[A-](0);Q66[B+](1);Q82[A+,E-](0.5);Q90[A+](1);Q56[F-](0);Q6[A+](1);Q11[D-](0);Q40[B+,A+](1);Q68[B+](1);Q16[A+](1);Q77[A+](1);Q25[A+](1);Q89[B-](0);Q4[B+,A+](1);Q78[D+](1);Q32[A+](1);Q85[A+](1);Q70[B+,A+](1);Q22[B-](0);Q17[A+](1);Q60[F-](0);Q53[B+](1);Q30[A+](1);Q61[A+](1);Q37[B+](1);Q43[A+,D+](1) 09.17.13:21.7:19.5:Q43[B-,D+](0.5);Q42[A+](1);Q7[C-](0);Q54[D-](0);Q60[F-](0);Q79[D+](1);Q88[A+](1);Q48[A+](1);Q56[E+](1);Q9[A+](1);Q29[B-](0);Q64[D-,C+](0.5);Q69[B+](1);Q25[A+](1);Q21[A+](1);Q85[A+](1);Q33[D+,B+](1);Q81[B+,A+](1);Q94[A+](1);Q3[B+,A+](1);Q17[A+](1);Q70[A+,B+](1);Q37[B+](1);Q15[D-,B+](0.5);Q76[C-](0);Q61[A+](1) 09.18.56:23.3:20.5:Q9[A+](1);Q81[A+,B+](1);Q21[E-](0);Q4[B+,A+](1);Q84[A+](1);Q71[A+](1);Q69[B+](1);Q33[E-,D+](0.5);Q90[A+](1);Q66[B+](1);Q51[B-](0);Q39[A+](1);Q48[A+](1);Q80[D+](1);Q55[D+](1);Q44[A+,C+](1);Q18[A+](1);Q76[A+](1);Q62[B+](1);Q27[D-](0);Q58[A-](0);Q41[A+](1);Q88[A+](1);Q30[A+](1);Q6[A+](1);Q15[D-,C-](0) 09.20.33:24.9:15.5:Q78[D+](1);Q58[A-](0);Q35[C+](1);Q30[D-](0);Q37[A-](0);Q54[B+](1);Q5[C-](0);Q21[A+](1);Q25[C-](0);Q66[B+](1);Q20[A+](1);Q48[A+](1);Q63[B-](0);Q87[A+](1);Q12[A+](1);Q42[B-](0);Q86[C-](0);Q73[B-](0);Q57[B+,D-](0.5);Q83[D-](0);Q2[A+,E+](1);Q13[A+](1);Q44[C+,A+](1);Q91[A+](1);Q68[B+](1);Q72[A+](1) 12.48.03:14.4:18:Q16[B-](0);Q63[C+](1);Q77[D-](0);Q59[C+](1);Q57[B+,A+](1);Q2[A+,E+](1);Q6[A+](1);Q22[B-](0);Q50[A-](0);Q80[B-](0);Q41[A+](1);Q53[B+](1);Q91[A+](1);Q85[A+](1);Q29[A+](1);Q46[D+,B+](1);Q31[F+](1);Q11[A+](1);Q67[C+](1);Q89[A+](1);Q83[B-](0);Q20[A+](1);Q72[B-](0);Q26[D-](0);Q39[A+](1);Q69[B+](1) 12.53.22:19.7:12:Q6[B-](0);Q9[A+](1);Q19[D-](0);Q80[B-](0);Q73[A-](0);Q23[A+](1);Q48[A+](1);Q71[A+](1);Q34[D-](0);Q67[C+](1);Q28[B-](0);Q89[B-](0);Q81[B+,A+](1);Q63[A-](0);Q26[B-](0);Q37[C-](0);Q15[D-,C-](0);Q55[D+](1);Q54[B+](1);Q69[B+](1);Q93[D-](0);Q43[A+,D+](1);Q60[F-](0);Q4[A+,B+](1);Q86[C-](0);Q42[A+](1) 12.53.36:20.5:14:Q19[A+](1);Q77[A+](1);Q55[A-](0);Q45[D+,A-](0.5);Q36[D+](1);Q94[A+](1);Q85[A+](1);Q78[D+](1);Q48[A+](1);Q4[A+,B+](1);Q83[D-](0);Q61[E-](0);Q53[A-](0);Q5[A+](1);Q29[C-](0);Q41[C-](0);Q72[B-](0);Q58[A-](0);Q68[B+](1);Q31[F+](1);Q25[A+](1);Q11[C-](0);Q13[B-](0);Q65[B+,F-](0.5);Q88[A+](1);Q21[E-](0) 12.54.10:20.5:16.5:Q29[D-](0);Q68[B+](1);Q50[E-](0);Q45[A-,D+](0.5);Q62[B+](1);Q25[D-](0);Q66[B+](1);Q55[D+](1);Q6[A+](1);Q53[A-](0);Q31[F+](1);Q70[A+,B+](1);Q19[D-](0);Q21[A+](1);Q83[C-](0);Q13[A+](1);Q88[A+](1);Q73[B-](0);Q39[A+](1);Q60[D+](1);Q79[D+](1);Q42[A+](1);Q1[F+,A+](1);Q86[C-](0);Q90[A+](1);Q11[D-](0) 12.55.36:22.1:19.5:Q68[B+](1);Q85[A+](1);Q24[A+](1);Q72[A+](1);Q23[A+](1);Q18[A+](1);Q48[A+](1);Q53[A-](0);Q80[D+](1);Q30[A+](1);Q59[C+](1);Q12[A+](1);Q13[A+](1);Q4[A+,B+](1);Q61[A+](1);Q36[D+](1);Q56[C-](0);Q40[B+,A+](1);Q83[C-](0);Q87[D-](0);Q35[A-](0);Q92[A+](1);Q47[B+](0.5);Q67[C+](1);Q75[E-](0);Q5[A+](1) 12.55.36:22.1:17.5:Q34[E-](0);Q60[D+](1);Q72[C-](0);Q78[D+](1);Q18[A+](1);Q49[E+](1);Q93[C-](0);Q2[E+,A+](1);Q40[B+,A+](1);Q44[A+,D-](0.5);Q25[A+](1);Q84[A+](1);Q61[B-](0);Q57[A+,B+](1);Q7[B-](0);Q67[C+](1);Q77[A+](1);Q38[B-](0);Q83[E-](0);Q89[A+](1);Q28[A+](1);Q23[A+](1);Q69[B+](1);Q54[B+](1);Q15[B+,A+](1);Q11[D-](0) 12.55.42:20.7:15.5:Q55[D+](1);Q25[B-](0);Q82[E-,A+](0.5);Q38[B-](0);Q59[B-](0);Q80[C-](0);Q91[A+](1);Q42[A+](1);Q45[B+,E-](0.5);Q12[B-](0);Q72[B-](0);Q31[F+](1);Q53[A-](0);Q84[A+](1);Q62[B+](1);Q3[A+,B+](1);Q23[A+](1);Q88[A+](1);Q48[A+](1);Q76[A+](1);Q30[C-](0);Q68[B+](1);Q65[E+,F-](0.5);Q6[B-](0);Q16[A+](1);Q19[A+](1) 12.56.24:22.7:13:Q65[B+,F-](0.5);Q7[D-](0);Q85[A+](1);Q29[A+](1);Q27[C-](0);Q38[B-](0);Q62[C-](0);Q4[B+,A+](1);Q59[B-](0);Q53[A-](0);Q56[C-](0);Q49[E+](1);Q77[A+](1);Q32[A+](1);Q93[C-](0);Q72[E-](0);Q89[A+](1);Q47[C-,B+](0.5);Q16[A+](1);Q69[B+](1);Q20[C-](0);Q12[A+](1);Q79[D+](1);Q42[A+](1);Q83[C-](0);Q23[B-](0) 12.57.35:23.8:19.5:Q29[A+](1);Q70[B+,A+](1);Q79[D+](1);Q16[A+](1);Q23[A+](1);Q41[B-](0);Q48[A+](1);Q77[A+](1);Q60[C-](0);Q31[D-](0);Q53[A-](0);Q12[A+](1);Q18[A+](1);Q68[B+](1);Q82[A+,E-](0.5);Q93[A+](1);Q45[B+,D+](1);Q1[A+,F+](1);Q62[B+](1);Q67[C+](1);Q8[A+](1);Q56[B-](0);Q38[A+](1);Q89[A+](1);Q85[A+](1);Q26[B-](0) 12.57.45:24.1:17:Q31[F+](1);Q8[C-](0);Q9[A+](1);Q49[E+](1);Q62[B+](1);Q28[A+](1);Q40[C-,F-](0);Q43[A+,D+](1);Q57[B+,A+](1);Q79[D+](1);Q22[A+](1);Q26[B-](0);Q39[A+](1);Q71[E-](0);Q75[A+](1);Q93[D-](0);Q17[D-](0);Q3[B+,A+](1);Q83[C-](0);Q52[B+](1);Q69[B+](1);Q14[D-,C-](0);Q86[A+](1);Q89[A+](1);Q64[E+,C+](1);Q60[C-](0) 12.57.51:24.3:22:Q54[B+](1);Q76[A+](1);Q2[A+,E+](1);Q38[A+](1);Q12[A+](1);Q57[A+,B+](1);Q72[D-](0);Q5[A+](1);Q68[B+](1);Q49[E+](1);Q60[D+](1);Q33[E-,D+](0.5);Q30[C-](0);Q87[E-](0);Q94[A+](1);Q41[A+](1);Q62[B+](1);Q19[A+](1);Q64[E+,C+](1);Q23[A+](1);Q79[D+](1);Q25[A+](1);Q82[A+,B+](1);Q13[A+](1);Q46[A-,B+](0.5);Q84[A+](1) 12.58.05:24.6:17:Q17[A+](1);Q36[D+](1);Q9[A+](1);Q85[A+](1);Q30[D-](0);Q52[C-](0);Q26[C-](0);Q8[C-](0);Q73[D+](1);Q22[B-](0);Q67[C+](1);Q45[C-,B+](0.5);Q49[E+](1);Q42[A+](1);Q16[A+](1);Q62[B+](1);Q34[A+](1);Q88[C-](0);Q72[B-](0);Q56[C-](0);Q78[D+](1);Q69[B+](1);Q59[C+](1);Q1[A+,F+](1);Q82[E-,A+](0.5);Q91[A+](1) 12.58.40:25.2:11:Q2[E+,A+](1);Q63[A-](0);Q82[B+,C-](0.5);Q20[B-](0);Q14[C-,D-](0);Q86[A+](1);Q38[A+](1);Q11[C-](0);Q22[E-](0);Q78[A-](0);Q90[A+](1);Q43[D+,A+](1);Q30[C-](0);Q87[E-](0);Q52[C-](0);Q72[B-](0);Q64[B-,E+](0.5);Q32[A+](1);Q41[A+](1);Q75[A+](1);Q56[D-](0);Q8[C-](0);Q48[A+](1);Q58[A-](0);Q27[D-](0);Q69[B+](1) 13.01.07:27.4:15.5:Q89[C-](0);Q90[A+](1);Q9[D-](0);Q7[D-](0);Q80[D+](1);Q18[A+](1);Q36[F-](0);Q4[B+,A+](1);Q33[F-,B+](0.5);Q54[C-](0);Q59[C+](1);Q24[A+](1);Q30[A+](1);Q83[B-](0);Q13[A+](1);Q69[B+](1);Q74[B-](0);Q64[E+,C+](1);Q47[B+,D+](1);Q63[C+](1);Q48[A+](1);Q41[C-](0);Q84[A+](1);Q72[A+](1);Q57[C-,F-](0);Q22[B-](0)
Temat 13 Przypomnienie o najbliższych urodzinach.
Skrypt korzysta z pliku w którym znajdują się cykliczne wydarzenia – daty i opisy
(format pliku dowolny, przykład formatu: 12.31 imieniny Sylwestra
).
Skrypt wyświetla wszystkie linie z pliku które dotyczą najbliższych dwóch tygodni,
lub jeśli w przeciągu dwóch tygodni nie ma żadnych wydarzeń, wyświetla trzy
najbliższe wydarzenia.
Temat 14 Wordle.
Skrypt losuje pięcioliterowe słowo ze słownika. Następnie, w pętli, odczytuje
ze standardowego wejścia pięcioliterowe słowo i wyświetla je z powrotem na
ekran, kolorując: 1) litery znajdujące się na tej samej pozycji w obu słowach w
jeden sposób, 2) pozostałe litery znajdujące się w obu słowach w drugi sposób,
3) litery występujące tylko w jednym słowie w trzeci. Jeśli słowa są identyczne,
wyświetlany jest komunikat o wygranej i skrypt się kończy.
Po szóstym niezgadnięciu słowa wyświetlane jest szukane słowo i komunikat o
przegranej.