[python] Re: matematická olympiáda - P (programování)
Zdeněk Böhm
zdenek.bohm na seznam.cz
Čtvrtek Říjen 28 15:33:06 CEST 2004
Jan Kara wrote:
>> ...Hlavnim cilem programatorske olympiady neni cvicit programovani v tom
ci onom programovacim jazyce.... Druhou (vyhodou), a tu povazuji za tu
hlavni, je to, ze
tyto jazyky (C, C++, Pascal) neposkytuji prilis "pokrocilych" konstrukci
(coz je prave
to, proc ty bys Python chtel pouzivat ;)...
Dobry den.
Rozhodne s vami nesouhlasim:
Tak za prve:
Programovaci jazyk neni dulezity jen pokud prave vymyslite algoritmus.
Myslim tim to, ze teoreticky, abstraktne, dumate nad tim jak to udelat.
Jenze v momente, kdy ten algoritmus chcete implementovat je uz prog.jazyk
dulezity. A vy v zadani pozadujete, aby ulohy P-I-1, P-I-2 a P-I-3 byly v
odladenem programu! A jeste navic chcete posuzovat casove a pametove naroky
programu!!! Je-li vasim cilem procvicovani "algoritmickeho" mysleni, tak tam
zadne takove pozadavky nemaji co delat.
Za druhe:
To, ze C, Pascal a ostatní neposkytuji "pokrocile" funkce je naopak jejich
nevyhoda. Zeptejte se soutezicich, jak dlouho jim trvalo vymysleni algoritmu
a jak dlouho jim trvala implementace. Vsadim se, ze to psali a ladili
desetkrat dele, nez to vymysleli.
A tady prave vystupuje napovrch bajecna jednoduchost Pythonu. Nestarate se
deklarace, o alokaci pameti, nesilite ze zadnych ukazatelu. Vymyslet
algoritmus musite stejne jako v C nebo Pascalu. Ale na to, ze algoritmus
nefunguje nebo ze ma chybu prijdete v Pythonu daleko rychleji, protoze jej
rychleji napisete :-)
Za treti:
V praxi je vecinou vice dulezite, za jak dlouho bude program hotov (funkcni
a uveden do provozu), nez kolik casu mu zabere vykonani ulohy. Proto my
(uspesni programatori :-) pracujeme v Pythonu.
Napsal jsem ulohu "P-I-1 Prádelna" v Pythonu, abyste videl, ze z hlediska
algoritmu se v nem pouzitim nejakeho modulu nic osidit neda a taky pro
srovnani slozitosti zapisu s ostatnimi prog. jazyky:
#!/usr/bin/python
# --- zadani ---------------------------
zakaznici = (
(1000,1000),
(1900,900),
(1500,700),
(2000,500)
)
pocet_zakazniku = len(zakaznici)
# --- vypocet ---------------------------
pracky = []
ANO = 1
NE = 0
for cislo_zakaznika in range(len(zakaznici)):
# pro kazdeho zakaznika se hleda volna pracka
od = zakaznici[cislo_zakaznika][0]
do = od + zakaznici[cislo_zakaznika][1]
vsechny_pracky_jsou_obsazeny = ANO
for pracka in pracky:
# u kazde pracky se zjisti, je-li volna
pracka_je_obsazena = NE
for cislo_v_pracce,obsazeno_od,obsazeno_do in pracka:
# pro vsechny terminy konkretni pracky
if do > obsazeno_od and od < obsazeno_do:
# zakaznikuv termin se kryje s jinym v pracce
pracka_je_obsazena = ANO
break
if not pracka_je_obsazena:
# pracka neni obsazena, pridame do ni zakaznika
pracka.append( (cislo_zakaznika,od,do) )
vsechny_pracky_jsou_obsazeny = NE
break
if vsechny_pracky_jsou_obsazeny:
# vsechny pracky jsou obsazeny, pridame dalsi pracku
pracky.append( [(cislo_zakaznika,od,do)] )
# --- vytiskneme vysledek ---------------------------
print len(pracky) # pocet pracek, ktere budeme potrebovat
for cislo_zakaznika in range(len(zakaznici)):
cislo_pracky_zakaznika=0
for cislo_pracky in range(len(pracky)):
for cislo_v_pracce,od,do in pracky[cislo_pracky]:
if cislo_zakaznika == cislo_v_pracce:
cislo_pracky_zakaznika = cislo_pracky+1
break
if cislo_pracky_zakaznika:
print cislo_pracky_zakaznika # cislo pracky, kterou zakaznik
pouzije
break
#--- konec programu ---
S pozdravem
Z.Böhm
Další informace o konferenci Python