Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 629 odgovora
  • 108.164 pregleda

Najnovija ↓

Re: Zadaci za wannabe pythoniste 17.01.2020. u 13:03 · pre 82 meseca #181
Zašto samo tri broja?
Pa jer smo tako u mogućnosti u ovom trenutku :)

Elem, izborih se ja nekako sa 14. zadatkom i svoje rešenje sam postavio ovde.


E sad kad smo ovu preponu preskočili, da vidimo šta predlaže Berislav.

Dakle, treba da bude matrica.
Ali čekaj, pa još nisam radio sa matricama!?

Pa šta čekaš!? :)

I to što kažeš. Dobro, misliš nešto ovako?

brojevi = [[8, 29, 22, 17]
[14, 38, 21, 18]
[15, 52, 40, 39]
[31, 20, 26, 41]]


Jesi ti siguran da se ovo može rešiti samo sa if... else?

Dobro, ako idem ovim metodom kojim sam rešio zadatak četrnaest, red po red, naći ću najveći neparan broj u svakom redu.
Onda od ta četiri broja opet nađem najveći.
Ali mi nije baš jasno kako ću odrediti njegovo mesto.
Jedino za svaki broj da bude promenljiva po nekom nizu, recimo
[a1, a2, a3, a4
b1, b2, b3, b4...]

pa da u odnosu na to koja bude najveća određujem poziciju. Gore bi to bila c2, dakle treći red, druga kolona.
Ili ima neka prečica?
Re: Zadaci za wannabe pythoniste 17.01.2020. u 14:31 · pre 82 meseca
izmenjeno 1 put, poslednji put B3R1 17.01.2020. u 15:40
  1. B3R117.01.2020. u 15:40zapis iz teksta poruke
#182
Citat:
a1234567: Jesi ti siguran da se ovo može rešiti samo sa if... else?

Ocigledno ne, treba ti i petlja ... 'for' petlja. :-) Mislim, ako resavas opsti slucaj (dimenzija M x N).
Citat:
Ali mi nije baš jasno kako ću odrediti njegovo mesto. Jedino za svaki broj da bude promenljiva po nekom nizu, recimo

Zato sam ti i savetovao da prodjes onaj kurs sa MIT. Tamo lepo objasnjavaju strukture podataka, pocev od skalarnih tipova (str, int, float ...) do vektorskih (list, dict ...). Kada imas listu:
a = [ 10, 20, 50, 100, 200 ]

Elemente liste mozes da dobijes sa:
>>> a[0]
10
>>> a[2]
50

Prvi element liste s leve strane ima indeks 0, slede 1, 2 itd. Slicno tome, u matrici iz tvog primera (zaboravio si zareze na kraju vrsta).
brojevi = [[8, 29, 22, 17],  [14, 38, 21, 18], [15, 52, 40, 39], [31, 20, 26, 41]]

vrednost pojedinih elemenata dobijas sa:
>>> brojevi[0][0]
8
>>> brojevi[0][1]
29
>>> brojevi[2][3]
39

U opstem slucaju brojevi[x][y], gde je x vrsta (0-3), a y kolona (0-3). Znaci, za svaki element liste, odnosno 'liste lista' (matrice) mozes lako da dobijes indeks elementa.

Kako mozes da odstampas / analiziras elemente liste, jedan iza drugog? Koriscenjem 'for' petlje. Imas dva nacina - iterativno, element po element:
lista = [ 10, 11, 12, 13, 14]
for element in lista:
print element

Ili pristupajuci klasicno, indeks po indeks:
for id in range(len(lista)):   # len(lista) = 5 u gornjem primeru:
print lista[id]


A sada nesto sto mozda nisi znao: za razliku od nekih drugih programskih jezika u Pythonu su liste dinamicke, implementirane kao ulancane liste s pointerima. Ako napravis praznu listu:
lista = []

Ona nece imati nijedan element, a ako pokusas da pristupis ili da direktno dodelis vrednost desetog elementa u listi, dobices:
>>> lista[9] = 12
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

Listu mozes da definises ili direktno (lista = [1, 3, 5, 7, 11]) ili metodom element po element, koriscenjem append() metode:
>>> lista.append(51234)
>>> lista.append(51)
>>> lista.append(3)
>>> lista
[51234, 51, 3]
>>> lista[1]
51

Elemente liste mozes i da brises (pop() / remove()), da umeces elemente usred postojece liste (insert()) itd. Osnovne operacije sa listama mozes da vidis ovde

Medjutim, ponekad ti moze zatrebati prazna lista koja sadrzi svuda nule, a gde mozes proizvoljno da pristupis bilo kom elementu i dodelis mu vrednost. To je narocito pogodno kada prevodis prastare programe koje su neke fortrandzije pisale pre 40 godina, tamo su nizovi staticki definisani i automatski popunjeni nulama. Ili neki Perl skript, u Perlu su sve promenljive kada ih prvi put pozoves uvek nule (osim ako ne koristis 'use strict').

Praznu listu od 10 nula kreiras sa:
lista = [0]*10
>>> lista
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> lista[5]=111
>>> lista
[0, 0, 0, 0, 0, 111, 0, 0, 0, 0]

Slicno tome, matricu 3 x 3 popunjenu nulama mozes da dobijes sa:
>>> matrica = [[0, 0, 0]]*3

ili:
>>> matrica = [[0]*3]*3

U oba slucaja rezultat je isti:
>>> matrica
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

Takozvanu jedinicnu matricu:
1 0 0
0 1 0
0 0 1

dobijas ovako:
Code:
e = [] # Kreira praznu listu
for i in range(3):
    e.append([]) # Dodaje praznu vrstu matrice
    for j in range(3):
        if (i==j):
           e[i].append(1)
       else:
           e[i].append(0)

U gornjem izrazu 'i==j' je izraz tipa boolean, ciji je rezultat True ili False. Boolean se moze konvertovati u integer funkcijom int() (int(False) = 0, int(True) = 1). Samim tim, ovo gore mozes da skratis:
Code:
e = [] # Kreira praznu listu
for i in range(3):
    e.append([]) # Dodaje praznu vrstu matrice
    for j in range(3):
        e[i].append(int(i==j))  # Daje 0 ako je i!=j, a 1 ako je i==j

Moze li jos krace? Moze! U Pythonu imas lepu stvar koja se zove comprehension, koja ti omogucava da gornji kod skratis na jednu liniju (verovatno si video ovaj trik u Pantinim kodovima, na linku koji sam ti dao imas vise o tome):
Code:
e = [ [ int(i==j) for i in range(3) ] for j in range (3) ]


Mislim da ti sada nece biti tesko da uradis zadatak.
Re: Zadaci za wannabe pythoniste 17.01.2020. u 15:46 · pre 82 meseca #183
Citat:
a1234567:
Dobro, ako idem ovim metodom kojim sam rešio zadatak četrnaest, red po red, naći ću najveći neparan broj u svakom redu.

Zamisli da stojis pred ljudima (oba pola, imuskarci i zene) postrojenim u vrstu. Ljudi nisu sortirani po visini. U ruci drzis kanap i lenjir. Kako ces odrediti visinu najvise zene u vrsti?

Ako znas odgovor na to pitanje znas da resis i ovaj problem. Misilm da sam ti dovoljno pomogao.
Re: Zadaci za wannabe pythoniste 18.01.2020. u 07:43 · pre 82 meseca #184
Citat:
Dobro, ako idem ovim metodom kojim sam rešio zadatak četrnaest, red po red, naći ću najveći neparan broj u svakom redu.
Onda od ta četiri broja opet nađem najveći.
Ali mi nije baš jasno kako ću odrediti njegovo mesto.

Python lista ima index() funkciju koja vraća poziciju tj. indeks elementa u listi, npr.
Code:
[31, 20, 26, 41].index(41)
3


Sad samo prođi kroz listu i proveri da li je broj neparni i da li je veći od prethodnih, i ako je True, zabeleži ga, kao i njegovu poziciju.
Re: Zadaci za wannabe pythoniste 18.01.2020. u 13:31 · pre 82 meseca #185
Zaboravio sam da pomenem i enumerate(). Kada prolazis kroz listu u for-petlji, listajuci element po element:
for elem in [11, 13, 14, 17, 21]:
print elem

Dobices spisak elemenata liste, jedan ispod drugog. Ali ako zelis da uz to vodis racuna i o njihovim indeksima, mozes da koristis enumerate():
for i, elem in enumerate([11, 13, 14, 17, 21]):
print "%d\t%d" % (i, elem)

U slucaju matrice to je:
matrix = =[[1,3,5], [2, 4, 8], [3, 5, 3]]
for j, row in enumerate(matrix):
for k, cell in enumerate(row):
print "Matrica (%d,%d):\t%d" % (j, k, cell)
# Rezultat:
Matrica (0,0): 1
Matrica (0,1): 3
Matrica (0,2): 5
Matrica (1,0): 2
Matrica (1,1): 4
Matrica (1,2): 8
Matrica (2,0): 3
Matrica (2,1): 5
Matrica (2,2): 3

Inace, ovo je jedan od prvih algoritama koji se obradjuje na svakom pocetnom kursu programiranja - nalazenje minimuma i maksimuma niza. Analogija sa kanapom i strojem ljudi je bas potpuna. Prosta pravolinijska procedura. Ostavljam tebi da sam dodjes do tacnog postupka, nije tesko. A uz enumerate() funkciju diskusija o listama je recimo kompletna.
Re: Zadaci za wannabe pythoniste 18.01.2020. u 13:50 · pre 82 meseca #186
Prošao sam taj deo sa listama, indexima i ostalim.
Lupao glavu danas i evo došao do nekog rešenja kad je obična lista u pitanju:

Code:
niz = [23, 33, 44, 55, 11]
niz_deo = len(niz) - 1
max = [niz[0]]
for i in niz[1:niz_deo]:
    if i%2 != 0 and i > niz[0]:
        max.append(i)
        max1 = max.pop(0)
kolona = niz.index(max[0]) + 1
print('Najveći neparni broj je u koloni: ', kolona)


rezultat:

Najveći neparni broj je u koloni: 4

Onda sam krenuo na listu lista, tj matricu i jasno mi je da treba da imam dve petlje

niz = [[23, 33, 44, 55, 11],
[13, 39, 74, 85, 61],
[67, 49, 94, 37, 10],
[42, 66, 44, 83, 27]]

Code:
max = niz[0][0]

for i in niz:
    for j in i:
        if j%2 != 0 and j > max:


ali imam problem sa upoređivanjem veličine dva broja.
Ovako u prvom prolazu upoređujem j sa prvim brojem u matrici,
ali ne vidim kako da taj max broj posle zamenjujem brojem iz prethodnog prolaza kako prolazim kroz petlju.
Re: Zadaci za wannabe pythoniste 18.01.2020. u 15:13 · pre 82 meseca #187
Mislim da tebi ozbiljno nedostaje algoritamski nacin razmisljanja. Nisam pomenuo uzaludno onu analogiju sa kanapom i vrstom ljudi. Recimo da treba da nadjes najviseg coveka, sta ces uraditi? Imas kanap i lenjir. Znaci, uzmes kanap, stanes ispred prvog coveka, izmeris ga od pete do glave i tacku na kanapu koja dodiruje vrh njegove glave uhvatis prstima (ili vezes cvor, obelezis flomasterom ... sta god ...). Stanes ispred sledeceg, izmeris ga ... pa ako je polozaj prstiju/cvora/fleke na kanapu iznad njegove glave, znaci on je nizi od prethodnog, tako da ides dalje ne menjajuci polozaj prsta ... kada nadjes nekog viseg, pomeras prst navise (ili vezes novi cvor). Na kraju, kada prodjes celu vrstu ljudi, uzmes lenjir i izmeris duzinu kanapa od pocetka do pozicije na kojoj se finalno nalazi prst (odnosno vezao cvor ili sta vec ...) Znaci:
Code:
ljudi = [ 165, 190, 185, 172, 168, 173, 189, 188 ]   # Visine ljudi u vrsti
kanap = ljudi[0]   # Stajem ispred prvog coveka i izmerim ga
covek = 0            # Njegova pozicija je 0
for id, h in enumerate(ljudi):
    if h > kanap:      # Ako je glava coveka iznad kanapa - nasli smo viseg!
        kanap = h      # Pomeramo prst na njegovu visinu
        covek = id      # Upisujemo njegovu poziciju
print 'Najvisi covek u stroju je # ' + str(covek) + ', njegova visina izmerena kanapom je: ' + str(kanap)

Gornje resenje radi dobro, osim za specijalan slucaj kada rekord u visini deli vise ljudi. Onda bi verovatno trebalo da pamtis negde pozicije tih rekordera. Nije tesko izmeniti program da to postigne:
Code:
ljudi = [ 165, 191, 185, 172, 168, 190, 190, 188 ]   # Visine ljudi u vrsti
kanap = ljudi[0]         # Stajem ispred prvog coveka i izmerim ga
covek = [ 0 ]            # Upisujem ga u listu visinskih rekordera
for id, h in enumerate(ljudi):
    if h > kanap:        # Ako je glava coveka iznad kanapa - nasli smo viseg!
        kanap = h        # Pomeramo prst na njegovu visinu
        covek = [ id ]   # Ispraznimo listu i zapamtimo njegovu poziciju 
    elif h == kanap and id > 0:  # Naisao si na coveka iste visine kao trenutno najviseg, ali koji nije prvi sleva
        kanap = h
        covek.append(id) # Dodaj poziciju na listu
if len(covek)>1:
    print 'Najvisi ljudi u stroju su na pozicijama # ' + str(covek) + ', njihovavisina izmerena kanapom je: ' + str(kanap)
else:
    print 'Najvisi covek u stroju je na poziciji # ' + str(covek[0]) + ', njegova visina izmerena kanapom je: ' + str(kanap)


Ovo je zaista bukvar programiranja i prvi zadatak koji se uci na prvim casovima, danas cak i u osnovnoj skoli. Tebi je potrebna dobra knjiga koja se bavi algoritmima i strukturama podataka. Programiranje ne moze da se uci bez sustinskog razumevanja nacina rada, odnonso algoritma programa.
Re: Zadaci za wannabe pythoniste 18.01.2020. u 15:56 · pre 82 meseca #188
Cek ti pamtis sve duplikate bez obzira da li je max visina ili nije? Zar ne bi trebalo prvo da odradis maksimum pa onda skupis sve ljude sa datom visinom?

recimo:
Code:

import Data.List
collect l = (foldl (\m (i,h) -> if h == max_h then (i:m) else m) [] $ zip [0..] l , max_h)
    where max_h = maximum l
main = do
    let ljudi = [ 165, 191, 185, 172, 191, 168, 190, 190, 188 ]
    print $ collect ljudi


Code:

~/examples/haskell >>> ./maxheight                                                                                                                                                                                       
([4,1],191)


Re: Zadaci za wannabe pythoniste 18.01.2020. u 16:35 · pre 82 meseca #189
Citat:
Branimir Maksimovic: Cek ti pamtis sve duplikate bez obzira da li je max visina ili nije? Zar ne bi trebalo prvo da odradis maksimum pa onda skupis sve ljude sa datom visinom?
Samo ako su ti ljudi isti kao i trenutni maksimum. U suprotnom, kada se pojavi novi maksimum lista se brise. Recimo, ako je niz [ 180 190 190 195 194 195 193 ], tada pamtim pozicije 1 i 2 (gde su ovi od 190), ali kada naidje ovaj 195 na poziciji 3, niz [1, 2] se brise i dobija vrednost [3]. Na kraju liste bice [3, 5]. Ovo mi je prvo palo na pamet i zahteva samo jedan prolaz kroz listu. Ova tvoja ideja zahteva dva prolaza, ako se ne varam? Ne poznajem haskell uopste. Sigurno ima i boljih resenja, ovo je bio sam brzinski demo ...
Re: Zadaci za wannabe pythoniste 18.01.2020. u 16:43 · pre 82 meseca #190
Citat:
B3R1:
Mislim da tebi ozbiljno nedostaje algoritamski nacin razmisljanja. Nisam pomenuo uzaludno onu analogiju sa kanapom i vrstom ljudi.

Ovo je zaista bukvar programiranja i prvi zadatak koji se uci na prvim casovima, danas cak i u osnovnoj skoli. Tebi je potrebna dobra knjiga koja se bavi algoritmima i strukturama podataka. Programiranje ne moze da se uci bez sustinskog razumevanja nacina rada, odnonso algoritma programa.


Hvala na vrlo plastičnom i jasnom primeru. Pomogao je.
Počeo sam inače da idem kroz Guttagovu knjigu koju si preporučio. Doduše ide polako, ali važno je da napredujem.

Analizirajući tvoj primer, rešio sam i nalaženje najvećeg broja za matrix.

niz = [[23, 33, 44, 55, 11],
[13, 39, 74, 85, 61],
[67, 149, 94, 37, 10],
[42, 66, 44, 83, 27]]

max = niz[0][0]
for i in niz:
for j in i:
if j%2 != 0 and j > max:
max = j
print('Najveći broj je', str(max))

Da bih našao njegovu poziciju, da li i u matrixu mogu da nađem index sa nečim sličnim kao niz.index(max), kao što to radi u običnoj listi?

brojevi = [23, 54, 65, 3, 4, 5, 6, 16, 33, 44]

brojevi.index(65)
2
Re: Zadaci za wannabe pythoniste 18.01.2020. u 16:59 · pre 82 meseca #192
Citat:
ali imam problem sa upoređivanjem veličine dva broja.
Ovako u prvom prolazu upoređujem j sa prvim brojem u matrici,
ali ne vidim kako da taj max broj posle zamenjujem brojem iz prethodnog prolaza kako prolazim kroz petlju.

Napisao sam ti u gornjem postu. Na primer:

Code:
for i in niz:
    for j in i:
        if j%2 != 0 and j > m:
            m = j
            p = i.index(j)         
print(m, p)
85 3

Ili sa enumerate:

for i in niz:
    for index, j in enumerate(i):
        if j%2 != 0 and j > m:
            m = j
            p = index

Sa range i len:

for i in niz:
    for index in range(len(i)):
        if i[index] % 2 != 0 and i[index] > m:
            m = i[index]
            p = index

Bez pomoćnih funkcija:

for i in niz:
    c = 0
    for j in i:
        if j % 2 != 0 and j > m:
            m = j
            p = c
       c+=1


Kao što možeš da vidiš iz navedenih primera, Python ima dosta ugrađenih (built-in) funkcija, pored pomenutih, za tvoj zadatak možeš da iskoristiš npr. max() za najveći broj ili filter() da filtriraš neparne brojeve. Na primer:

Code:
max(filter(lambda n: n[1] % 2 == 1, [(index, row) for sub in niz for index ,row in enumerate(sub)]), key=lambda i: i[1])

(3, 85)


https://docs.python.org/3/library/functions.html
Re: Zadaci za wannabe pythoniste 18.01.2020. u 17:09 · pre 82 meseca #193
Bogami, ima dosta načina. Pribeležiću ih.
A ja ni da ubodem makar jedan :))

Za max() sam znao, ali zadatak je bio da se uradi sa for petljom, pa nisam hteo da sabotiram.
Re: Zadaci za wannabe pythoniste 18.01.2020. u 17:52 · pre 82 meseca #194
Citat:
a1234567:
Analizirajući tvoj primer, rešio sam i nalaženje najvećeg broja za matrix.

Ok, odlican pocetak! Ali ja sam ti nasao jedan bag ... ako je niz[0][0] paran broj veci od svih ostalih (npr. 1000), a ostatak matrice ima i neparne brojeve manje od 1000 najveci neparan broj ce biti pogresno ispisan da bude niz[0][0].

Analogija s kanapom: ako su vrsti ljudi stoje samo muskarci, a tebi je zadatak da nadjes najvisu zenu, ako podjes redosledom da meris prvog coveka bez obzira na pol - tu si pogresio. Znaci, moraces da kanap drzis smotan dok ne naidjes na prvu zenu u vrsti. Ako ne naidjes - rezultat je da medju ljudima nema nikoga zenskog pola.

Imas dva resenja: ako se zadatak ogranici samo na skup prirodnih brojeva, tada je ispravka jednostavna i svodi se na zamen linije:
max = niz[0][0]

alternativnom linijom:
max = -1

Takodje, print na kraju programa mora da postane:
if max < 0:
print 'Matrica ne sadrzi neparne brojeve'
else:
print('Najveći broj je', str(max))

Ako program mora da radi nad skupom celih brojeva, tada ces morati da primenis ovu analogiju s kanapom, pa program postaje nesto slozeniji (ali ne preterano):
Code:
m = niz[0][0]                      # Najveci neparan broj
xm = -1                            # Vrsta sa max neparnim brojem
ym = -1                            # Kolona sa max neparnim brojem

for x, i in enumerate(niz):
    for y, j in enumerate(i):

#  Ako je broj paran, vrti dalje
        if j%2 == 0:
            continue

#  Ako jos nismo nasli prvi neparan broj ILI ga vec imamo, ali ovaj neparan broj je veci ...
        if (xm < 0) or (xm >=0 and j > m): 
            m = j
            xm = x
            ym = y

# Ispis
if (xm < 0):
    print 'Matrica nema neparne brojeve'
else:
    print 'Maksimum %d se nalazi na poziciji: [%d,%d]' % ( m, xm, ym)


U svakom slucaju, napredujes odlicno, svaka cast!
Re: Zadaci za wannabe pythoniste 19.01.2020. u 02:50 · pre 82 meseca #195
U ovom drugom primeru mi nije jasno šta ti radi prva polovina ove linija:
if (xm < 0) or (xm >=0 and j > m):

Kad je skratim samo na
if j > m:

Program i dalje radi kako treba.
Re: Zadaci za wannabe pythoniste 19.01.2020. u 07:10 · pre 82 meseca #197
Citat:
a1234567:
U ovom drugom primeru mi nije jasno šta ti radi prva polovina ove linija:
if (xm < 0) or (xm >=0 and j > m):

Kad je skratim samo na
if j > m:

Program i dalje radi kako treba.


Dobro si to uocio. Za sve vrednosti xm ovo prolazi tako da xm ne utice na uslov.

Re: Zadaci za wannabe pythoniste 19.01.2020. u 11:44 · pre 82 meseca #198
Evo novog zadatka, ovog puta jedan od klasicnih algoritama. Ostajemo u svetu nizova i matrica.

Dat je veoma dugacak niz prirodnih brojeva, sortiranih u rastucem redosledu - niz = [ 3, 7, 11, 21, 25, 38, 41 ... ], kao i prirodni broj n (npr. n=123). Ubaciti broj n u niz, na odgovarajuce mesto, tako da niz ostane sortiran. Program treba da radi optimalno i za ekstremno velike nizove.

Na prvi pogled, zadatak je jednostavan: prodjes kroz niz od prvog do poslednjeg elementa, pa kada vidis zgodno mesto tu broj zasadis. To je tzv. linearni algoritam i njegova slozenost je O(n), jer je vreme izvrsavanja programa u opstem slucaju proporcionalno velicini niza. Moze li bolje i efikasnije?

Prednog u odgovoru ima postavljac teme, ostali neka se za sada uzdrze ...
Re: Zadaci za wannabe pythoniste 19.01.2020. u 12:40 · pre 82 meseca #199
Evo, javlja se postavljač :)

Ja sam došao do ovakvog rešenja

Code:
niz = [3, 7, 11, 21, 25, 38, 41, 95, 118, 129, 144, 153]
n = 138

for i in niz:
    if i > n:
        ind = niz.index(i)
        niz.insert(ind, n)
        print(niz)
        break


[3, 7, 11, 21, 25, 38, 41, 95, 118, 129, 138, 144, 153]
Re: Zadaci za wannabe pythoniste 19.01.2020. u 13:04 · pre 82 meseca
izmenjeno 1 put, poslednji put Branimir Maksimovic 19.01.2020. u 13:21
  1. Branimir Maksimovic19.01.2020. u 13:21zapis iz teksta poruke
#200
Koja je kompleksnost index f-je? Pretpostavljam da je O(n), pa je to ukupno kvadratna slozenost... sto je gore od predlozenog resenja.

edit:
nije kvadratna nego 2n :P
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme