[ StefanJer91 @ 28.05.2007. 11:13 ] @
Pre nesto manje od mesec dana na jednom drugom forumu je bio mali porgraming chalenge na kome sam pobedio, a cilj je bio napraviti program koji moze da odredi koliko u kojoj casi ima sampanjca ako mu se na pocetku daju informacije koliko ima redova, zapreminu case (sve case su iste zapremine) i kolicinu sampanjca koji se sipa u prvu casu.
A case su poredjane ovako
...Y
..YY
.YYY
YYYY
Ovde Y predstavlja casu, sto znaci ako sipate u prvu casu vecu kolicinu od njene zapremine to ce se preliti u druge 2 case i tako redom. Ja sam uspeo to da napravim ali je program bo dosta spor sa vecim kolicinama, pa sam odlucio da ga optimizujem, i evo sta sam uradio ali u kodu ima neki bug koji ne mogu da nadjem pa bih molio malo iskusnije programere da mi pomognu i ako znaju da kazu u cemu je problem
Code:


#Uraditi: Napravi lepo prelivanje
class Casa:
    def __init__(self, zapremina):
        self.z = zapremina
        self.p = 0
    def prelij(self,val):
        for red in case:
            if self in red:
                try:
                    mr = case.index(red) # mesto reda u matrici                    
                    case[mr+1][case[mr].index(self)].puni(val/2.)
                    case[mr+1][case[mr].index(self)+1].puni(val/2.)
                except:pass
                break
                
    def puni(self, value):
        self.p+= value
        if self.p > self.z:
            self.prelij(self.p - self.z)
            self.p = self.z



redovi = input('Unesi broj redova: ')
V = input('Unesi zapreminu case: ')
kol = input('Unesi kolicinu sampanjca: ')
case = []
for w in range(redovi):
    case.append([Casa(V)]*(w+1))



case[0][0].puni(kol)
      
while 1:
    x = input('Unesi red u kom se nalazi casa: ')
    y = input('Unesi koja je casa po redu: ')
    print case[x-1][y-1].p



Ako neko ima bolju ideju kako ovo moze da se uradi, bio bih mu zahvalan da i on prilozi svoju skriptu
[ StefanJer91 @ 28.05.2007. 11:19 ] @
Za svaki slucaj ostavio sam i predjasnji kod

Code:



class Casa:
    global case
    def __init__(self, zapremina, mesto):
        self.z = zapremina
        self.preliveno= 0
        self.p = 0
        self.m = mesto #red i meso napr 3 red 2 mesto
    def prelij(self): 
        for casa in case:
            if casa.m == (self.m[0]+1,self.m[1])\
               or casa.m == (self.m[0]+1,self.m[1]+1):
                casa.puni(self.preliveno/2.)
                
    def puni(self, value):
        self.p+=value
        self.preliveno = self.p-self.z
        if self.p > self.z:
            self.p = self.z
            self.prelij()


redovi = input('Unesi broj redova: ')
V = input('Unesi zapreminu case: ')
kol = input('Unesi kolicinu sampanjca: ')

sve = []
for red in range(redovi):
    sve.append(range(red+1))
brcasa = 0
for x in sve:
    brcasa+=len(x)



case = []
for red in sve:
    for poz in red:
        case.append(Casa(V, (sve.index(red), poz)))
case[0].puni(kol)
      
while 1:
    x = input('Unesi red u kom se nalazi casa: ')
    y = input('Unesi koja je casa po redu: ')
    for casa in case:
        if casa.m == (x-1,y-1):
            print casa.p
[ StefanJer91 @ 30.05.2007. 18:59 ] @
Ahm, zar niko ne moze da izdvoji malo vremena i pruzi mi pomoc... Hajde molim vas, znam da ovde ima puno iskusnijih ljudi od mene koji bi mogli da nadju resenje za ovaj problem.
[ alex @ 01.06.2007. 14:45 ] @
Poceo sam detaljnije da proucavam tvoj kôd. Fundamentalna stvar koja, verujem, nije adresirana u kôdu je cinjenica da se neke od casa (konkretno unutrasnje case) pune duplo brze od spoljasnjih (jer imaju dve case iznad iz kojih se preliva sampanjac).

Malo sam kratak sa vremenom ali cu probati da posaljem svoje resenje sto pre.
[ StefanJer91 @ 01.06.2007. 18:46 ] @
Ok, unapred hvala. Nadam se da ti nece oduzeti puno vremena.
[ StefanJer91 @ 13.06.2007. 18:28 ] @
Alex kako napredujes, ako jos radis?
[ alex @ 14.06.2007. 11:06 ] @
Nadam se da cu uspeti da zavrsim kako izmene na tvom kôdu, tako i moju (concurrent) verziju sad za vikend. Izvini na kasnjenju, posao pritegao..