Zadanie z matury 2013

0

Pomoże ktoś z tym zadaniem z matury? Zadanie ma być wykonane w języku PHP a mi tylko pierwszy podpunkt wychodzi. Proszę pomóżcie.

W pliku napisy.txt znajduje się 1000 napisów o długościach od 2 do 16 znaków, każdy
napis w osobnym wierszu. W każdym napisie mogą wystąpić jedynie dwa znaki: „0” lub „1”.
W wybranym przez siebie języku programowania napisz program, za pomocą którego
uzyskasz odpowiedzi na poniższe polecenia. Odpowiedzi zapisz w pliku zadanie4.txt,
a odpowiedź do każdego podpunktu poprzedź literą oznaczającą ten podpunkt.

a) Podaj, ile jest napisów o parzystej długości.

b) Podaj, ile jest napisów, które zawierają taką samą liczbę zer i jedynek.

c) Podaj, ile jest napisów składających się z samych zer, oraz podaj, ile jest napisów
składających się z samych jedynek.

d) Dla każdej liczby k  2, 3, ...,16 podaj liczbę napisów o długości k znajdujących się
w pliku napisy.txt, tzn. podaj, ile jest napisów 2-znakowych, ile jest napisów
3-znakowych itd.

0
<?php

// Podpunkt b)

/* file() wczytuje nam cały plik do tablicy
 * możesz odkomentować print_r żeby zobaczyć
 *  jak to wygląda
 */

$napisy = file('napisy.txt', FILE_IGNORE_NEW_LINES);

// echo "<pre>";
// print_r($napisy);
// echo "</pre>";

$mirrorDigits = 0; // Przechowuje liczbę wystąpień 

/*
 * Przechodzimy przez tablicę i w pierwszym if sprawdzamy
 * czy liczba znaków w danym napisie jest parzysta (zeby było po równo 0 i 1)
 * a później sprawdzamy czy wystąpienia 0 i 1 się sobie równają
 * jeżeli tak inkrementujemy zmienną $mirrorDigits
 */

foreach ($napisy as $value) {
	if(strlen($value) % 2 == 0){
		if(substr_count($value, 0) == substr_count($value, 1))
			$mirrorDigits++;
	}
}

echo "W pliku napisy.txt jest $mirrorDigits napisy/ow zawierajacych taka sama ilosc 0 i 1. <br><br>";

// Podpunkt c)

$onlyZero = 0; // Przechowuje liczbę wystąpień napisów tylko z 0
$onlyOne  = 0; // Przechowuje liczbę wystąpień napisów tylko z 1

$everythingButZero = '/[^,0]+/'; // regex: wszystko z wyjątkiem 0
$everythingButOne = '/[^,1]+/'; // regex: wszystko z wyjątkiem 1

/*
 * Tutaj użyłem metody z prawdopodobieństwa,
 * czyli zdażenie odwrotne do. Regex sprawdza czy w danym ciągu
 * znajdują się znaki różne od 1.
 * Jeżeli zwróci false oznacza to, że w danym ciągu są
 * same jedynki i żeby wyszło true, a sterowanie zostało przekierowane do
 * inkrementacji to skorzystałem z !
 */

foreach ($napisy as $value) {
	if(!preg_match($everythingButZero, $value)){
		$onlyZero++;
	} elseif (!preg_match($everythingButOne, $value)){
		$onlyOne++;
	}
}

echo "W pliku napisy.txt jest: <br>
$onlyZero napisy/ow zawierajacych tylko 0 <br>
$onlyOne napisy/ow zawierajacych tylko 1 <br><br>";

// Podpunkt d)

/*
 * Tworzę pustą tablicę, która przechowa mi poszczególą liczbę wystąpień
 * na zasadzie klucz => wartość tzn. 2 => liczba wystąpień, 3 => liczba wystąpien itd.
 */

$countDistinct = array();

/*
 * Pętla for jest po to, żeby przejść przez wszystkie 
 * opcje tzn. od 2 - 16, z każdym obrotem bierzemy pod lupę kolejną
 */

for($lineLength = 2; $lineLength <= 16; $lineLength++){
	// foreach jak juz wiemy przechodzi przez wyszstkie wartości w tablicy napisy
	foreach ($napisy as $value) {
		/*
		 * if sprawdza, czy długość ciągu znaków (napisu)
		 * jest równa aktualnemu licznikowi, czyli $lineLength np. 2, 3 itd.
		 * jeżeli tak jest to inkrementujemy na zasadzie np. przy pierwszym obrocie
		 * jeżeli klucz nie istnieje to zostaje utworzony:
		 * $countDistinct[2]++;
		 */ 
		if(strlen($value) == $lineLength){
			$countDistinct[$lineLength]++; 
		}
	}
}

echo "Liczba wystapien napisow o długości k = 2, 3, 4 .... 16 znakowych : <pre>";
print_r($countDistinct);
echo "</pre>";

http://www.cke.edu.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2013/Kryteria-Oceniania/informatyka_model_PP.pdf

Chyba zdałem :D

0

To ja może napisze kod który sprawdzi ile jest napisów o parzystej długości.

 
<?php
$napisy = file('napisy.txt', FILE_IGNORE_NEW_LINES);
$parzystosc = "";
$i =  0;
foreach ($napisy as $value) {

      $parzystosc = strlen($value);
      if ($parzystosc % 2 == 0) $i++;

}
 
echo "W pliku napisy.txt jest $i napisów o parzystej  długości<br><br>";


?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1