P1 - naloga Dovoljena stevila¶
# -*- coding: utf-8 -*-
"""
Nadaljuj [staro domačo nalogo Prepovedani intervali](https://github.com/janezd/predavanja/blob/master/p1/domace-naloge/2020/03%20prepovedani%20intervali/resitev.ipynb)
takole: napiši program, ki pove, koliko je vseh dovoljenih števil med 0 in največjo
zgornjo mejo, če so prepovedana vsa števila, ki se nahajajo v naslednjih intervalih
(par predstavlja zgornjo in spodnjo mejo; (12, 18), pomeni, da so prepovedana vsa
števila od 12 do, vključno, 18).
prepovedani = [
(12, 18),
(2, 5),
(3, 8),
(0, 4),
(15, 19),
(6, 9),
(13, 17),
(4, 8)
]
V gornjem primeru mora izpisati 2, saj sta dovoljeni dve števili, 10 in 11.
"""
from time import time
import numpy as np
timeStart = time()
prepovedani = [
(12, 18),
(2, 5),
(3, 8),
(0, 4),
(15, 19),
(6, 9),
(13, 17),
(4, 8),
]
for checkIndex in range(np.max(prepovedani) + 1):
for rStart, rEnd in prepovedani:
if (rStart <= checkIndex <= rEnd):
print('%s je v prepovedanem rangu [%s, %s]' % (checkIndex, rStart, rEnd))
break
else:
print('%s je dovoljen' % checkIndex)
print("Finished in ", time() - timeStart, "\n\n\n")
"""
Potem pa se spopadi z intervali iz datoteke intervali.txt, ki je pripeta k nalogi.
Branja datotek se še nismo učili. Lahko se potrudiš sam(a), lahko pa uporabiš naslednjo vrstico:
intervali = [tuple(int(x) for x in vrstica.split("-")) for vrstica in open("intervali.txt")]
Še en zanimiv izziv je naslednji: recimo, da tvoj računalnik ne bi imel niti toliko pomnilnika,
da bi lahko shranil celotno tabelo intervalov. Če hočeš večkrat prek tabele, moraš večkrat odpreti
datoteko in jo brati. Z drugimi besedami: nimamo seznamov (ali terk, slovarjev, množic ...), le
posamične int-e in datoteke (ter, očitno, niz s posamično vrstico, ki jo dobiš iz datoteke, ter
seznam z dvema nizoma, ki ga vrne split te vrstice). Napiši program, ki kljub tem omejitvam v
doglednem času reši nalogo. Recimo tako, da čim manjkrat prebere datoteko.
"""
import os
print("Starting 'dodatna':")
timeStart = time()
intervali = [tuple(int(x) for x in vrstica.split("-")) for vrstica in open(os.path.dirname(__file__) + "/intervali.txt")]
# intervali = [(0, 10), (2, 5), (9, 20), (15, 19), (12, 40), (32, 50), (19, 30)]
intervali = sorted(intervali)
allowedCount = 0
allowedSum = 0
endingMax = 0
for (_, intAb), (intBa, _) in zip(intervali, intervali[1:]):
endingMax = max(intAb, endingMax)
if intBa <= endingMax:
print(".", end="")
continue
else:
newCount = intBa - intAb - 1
newSum = (intBa * (intBa+1) - (intAb-1) * intAb) / 2
allowedCount += newCount
allowedSum += newSum
print("+", end="")
print("\n")
print("%-20s %s" % ("Allowed numbers", allowedCount))
print("%-20s %s" % ("Out of", np.max(intervali) - np.min(intervali)))
print("%-20s %s" % ("Sum of all allowed", allowedSum))
print("%-20s %s" % ("Finished in", time() - timeStart))
Zadnja posodobitev:
February 27, 2022