Zadanie 1. Anagramy

AnagramanagramAnagram to słowo utworzone z innego słowa poprzez przestawienie kolejności liter. Przez słowo rozumiemy tu dowolny ciąg liter alfabetu łacińskiego.

Przykłady anagramów:

  • dla słowa barok – korba, robak, arobk, rokab, orkab...

  • dla słowa ranty – tyran, narty, ntyra, natyr, ytnar...

Plik tekstowy anagram.txt zawiera 200 wierszy. W każdym wierszu znajduje się po pięć słów o długości od 1 do 20 znaków. Słowa oddzielone są znakiem spacji.

R1OdaaT4yCPBQ

Przycisk do pobrania pliku TXT z treścią zadania.

Plik TXT o rozmiarze 6.37 KB w języku polskim
Przykład 1

Przykładowa zawartość pliku:

  • abcd cdba dbac cbad dcba

  • barbakan xle ala foto otof

  • smok ayszkm lampa ayszkm bakara

  • skok arabanta oko agnieba dyskietka

Napisz program, który w pliku anagram.txt wyszuka wszystkie wiersze, w których wszystkie słowa są anagramami pierwszego słowa w danym wierszu, i zapisze je do pliku znalezione.txt.

Do oceny oddajesz:

  • plik znalezione.txt z odpowiedzią (plik tekstowy zawierający wiersze z pliku anagramy.txt, w których wszystkie słowa są anagramami pierwszego słowa z danego wiersza)

  • plik(i) z komputerową realizacją programu.

Zadanie zostało opracowane przez Centralną Komisję Egzaminacyjną i pojawiło się na egzaminie maturalnym z informatyki w maju roku (poziom rozszerzony). Cały arkusz można znaleźć na stronie internetowej CKE.

Przedstaw rozwiązanie zadania w postaci programu w języku C++, Java lub Python.

Rozwiązanie

Rozwiązanie zadania przedstawimy w postaci pseudokodu, ponieważ na egzaminie maturalnym można korzystać z wybranego języka programowania: C++, Java lub Python.

Sprawdzenie, czy wyrazy są anagramami, możemy wykonać przez posortowanie znaków łańcuchów w kolejności alfabetycznej i porównanie wyników — jeżeli będą one takie same, to znaczy, że są anagramami.

Zaczniemy od napisania funkcji sortującej, której użyjemy w głównej części kodu. Przyjmie ona jeden argument będący łańcuchem znaków — czyli słowem, które chcemy posortować. Znaki w łańcuchach, podobnie jak tablice, indeksujemy od zera, tak jak jest to reprezentowane w komputerze. W programie skorzystamy z sortowania przez wybieranie.

Linia 1. funkcja sortowanie otwórz nawias okrągły wyraz zamknij nawias okrągły.

Na początku zadeklarujemy zmienną n, która przyjmie wartość długości sortowanego ciągu znaków. Wartość tę pobierzemy za pomocą funkcji długość(), której implementacja dostępna jest w każdym języku programowania, jaki możemy wybrać na egzaminie maturalnym.

Następnie zapisujemy pętlę, która przeiteruje po wszystkich znakach słowa wyraz.

Linia 1. funkcja sortowanie otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 2. n ← długość otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.

Zainicjujemy teraz zmienną indeks, w której będziemy przechowywać indeks najmniejszego znaku z nieposortowanej części ciągu znaków. Nadamy jej wartość i.

Następnie zastosujemy kolejną pętlę, w której przeiterujemy po wartościach od i + 1 do n - 1. W tej pętli będziemy szukać indeksu najmniejszego znaku z nieposortowanej części tablicy.

Linia 1. funkcja sortowanie otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 2. n ← długość otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 5. indeks ← i. Linia 6. dla j znak równości i plus 1 przecinek i plus 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.

Wewnątrz funkcji porównujemy znaki pod indeksami j oraz indeks. W celu porównywania znaków użyjemy funkcji ascii() zwracającej liczbę odpowiadającą danemu znakowi w kodzie ASCII. Funkcja jest możliwa do zaimplementowania w każdym języku dostępnym na egzaminie maturalnym.

Linia 1. funkcja sortowanie otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 2. n ← długość otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 5. indeks ← i. Linia 6. dla j znak równości i plus 1 przecinek i plus 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 7. jeżeli ascii otwórz nawias okrągły wyraz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny ascii otwórz nawias okrągły wyraz otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias okrągły dwukropek.

Jeżeli znak pod indeksem j jest mniejszy od znaku o indeksie indeks, wówczas zmiennej indeks przypisujemy wartość j.

Po zakończeniu wewnętrznej pętli zamienimy znak wyraz[i] ze znakiem o najmniejszej wartości kodu ASCII z nieposortowanego ciągu znaków, czyli ze znakiem wyraz[indeks].

Linia 1. funkcja sortowanie otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 2. n ← długość otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 5. indeks ← i. Linia 6. dla j znak równości i plus 1 przecinek i plus 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 7. jeżeli ascii otwórz nawias okrągły wyraz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny ascii otwórz nawias okrągły wyraz otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias okrągły dwukropek. Linia 8. indeks ← j. Linia 9. zamień wyraz otwórz nawias kwadratowy i zamknij nawias kwadratowy z wyraz otwórz nawias kwadratowy indeks zamknij nawias kwadratowy.

Po wykonaniu się pętli zewnętrznej funkcja zwróci posortowany łańcuch znaków wyraz.

Linia 1. funkcja sortowanie otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 2. n ← długość otwórz nawias okrągły wyraz zamknij nawias okrągły. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 5. indeks ← i. Linia 6. dla j znak równości i plus 1 przecinek i plus 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 7. jeżeli ascii otwórz nawias okrągły wyraz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny ascii otwórz nawias okrągły wyraz otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias okrągły dwukropek. Linia 8. indeks ← j. Linia 9. zamień wyraz otwórz nawias kwadratowy i zamknij nawias kwadratowy z wyraz otwórz nawias kwadratowy indeks zamknij nawias kwadratowy. Linia 10. zwróć wyraz.

Przejdźmy teraz do właściwej części rozwiązania. Zaczynamy od wczytania danych z pliku.

Linia 1. słowa otwórz nawias kwadratowy 0 kropka kropka kropka 199 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka kropka 4 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów anagramy kropka txt cudzysłów.

Następnie tworzymy pętlę, która przejdzie po wszystkich wierszach. Wewnątrz deklarujemy zmienną anagram, która będzie przechowywać informację, czy wszystkie słowa z wiersza są anagramami. Ustawiamy jej wartość na prawdę. Deklarujemy również zmienną pierwsze przechowującą posortowane pierwsze słowo z wiersza.

Linia 1. słowa otwórz nawias kwadratowy 0 kropka kropka kropka 199 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka kropka 4 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów anagramy kropka txt cudzysłów. Linia 3. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj. Linia 4. anagram ← prawda. Linia 5. pierwsze ← sortowanie otwórz nawias okrągły słowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły.

W kolejnej pętli przechodzimy po wszystkich słowach z wiersza oprócz pierwszego. Jeżeli wynik sortowania danego słowa będzie różny od zmiennej pierwsze, oznacza to, że w wierszu tym na pewno nie występują same anagramy, więc ustawiamy wartość zmiennej anagram na fałsz i przerywamy pętlę.

Linia 1. słowa otwórz nawias kwadratowy 0 kropka kropka kropka 199 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka kropka 4 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów anagramy kropka txt cudzysłów. Linia 3. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj dwukropek. Linia 4. anagram ← prawda. Linia 5. pierwsze ← sortowanie otwórz nawias okrągły słowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 7. dla j znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek 4 wykonuj dwukropek. Linia 8. jeżeli sortowanie otwórz nawias okrągły słowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły wykrzyknik znak równości pierwsze dwukropek. Linia 9. anagram ← fałsz. Linia 10. przerwij pętlę.

Po zakończeniu wewnętrznej pętli sprawdzamy wartość zmiennej anagram. Jeśli jest ona równa prawdzie, przepisujemy cały analizowany wiersz do pliku wynikowego.

Linia 1. słowa otwórz nawias kwadratowy 0 kropka kropka kropka 199 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka kropka 4 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów anagramy kropka txt cudzysłów. Linia 3. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj dwukropek. Linia 4. anagram ← prawda. Linia 5. pierwsze ← sortowanie otwórz nawias okrągły słowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 6. dla j znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek 4 wykonuj dwukropek. Linia 7. jeżeli sortowanie otwórz nawias okrągły słowa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły wykrzyknik znak równości pierwsze dwukropek. Linia 8. anagram ← fałsz. Linia 9. przerwij pętlę. Linia 10. jeżeli anagram znak równości prawda dwukropek. Linia 11. dopisz słowa otwórz nawias kwadratowy i zamknij nawias kwadratowy do pliku cudzysłów znalezione cudzysłów kropka txt.

Schemat oceniania

  • 6 pkt – za poprawną zawartość pliku znalezione.txt zawierającego wszystkie wiersze z anagramami

  • 2 pkt – za zawartość pliku znalezione.txt z jednym błędem (błędny jeden wiersz lub brak jednego wiersza)

  • 0 pkt – za zawartość pliku znalezione.txt z dwoma błędami lub więcej albo brak odpowiedzi

Odpowiedź

Opowiedź do zadania dla danych z pliku anagramy.txt znajduje się w pliku znalezione.txt:

R1XQv0sQxrpav

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik TXT o rozmiarze 229.00 B w języku polskim

Słownik

anagram
anagram

wyraz, wyrażenie lub całe zdanie, które powstało przez przestawienie liter bądź sylab innego wyrazu lub zdania, wykorzystujące wszystkie litery (głoski bądź sylaby) materiału wyjściowego