Autor rozwiązania: Maciej Muras

Zadanie można znaleźć pod adresem: https://cke.gov.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2014/informatyka_PR_2_A1.pdf

Plik do zadania: NAPIS

Treść zadania:

Zadanie 5. Ciekawe napisy
W pliku NAPIS.TXT, w oddzielnych wierszach, znajduje się 1 000 napisów o długościach
od 2 do 25 znaków. Każdy napis składa się z wielkich liter alfabetu łacińskiego.
Wykorzystując dostępne narzędzia informatyczne, daj odpowiedzi do poniższych
podpunktów. Odpowiedzi zapisz w kolejnych wierszach pliku ZADANIE5.TXT, a każdą
poprzedź literą oznaczającą ten podpunkt.
a) Napis pierwszy to taki napis, w którym suma kodów ASCII jest liczbą pierwszą.
Przykładowo, suma kodów ASCII w napisie ABB wynosi 197 i jest liczbą pierwszą,
co oznacza, że napis ABB jest napisem pierwszym. Podaj, ile jest napisów pierwszych
w pliku NAPIS.TXT.
b) Napis rosnący to taki napis, w którym kod ASCII każdej kolejnej litery jest większy
od kodu poprzedniej. Podaj wszystkie napisy rosnące występujące w pliku NAPIS.TXT.
c) Wypisz napisy z pliku NAPIS.TXT, które występują w nim więcej niż jeden raz (każdy
taki napis wypisz tylko raz).

package com.company;
import java.util.Arrays;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args ) throws FileNotFoundException{
// ----------------------------------------- zadanie 5.a -----------------------------------------
        boolean liczbyPierwsze[]= new boolean[6401]; //25 znaków * 256
        Arrays.fill(liczbyPierwsze, true);
        liczbyPierwsze[0] = false;
        liczbyPierwsze[1] = false;
        for (int i = 2; i < 80; i++) { //pętla wyznacza liczby pierwsze metodą sita Eratostenesa
            if (liczbyPierwsze[i]) {
                for (int j = 2*i; j <= 6400; j +=i) {
                    liczbyPierwsze[j] = false;
                }
            }
        }
        Scanner odczyt = new Scanner(new File ("napis.txt"));
        String wiersz;
        char[] tablicaChar;
        int suma, iloscNapisowPierwszych=0, iloscNapisowRosnacych=0;
        boolean napisRosnacy=true;
        List<String> listaNapisow = new ArrayList<>();
        Set<String> listaNapisowPowtarzajacychSie = new TreeSet<>();
        System.out.println("5.a) Lista napisów rosnących:");
        while(odczyt.hasNextLine())
        {
            wiersz=odczyt.nextLine();
            tablicaChar=wiersz.toCharArray();
            suma=0;
            for(char literka:tablicaChar) {
                suma+=(int)literka;
            }
            if(liczbyPierwsze[suma]) iloscNapisowPierwszych++;
// ----------------------------------------- zadanie 5.b -----------------------------------------
            napisRosnacy=true;
            for(int a=1; a<tablicaChar.length;a++) {
                if((int)tablicaChar[a]<(int)tablicaChar[a-1]) {
                    napisRosnacy=false;
                    break;
                }
            }
            if(napisRosnacy) System.out.println(wiersz);
// ----------------------------------------- zadanie 5.c -----------------------------------------
            if (listaNapisow.contains(wiersz)) listaNapisowPowtarzajacychSie.add(wiersz);
// jeśli w liście jest już wiersz (czyli mam wiersz powtarzający się) to wrzuć go do kolekcji set (dlatego set by wykluczyć sytuacje gdy wiersz powtarza się więcej niż dwa razy)
            listaNapisow.add(wiersz);
// dodaj wiersz do ArrayList
        }
        odczyt.close();
        System.out.println("5.b) Ilość napisów pierwszych to: "+iloscNapisowPierwszych);
        System.out.println("5.c) Lista napisów powtarzjących się"+listaNapisowPowtarzajacychSie);
    }
}