Problemi 055

Kërkesa

Është një ditë feste dhe Cufi duhet të raportojë rreth parakalimeve që po bëhen në bulevard. Grupe të ndryshme njerëzish parakalojnë në formë autokolone, njëra pas tjetrës, ku dy autokolona mund të kenë edhe njëfarë distance nga njëra-tjetra. Sa herë që shikon fillimin e një autokolone Cufi shënon në një fletore një H, gjatë kohës që autokolona ecën ai vazhdon të shënojë pika (.), dhe kur shikon fundin e autokolonës shënon një T. Gjithashtu, për të shënuar distancat midis autokolonave ai përdor pika.

Meqenëse autokolonat kalojnë me radhë njëra pas tjetrës, një raport i saktë do ishte diçka e tillë: “..H..T…HTH….T.”, ose “”, ose “HT”. Kurse “T…H..H.T”, “H..T..H” dhe “H..H..T..T” do ishin të pasakta.

Formalisht, një autokolonë paraqitet nga një H, që pasohet nga disa pika (ndoshta asnjë), dhe në fund ka një T. Një raport i saktë është ai që fillon me disa pika (ndoshta asnjë), vazhdon me disa (ndoshta zero) autokolona midis të cilave mund të ketë edhe pika, dhe mbaron me disa pika (ndoshta asnjë).

Cufi ka ndenjur vonë mbrëmë duke festuar dhe është pak përgjumësh, kështu që raporti i tij mund të jetë i pasaktë. Bëni një program që verifikon nëse raporti është i saktë ose jo.

Referenca: https://www.codechef.com/problems/SNAKPROC

Shembull

$ cat input.txt
6
18
..H..T...HTH....T.
3
...
10
H..H..T..T
2
HT
11
.T...H..H.T
7
H..T..H

$ python3 prog.py < input.txt
Valid
Valid
Invalid
Valid
Invalid
Invalid

H..H..T..T” nuk është e saktë sepse kolona e dytë fillon para se të mbarojë e para.

.T…H..H.T” nuk është i saktë sepse ka një fund kolone T pa pasur ndonjë fillim H.

H..T..H” nuk është i saktë sepse ka një fillim kolone H që nuk ka fund T.

Zgjidhja 1

for _ in range(int(input())):
    n = int(input())
    s = input()
    i = 0
    while True:
        while i < n and s[i] == '.':
            i += 1
        if i == n:
            print('Valid')
            break
        if s[i] == 'H':
            i += 1
        else:
            print('Invalid')
            break
        while i < n and s[i] == '.':
            i += 1
        if i == n:
            print('Invalid')
            break
        if s[i] == 'T':
            i += 1
        else:
            print('Invalid')
            break

Sqarime

Kontrollojmë plotësimin e kushteve për të qenë një raport i rregullt:

  • të ketë një numër të çfarëdoshëm pikash në fillim, në mes ose në fund
  • shkronja H të jetë e para dhe pas saj të vijë një shkronjë T

Zgjidhja 2

def check(n, s):
    i = 0
    while True:
        while i < n and s[i] == '.':
            i += 1
        if i == n:
            return True
        if s[i] == 'H':
            i += 1
        else:
            return False
        while i < n and s[i] == '.':
            i += 1
        if i == n:
            return False
        elif s[i] == 'T':
            i += 1
        else:
            return False

for _ in range(int(input())):
    n = int(input())
    s = input()
    print('Valid') if check(n, s) else print('Invalid')

Sqarime

E njëjtë me zgjidhjen e parë, por e strukturuar me një funksion që kthen True ose False.

Zgjidhja 3

import re
for _ in range(int(input())):
    input()
    print('Valid') if re.search("^\.*(H\.*T\.*)*$", input()) else print('Invalid')

Sqarime

Zgjidhje që përdor shprehjet e rregullta (https://docs.python.org/3/howto/regex.html)

Detyra

Mësuesi ka ngritur disa nxënës në dërrasë dhe u ka dhënë nga një ushtrim për të zgjidhur (klasa ka një dërrasë të gjatë kështu që mësuesi mund të ngrejë në dërrasë shumë nxënës njëkohësisht). Sapo mësuesi doli një moment nga klasa, disa prej nxënësve u kthyen dhe filluan të komunikojnë me shokun që kishin në krah, kurse të tjerët vazhduan punën. Këtë situatë mund ta paraqesim me një varg të tillë: *><><><*, ku një * tregon një nxënës që vazhdon punën, një > tregon një nxënës që po flet me shokun në të djathtë, dhe një < tregon një nxënës që po flet me shokun në të majtë. Sapo dëgjojnë mësuesin të hyjë përsëri, nxënësit që po flisnin kthehen nga frika në krahun e kundërt. Kur mësuesi shikon dy nxënës përball njëri-tjetrit ai mendon se ata po flisnin, kështu që i ndëshkon të dy. Gjeni sa dyshe nxënësish ndëshkohen prej mësuesit.

Referenca: https://www.codechef.com/problems/CHEFSTUD

Shembull

$ cat input.txt
4
><
*><*
><><
*><><><*

$ python3 prog.py < input.txt
0
0
1
2