3. naloga

Veriga

V daljšem besedilu, natisnjenem s pisavo konstantne širine (vsi znaki so enako široki), bi radi poiskali najdaljšo verigo enakih znakov.

Veriga je zaporedje enakih znakov (lahko gre za črko, številko, presledek, ločilo ali kaj drugega), ki se ponavlja v zaporednih vrsticah na enakem položaju znotraj vrstice. Pri tem razlikujemo velike in majhne črke („a“ ni enak „A“).

V spodnjem besedilu je na primer najdaljša veriga dolga šest znakov „a“, ki jih najdemo na drugem mestu druge, tretje, . . . in sedme vrstice.

Ne prav dolgo potem se je pot na Čatež zopet krebri obrnil. Mrtoláz
pa se je menil po nemško in zmerom od pijače, kar je Dolenjčev
najljubši pogovor, ki ga ne konča tako hitro, ako se ga je polotil.
Nagovarjal je naju, da naj zložíva imenitno pesem letošnjemu vincu
na čast. »Že sam sem se prtil ž njo,« pravi, »pa mi ni po volji,
kar sem zverižil. Časi je bil Kančnik, tudi šmarski šomašter je
zaokrožil katero. Zdaj ga pa ni, da bi kaj znal. Kar sta le-ta dva
pomrla, nimamo kaj peti, stare so se pozabile, novih ni!«
                       - Fran Levstik, Popotovanje iz Litije do Čateža

Napiši program ali podprogram (funkcijo), ki analizira besedilo in izpiše dolžino najdaljše verige, zaporedno številko vrstice, v kateri se veriga začne, ter položaj znotraj vrstice. Če mu podamo zgornji primer, mora program izpisati 6 (dolžina verige), 2 (zaporedna številka vrstice) in 2 (položaj znotraj vrstice). Oblika izpisa ni pomembna.

Na voljo imaš naslednja podprograma (funkciji):

  • NaKoncu() vrne true, če je program prebral vse vrstice, in false, če na vhodu še čakajo podatki.
  • Vrstica() vrne vsebino naslednje vrstice besedila. Predpostaviš lahko, da ne bo vrstica nikoli daljša od 80 znakov. Funkcijo lahko kličeš le, če NaKoncu vrne false.

Teh dveh funkcij torej ne piši ti, pač pa predpostavi, da že obstajata, ti pa ju moraš uporabljati za branje vhodnega besedila. Funkciji sta takšne oblike:

bool NaKoncu();
public static bool
NaKoncu();
public static boolean
NaKoncu();
function
NaKoncu: boolean;
def
NaKoncu(): ...

void
Vrstica(char *s);


string Vrstica();
public static string Vrstica();
public static
String Vrstica();
function
Vrstica: string;
def
Vrstica(): ...
/* v C/C++ */
// v C#
// v javi
{ v pascalu }
# v pythonu; vrne vrednost tipa bool

/* v C/C++; kot parameter „s“ podaj kazalec na tabelo
   vsaj 81 znakov, funkcija pa bo vsebino naslednje
   vrstice skopirala vanjo */
// v C++ (lahko uporabiš to ali prejšnjo)
// v C#
// v javi
{ v pascalu }
# v pythonu; vrne vrednost tipa string


Ker je besedilo izredno dolgo, poskusi zasnovati program ali podprogram tako, da ne bo prebral celotnega besedila v pomnilnik. Rešitve, ki bodo prebrale celotno besedilo in ga šele nato analizirale, bodo dobile največ 15 točk.

Prazen prostor desno od konca vrstice (torej od zadnjega znaka tistega niza, ki ga vrne funkcija Vrstica) ne more postati del nobene verige (ne smeš se torej na primer delati, da so tam presledki ali kaj podobnega).

Za potrebe te naloge predpostavi, da vsaka vrednost tipa char predstavlja en znak, torej naj te ne motijo posebni znaki, npr. šumniki, ki nastopajo v zgornjem primeru.