Day 4: Camp Cleanup

(besedilo naloge)

Imamo seznam parov intervalov v obliki

2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8

in zanima nas ...

Prvi del

... koliko je takšnih, pri katerih je eden od njiju v celoti vsebovan v drugem.

Najprej preberemo številke. Lahko delimo niz po - in ,, lahko se hecamo z regularnimi izrazi, lahko pa preprosto zamenjamo , in delimo po -, pa dobimo štiri številke. Torej

pairs = [[int(x) for x in line.replace(",", "-").split("-")]
         for line in open("example.txt")]

Vzemimo, recimo, prvi par:

x0, x1, y0, y1 = pairs[0]

En interval je vsebovan znotraj drugega, če velja

x0 <= y0 <= y1 <= x1 or y0 <= x0 <= x1 <= y1
False

Srednji primerjavi sta nepotrebni, saj vedno velja y0 <= y1 in x0 <= x1. Vseeno sem ju pisal, saj je alternativa

x0 <= y0 and y1 <= x1 or y0 <= x0 and x1 <= y1
False

manj pregledna, če dodamo oklepaje,

(x0 <= y0 and y1 <= x1) or (y0 <= x0 and x1 <= y1)
False

pa je videti že, kot da je zapleteno. Prva različica najbolj jasno pokaže, da gre za takšno in takšno zaporedje števil.

Da rešimo nalogo, moramo le prešteti, kolikokrat je izraz resničen. Ker je True enak 1 in False enak 0, lahko preprosto seštejemo vrednost tega izraza za vse pare.

print(sum(x0 <= y0 <= y1 <= x1 or y0 <= x0 <= x1 <= y1 for x0, x1, y0, y1 in pairs))
2

Drugi del

... koliko intervalov vsebuje kak skupni element.

Da imata intervala skupni element, mora biti začetek prvega znotraj drugega ali pa začetek drugega znotraj prvega.

print(sum(x0 <= y0 <= x1 or y0 <= x0 <= y1 for x0, x1, y0, y1 in pairs))
4