12. hét: STL

Czirkos Zoltán, Dobra Gábor · 2019.02.27.

Heti kiegészítő feladatok

1. Leghosszabb szó

Az std::string beolvasó operátora >> szóköznél és újsornál megáll. Vagyis ezzel olvasva a bemenetet, szavakat kapunk.

Írj programot, amelyik megmondja, hogy melyik volt a szabványos bemenetről beolvasott leghosszabb szó!

2. Hány különböző szó?

Az előző feladathoz hasonlóan most is szavakat kell beolvasni a bemenetről. A programodnak most azt kell megmondania, hogy hány különböző szó volt.

Ehhez egy halmazt használhatsz, az std::set-ből példányosítva. Minden szót be kell tenni a halmazba. A halmaz dolga lesz kiszűrni azokat, amik már szerepeltek. A megoldás a halmaz számossága.

3. A halmaz feldolgozása

Iterálj végig az előző feladatban kapott halmazon, és írd ki a benne tárolt szavakat! Vajon mikor és miért rendeződtek ábécé sorba?

Az std::for_each függvénysablon egy iterátorokkal megadott tartományon megy végig, és meghívja annak minden elemére a paraméterként kapott függvényt. Írj függvényt, amelyik kiírja a paraméterként kapott sztringet, majd listázd ki a halmaz szavait a for_each segítségével!

Az std::max_element egy iterátorokkal megadott tartomány legnagyobb elemét találja meg. Harmadik paramétere egy komparátor, amellyel a rendezési reláció adható meg. Visszatérési értéke a legnagyobb elemre mutató iterátor. Keresd meg a max_element segítségével, és írd is ki a halmaz leghosszabb szavát! Keresd meg a min_element segítségével a legrövidebb szót is! Ehhez ugyanaz a komparátor kell, vagy egy másik?

4. Szavak gyakoriság szerint

Az std::map egy asszociatív tároló. Kívülről nézve hasonlóan viselkedik, mint egy tömb, a tárolt értékeket az indexelő operátorral lehet elérni. Az indexelés kulcsa azonban lehet bármi, pl. egy sztring is. A tároló elemei igény szerint, az indexelés hatására jönnek létre:

std::map<std::string, int> m;   // kulcs = string, érték = int
m["Ernőke"] = 4;
std::cout << "Ernőke " << m["Ernőke"] << " éves.";

Írj programot, amelyik beolvassa a szabványos bemenetéről az összes szót, és kilistázza őket, melléjük írva azok gyakoriságát! Például:


alma körte alma barack

alma 2
barack 1
körte 1

Ehhez azt kell még tudnod, hogy az std::map tároló std::pair típusú elemeket tárol. Az std::pair lényegében ennyi:

template <typename T1, typename, T2>
class std::pair {
    T1 first;
    T2 second;
};

Amikor egy std::map-en iterálsz, az iterátoron keresztül a benne tárolt std::pair-ek lesznek láthatóak. Vagyis it->first a kulcs, it->second az érték.

5. Szavak hossz szerint

Írj olyan programot, ami a szabványos bemeneten érkező szavakról kiírja, hogy milyen hosszú szavakból hányféle szerepelt! Például:

egy ketto harom negy ot hat

2 karakteres: 1 db
3 karakteres: 2 db
4 karakteres: 1 db
5 karakteres: 2 db

Vigyázz, ugyanazt a szót csak egyszer számold!

egy egy

3 karakteres: 1 db

6. Ajándékok (Advent of Code 2015/3)

A mikulás ajándékokat visz egy végtelen, kétdimenziós rácson elhelyezkedő házakba.

Kezdetben beadja az ajándékot a kiindulási pozícióban lévő házba, utána pedig rádión kapja az utasításokat, merre kell tovább mennie: északra (^), délre (v), keletre (>) vagy nyugatra (<). Minden lépés után bead egy ajándékot az új pozícióban lévő házba.

A gond csak az, hogy az utasítások kicsit össze-vissza vannak, ezért némely háznál többször is jár. Kérdés az, hogy hány házba vitt legalább egy ajándékot.

Például:

  • > két házba; egyik a kiindulási pozíció, másik pedig az attól keletre lévő.
  • ^>v< négy házba; a kiinduló házban így két ajándékot kapnak.
  • ^v^v^v^v^v rengeteg ajándékot kap két szerencsés gyerek.

Oldd meg a feladatot STL eszközökkel! Saját osztály definiálására nem lesz szükséged. Tippek:

  • A pozíció eltárolható egy egész számpárral.
  • Azt kell vizsgálni, hogy egy adott helyen járt-e már vagy nem. Vagyis hogy egy pozíció már szerepelt-e vagy nem. Milyen matematikai alapfogalomra képezhető ez le? Van olyan STL tároló is.

Bemenő adat: santa.txt, erre a kimenet 2081 kell legyen.