2012 m. birželio 30 d., šeštadienis

Metų apžvalga nuo birželio iki birželio.

Taigi, prabėgo dar metai mokslų, vėl birželis. Per tuos metus šiek tiek, bet nedaug, programavimo ir informatikos prasme patobulėjau.
Rudens semestrą turėjau Duomenų Struktūrų dalyką, kuris sekėsi gana sunkiai, ir baigęs kursą žinau, kad mažai jį nutuokiu. Tai buvo vienintelis programinimo dalykas tą semestrą, tad kaip laisvąjį pasirinkau dar "Algoritmavimo seminarą". Pastarasis dalykas buvo toks, kad reikėjo pasirinkti ICPC ( http://mif.vu.lt/icpc/ ) puslapyje sezoną ir iš jame pateiktų ~10-15 užduočių pasirinkti ir išspręsti keturias (4). Tai - uždaviniai, reikalaujantys parašyti programavimo kalba kodą, kuris per ribotą (trumpą) laiką išspręstų, bet kokį užduoties atvejį.
Šį dalyką atsiskaityti susigriebiau tik paskutinėmis semestro savaitėmis, ir per savaitgalį ir pirmadienį, viską sudėjus, tai būtų apie parą laiko, parašiau 5 užduotis, o vienai iš nesigavusių buvau skyręs daug laiko, nes užduotis patiko ir šiaip nenorėjau pasiduoti. Viską rašiau Pascal'iu.
Prieš pradedant rašyti programas, paskaičiau e-knygą "Informatikos olimpiados: algoritmai ir taikymo pavyzdžiai.", perskaičiau apie trečdalį; patiko.

Na, o pavasario semestre jau turėjau daugiau programavimo. Buvo du dalykai: Interneto Technologijos ir programavimas Perl kalba.
Interneto technologijas įsisavinau prastokai, nedaug joms skyriau laiko ir domėjimosi, nebuvo ir polinkio. Tai buvo tinklalapių kūrimo praktika. Egzaminą laikiau labai sunkiai, praktikos darbai irgi ėjosi sunkiai, daug temų liko neįsisavintos.
Perl kalba visai normali. Vietomis ir labai patiko, ir vietomis labai nepatiko. Patiko kai kurie "abstrahavimai": funkcijai ir procedūrai naudojamas bendras sub(){}, eilutėms pildyti, modifikuoti, iškirpinėti fragmentams naudojamas bendras substr(), patiko "einamasieji" kintamasis/masyvas/asoc.masyvas - $_, @_, %_, aišku patiko RegExp - reguliariosios išraiškos, žargoniškai - įpraiškos. Nepatiko, kad dažnai padarau kokių nors klaidų kode, ir negaliu suprasti, kur jos, ilgai užtrunka jų aptikimas; kai kur yra archajiškumų, kuriuos reikia tiesiog žinoti; nepatiko pažindinimasis su paketais ir moduliais.
Prieš egzaminą pakūriau mini-testuką RegExp'ams, naudodamasis Google apklausa. Ji ir jos rezultatai - vieši; pirmoje eilutėje - atsakymai, kurių didžioji dauguma - teisingi. Kas nori, gali išsibandyti testuką čia, vėliau peržiūrėti ats.

Dar pavasario semestro metu teko užsiregistruoti į OpenCup turnyrėlį. Prisijungiau prie komandos, tapome tryse. Ir daugmaž kas antrą savaitgalį, sekmadieniais, vykstančiame 6 valandas konkurse, rinkdavomės spręsti uždavinius, panašius į ICPC uždavinius. Dalyvavome antrojoje divizijoje, kurioje uždaviniai yra silpnesni. Ir išspręsdavome per duotą laiką apie 1-3 uždavinius, iš ~10. Gana mažai. Na, bet toks mūsų lygis. Užtat spręsti būdavo įdomu, o ir sąlygos neretai pralinksmindavo.
Sprendėme kiekvienas komandos narys savo mėgiama kalba, tai buvo C/C++, Python, ir žinoma - Pascal :)

Labiausiai man patikusios užduotys:
1 ture - užduotis su TV bokštu [neišsprendėm]
2 ture - Knife to me (torto pjaustymas) [išsprendėm]
3 ture - Lenktynės [neišsprendžiau; namie vėliau išsprendžiau] ir Žirgas [neišsprendžiau]
4 ture - Rectadarts (ru: Прямоудартс) [išsprendėm gal ir teisingai, bet per lėtas algoritmas]
6 ture - Building (statybos)  [išsprendžiau]
7 ture - Giant Soccer (visai lengvas, bet linksmas) [išsprendžiau]
Pirmieji šeši išvardytieji yra geometriniai.

Building užduoties kodas:

program Building;

var
l, w, n, r, x, y, ats, i, j : smallint;

a : array[1..16] of boolean;

begin

read(l, w, n);         readln(r);

for i:=1 to 15 do a[i]:=false;
a[16]:=true;

ats:=4;

for i:=1 to n do begin
read(x);  readln(y);
    if (x<-l/2-r) or (x>l/2+r) or (y<-w/2-r) or (y>w/2+r) then continue;
   
    for j:=1 to 4 do a[j]:=false;
   
    if sqrt( sqr(-l/2 - x) + sqr(y) ) <= r then begin a[1]:=true; a[12]:=true; end;
    if sqrt( sqr(+l/2 - x) + sqr(y) ) <= r then begin a[2]:=true; a[13]:=true; end;
    if sqrt( sqr(-w/2 - y) + sqr(x) ) <= r then begin a[3]:=true; a[14]:=true; end;
    if sqrt( sqr(+w/2 - y) + sqr(x) ) <= r then begin a[4]:=true; a[15]:=true; end;
   
    if a[1] and a[2] and a[3] and a[4] then begin ats:=1; break; end;
   
    if ats <= 2 then continue;
    if not (a[1] or a[2] or a[3] or a[4]) then continue;
   
    if (a[1] and a[2] and a[3]) or (a[4] and a[2] and a[3]) or (a[1] and a[2] and a[4]) or (a[1] and a[4] and a[3]) then begin
        ats:=2; continue;
    end;
    if (a[1] and a[2]) then a[5]:=true;
    if (a[1] and a[3]) then a[6]:=true;
    if (a[1] and a[4]) then a[7]:=true;
    if (a[2] and a[3]) then a[8]:=true;
    if (a[2] and a[4]) then a[9]:=true;
    if (a[3] and a[4]) then a[10]:=true;
   
end;

    for i:=12 to 15 do a[16]:=a[16] and a[i];

if not a[16] then writeln('Impossible')
else    
if ats <= 2 then writeln(ats)
else begin
    for i:=5 to 10 do a[11]:=a[11] or a[i];
if not a[11] then writeln(ats)
    else begin
        if (a[5] and a[10]) or (a[6] and a[9]) or (a[7] and a[8]) then
            begin ats:=2; writeln(ats); end
            else begin ats:=3; writeln(ats); end;
   
    end;

end;

end.


O Perl'o dalyke teko irgi keletą programų rašyti. Iš pradžių lengvesnes: a) faile esančių skaičių suma, vidurkis, b) faile esančių žodžių ilgių vidurkis, išrikiavimas ir atspausdinimas lietuviškos abėcėlės tvarka, c) <...>
Vėliau pabandžiau šiaip mažučių subroutinų pasirašyti. Štai programa su pora subroutinų, šiek tiek modifikuojančių tekstinį failą:


#!/usr/bin/perl
#RS 2012-06-10

print("koki faila formatuosime?\n");
$failas=<>;
    chomp($failas);

open(f, "$failas") or die "Negaliu atidaryti failo";
open(g, ">r_$failas") or die "Negaliu atidaryti failo";

sub trina_tuscias_eil {
    my $eil=shift;
    $eil=~/^\n$/ && chomp($eil);
    return $eil;
}

sub trina_tarpu_pertekliu {  # neliecia komentaru
    my $eil=shift;
    while ($eil=~/^[^#]*\x20{2,}/) {
        $eil=~s/(^[^#]*)\x20{2,}/$1\x20/;
    }
    return $eil;
}

while ($eil=<f>) {

    $eil=trina_tuscias_eil($eil);
    $eil=trina_tarpu_pertekliu($eil);
    print g $eil;
}   
$readkey=<>;

close(f);
close(g);