Niekt´ ore rozwi azania wzorcowe do zestawu Perl 4 ,
Narzedzia informatyczne w j, ezykoznawstwie,
Marcin Junczys-Dowmunt 22 lutego 2008
Rozwiazania dotycz, a,
”wersji z plusem” z wyjatkiem zadania 4.3, gdzie chyba nie ma ele-, ganckiego sposobu by rozwiaza´, c zadanie zgodnie z poleceniem.
Zadanie 4.2
1 use s t r i c t ;
2
3 my % d o u b l e ;
4 w h i l e( < >) {
5 c h o m p;
6 $ d o u b l e { $_ }+ +;
7 }
8 p r i n t " $_ - $ d o u b l e { $_ }\ n " f o r e a c h(ke ys % d o u b l e );
Je´sli sobie przypomnimy, ˙ze warto´sci nieistniejace s, a w Perlu inicjalizowane automatycznie, (w kontek´scie numerycznym zerem), to krok w wierszu nr 6 staje sie zupe lnie jasny. Spos´, ob dzia lania reszty programu jest chyba oczywisty.
1
Zadanie 4.3
1 use s t r i c t ;
2
3 my % d o u b l e = map { c h o m p; $_ = > 1 } < >;
4 p r i n t " $_ \ n " f o r e a c h(ke ys % d o u b l e );
Funkcja map dzia la na listach, operator diamentowy znajduje si, e wi, ec w kontek´, scie li- stowym i tym samym informacje na wej´sciu zostana skonsumowane w ca lo´, sci, ka˙zdy wiersz jako element listy. Funkcja map tworzy na podstawie tej listy nowa list, e, gdzie elementy o, nieparzystym indeksie to wczytane wiersze, a elementy parzyste to same jedynki. Przypisanie wyniku funkcji map do hasza powoduje zlikwidowanie powtarzajacych si, e kluczy., 1
1Jest to wy laczna w lasno´, s´c haszy! Przypisanie do tablicy nie spowodowa loby usuniecia powtarzaj, acych si, e, element´ow.
2
Zadanie 4.4
Wersja 1
1 use s t r i c t ;
2
3 c h o m p(my @ l i n e s = so rt < >);
4 my $ c o u n t e r = 1;
5 f o r e a c h my $i (1 .. @lines -1) {
6 if( $ l i n e s [ $i -1] ne $ l i n e s [ $i ]) {
7 p r i n t " $ l i n e s [ $i -1] - $ c o u n t e r \ n ";
8 $ c o u n t e r = 1;
9 }
10 el se {
11 $ c o u n t e r ++;
12 }
13 }
14 p r i n t " $ l i n e s [ @lines -1] - $ c o u n t e r \ n ";
Tutaj nie korzystamy z haszy tylko z faktu, ˙ze po posortowaniu, powatarzajace si, e wiersze, bed, a wyst, epowa´, c kolejno po sobie. Wystarczy wiec ´, sledzi´c, kiedy dwa kolejne wiersze sa r´, o˙zne i wypisa´c wtedy liczbe wyst, apie´, n, kt´ora by la zwiekszana tylko wtedy, gdy dwa kolejne wiersze, sie nie r´, o˙zni ly. Ostatni wiersz programu zapewnia, ˙ze nie zapomnimy o ostatnim wierszu w li´scie.
Wersja 2
1 use s t r i c t ;
2
3 c h o m p(my @ l i n e s = so rt < >);
4 w h i l e( @ l i n e s ) {
5 my $ l i n e = s h i f t @ l i n e s ;
6 my $ c o u n t e r = 1;
7 w h i l e( @ l i n e s and $ l i n e eq $ l i n e s [0 ]) {
8 s h i f t @ l i n e s ;
9 $ c o u n t e r ++;
10 }
11 p r i n t " $ l i n e - $ c o u n t e r \ n ";
12 }
Ta wersja jest troche bardziej elegancka, ale nie wida´, c na pierwszy rzut oka, co sie na-, prawde dzieje. Po wczytaniu posortowanych wierszy do tablicy, usuwamy kolejne wiersze z, poczatku tablicy. G l´, owna petla usuwa pierwszy element z tablicy, a wewn, etrzna p, etla usuwa, wszystkie nastepuj, ace po nim duplikaty tego wiersza, zliczaj, ac je. Wewn, etrzna p, etla prze-, staje dzia la´c, gdy nastepny wiersz juz nie jest duplikatem lub gdy zosta ly usuni, ete wszystkie, wiersze. G l´owna petla przestaje dzia la´, c, gdy zostana usuni, ete wszystkie wiersze z tablicy., Mimo tego, ˙ze program zawiera zagnie˙zd˙zona p, etl, e, nie dzia la on d lu˙zej ni˙z pierwsza wersja.,
3
Zadanie 4.5
Wersja 1
1 use s t r i c t ;
2 my % ha sh ;
3 w h i l e( < >) {
4 c h o m p;
5 if( not e x i s t s( $ h a s h { $_ })) {
6 p r i n t $_ ." \ n ";
7 $ h a s h { $_ } = 1;
8 }
9 }
Tutaj r´ownie˙z korzystamy z hasza, ale w przeciwie´nstwie do poprzednich zada´n wypi- sujemy wiersze w czasie wczytywania pliku. Pomys l jest taki, ˙ze wy´swietlamy wiersz, gdy pojawi sie po raz pierwszy i tylko wtedy. Wystarczy wi, ec prze´, sledzi´c, czy dany wiersz ju˙z kiedy´s wystapi l (czyli, czy znajduje si, e w haszu), a je´, sli nie, to go wy´swietlimy.
Wersja 2
1 use s t r i c t ;
2 my % ha sh ;
3 w h i l e( < >) {
4 c h o m p;
5 if( not e x i s t s( $ h a s h { $_ })) {
6 $ h a s h { $_ } = $ .;
7 }
8 }
9 p r i n t $_ ." \ n " f o r e a c h(so rt { $ h a s h { $a } <= > $ h a s h { $b } } ke ys % ha sh );
Innym poprawnym rozwiazaniem jest powy˙zszy program. Tutaj najpierw wczytujemy ca ly, plik do hasza, ale jako warto´sci hasza zapisujemy informacje o pierwszym jego wystapieniu, w pliku (i tylko o pierwszym) w postaci numeru wiersza. Na ko´ncu wystarczy posortowa´c klucze hasza (wiersze) wed lug przypisanych im warto´sci (numery wierszy) i wy´swietli´c klucze wed lug tego porzadku.,
4