Autor: Maciej Muras

Zadanie znajduje się pod adresem: https://cke.gov.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2017/formula_do_2014/informatyka/MIN-R2_1P-172.pdf
Opis:
Zadanie 4. Ciągi binarne
W pliku binarne.txt znajduje się 500 napisów złożonych wyłącznie z zer i jedynek.
W każdym wierszu umieszczony jest jeden napis. Każdy napis ma długość podzielną przez 4.
Napisz program (lub programy), który da odpowiedzi do poniższych zadań. Odpowiedzi
zapisz w pliku zadanie4.txt, każdą odpowiedź poprzedź numerem odpowiedniego
zadania.
Zadanie 4.1 (0-4)
Napis nazywać będziemy dwucyklicznym, jeśli składa się on wyłącznie z dwóch powtórzeń tego
samego napisu.
Przykład:
Napis 10001000 jest dwucykliczny (składa się z dwóch powtórzeń napisu 1000), natomiast
napisy 00011000 i 10001001 nie są dwucykliczne.
Podaj liczbę napisów dwucyklicznych w pliku binarne.txt, najdłuższy napis
dwucykliczny z tego pliku oraz jego długość.
Zadanie 4.2 (0-2)
Napisy z pliku binarne.txt traktujemy jako binarne zapisy liczb dziesiętnych, w których
każdy segment złożony z 4 znaków jest reprezentacją binarnego zapisu jednej cyfry (zapis taki
nazywany jest kodem BCD).
Napis uznajemy za niepoprawny, gdy któryś z segmentów ma wartość większą niż 9 (czyli nie
jest zapisem cyfry dziesiętnej).
Przykład:
Napis 10010111 jest poprawny i reprezentuje liczbę 97, natomiast napis 11010000 nie jest
poprawny, gdyż jego pierwszy segment (1101) reprezentuje w zapisie binarnym większą od 9
liczbę 13. Podobnie nie jest poprawny napis 1110, ponieważ reprezentuje w zapisie binarnym
liczbę 14.
Podaj liczbę niepoprawnych napisów z pliku binarne.txt oraz najmniejszą długość
niepoprawnego napisu.
 
Egzamin maturalny z informatyki
Poziom rozszerzony
Strona 3 z 8
MIN_1R
Zadanie 4.3 (0-4)
Napisy z pliku binarne.txt traktujemy teraz jako liczby naturalne w zwykłym zapisie
binarnym, pomijamy jednak liczby większe niż 65 535. Wyznacz największą spośród tych
liczb, podaj jej wartość w zapisie binarnym oraz w zapisie dziesiętnym.
Przykład:
W pliku o zawartości:
1111000011110000
11110000111100001000
10100110
druga liczba jest pomijana (jako większa od 65 535), zatem największą liczbę wybieramy
spośród 1111000011110000(2)=61680(10) oraz 10100110(2)=166(10). Odpowiedzią
jest zatem para 1111000011110000, 61680. 

package com.company;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.io.*;
import java.math.BigInteger;
public class Main {
    public static void main(String[] args) throws FileNotFoundException{
        String wiersz = "", pierwszyCykl, drugiCykl, najdluzszyNapisDCText="",substringBCD, najwieksza="";
        String tablicaBCD[];
        int liczbaNiepoprawnych=0, liczbaNiepoprawnychB=0,liczbaDec=0,najwiekszaDec=0;
        int liczbaNapisowDwucyklicznych=0, najdluzszyNapisDwucykliczny=0,najkrotszaNiepoprawna=999999999;
        BigInteger najwiekszaBig =new BigInteger("11001101110",2); //pierwszy wiersz z pliku binarne.txt [trzeba
        // pamiętać o tym by dać ,2 !!! - błąd trudny do znalezienia
        BigInteger liczbaBig =new BigInteger("0");
        Scanner odczyt = new Scanner(new File ("binarne.txt" ));
// ----------------------------------------- zadanie 4.1 -----------------------------------------
        while (odczyt.hasNextLine()) {
            wiersz=odczyt.nextLine();
            pierwszyCykl=wiersz.substring(0,wiersz.length()/2);
            drugiCykl=wiersz.substring(wiersz.length()/2,wiersz.length());
            if (pierwszyCykl.equals(drugiCykl)) {
                liczbaNapisowDwucyklicznych++;
                if (wiersz.length()>najdluzszyNapisDwucykliczny) {
                    najdluzszyNapisDwucykliczny=wiersz.length();
                    najdluzszyNapisDCText=wiersz;
                }
            }
// ----------------------------------------- zadanie 4.2 SPOSÓB_A wyrażenia regularne !!!
            tablicaBCD= wiersz.split("(?<=\\G.{4})"); // SPOSÓB_1 wyrażenia regularne !!!
            for (String liczba:tablicaBCD){
                if ((Integer.parseInt(liczba)>1001)){
                    liczbaNiepoprawnychB++;
                    if (najkrotszaNiepoprawna>wiersz.length()) najkrotszaNiepoprawna=liczba.length();
                    break;
                }
            }
// ----------------------------------------- zadanie 4.2 SPOSÓB_B substring
            for (int a=0;a<wiersz.length();a+=4){
                substringBCD=wiersz.substring(a,a+4);
                if ((Integer.parseInt(substringBCD)>1001)) {
                    liczbaNiepoprawnych++;
                    if (najkrotszaNiepoprawna>wiersz.length()) najkrotszaNiepoprawna=wiersz.length();
                    break;
                }
            }
// ----------------------------------------- zadanie 4.3
            liczbaBig=new BigInteger(wiersz,2);
            if ((liczbaBig.compareTo(najwiekszaBig)==1) &&((BigInteger.valueOf(65536)).compareTo(liczbaBig)==1)
                )  {
                najwieksza=wiersz;
                najwiekszaBig=liczbaBig;
            }
        }
        System.out.println("4.1 \nLiczba napisów dwucyklicznych: "+liczbaNapisowDwucyklicznych+" \nNajdłuższy napis " +
                "dwucykliczny: " +
                ""+najdluzszyNapisDCText+"" +
                "\nDługość najdłuższego napisu dwucyklicznego: " +
                +najdluzszyNapisDwucykliczny);
        System.out.println("4.2\nLiczba niepoprawnych napisów: "+liczbaNiepoprawnychB+"\nNajkrótsza długość " +
                "niepoprawnego napisu to: "+najkrotszaNiepoprawna);
      System.out.println("4.3\nNajwiększa liczba(dec)"+najwiekszaBig+"\nNajwiększa liczba(hex)"+ najwieksza);
    }
}