Informatika2-2015/Gyakorlat02
(egy szerkesztő 2 közbeeső változata nincs mutatva) | |||
53. sor: | 53. sor: | ||
Részletes leírás a [[Informatika2-2015#H.C3.A1zi_feladatok_.C3.A9s_labor_feladatok|tárgylapon]]. | Részletes leírás a [[Informatika2-2015#H.C3.A1zi_feladatok_.C3.A9s_labor_feladatok|tárgylapon]]. | ||
+ | |||
+ | == Házi Feladat == | ||
+ | |||
+ | A '''pasziansz''' feladathoz az eredeti kód itt van, ha valaki véletlenül eltüntette volna a rendszerben: | ||
+ | |||
+ | <python># Megmondja egy kártyáról hogy fekete-e | ||
+ | def fekete(kartya): | ||
+ | szam, szin = kartya | ||
+ | fekete_szinek = ["pikk", "treff"] | ||
+ | if szin in fekete_szinek: | ||
+ | return True | ||
+ | else: | ||
+ | return False | ||
+ | |||
+ | # Ez a függvény megmondja a legjobb kirakható | ||
+ | # sor értékét. | ||
+ | def pasziansz(kez): | ||
+ | # Ha egy kártyánk sincs, 0 pont a max. | ||
+ | if len(kez) == 0: | ||
+ | return 0 | ||
+ | |||
+ | # Csökkenö sorrendbe tesszük a kártyákat. | ||
+ | kez.sort(reverse=True) | ||
+ | |||
+ | # Az első kártya a legértékesebb. | ||
+ | elozo = kez[0] | ||
+ | pont = elozo[0] | ||
+ | del kez[0] | ||
+ | |||
+ | # Mindig megkeressük a legértékesebb lapot, | ||
+ | # ami lehet a következö, mert más szinü. | ||
+ | # Ezt addig csináljuk amig találunk ilyent | ||
+ | talalt = True | ||
+ | while talalt: | ||
+ | talalt = False | ||
+ | # Csökkenő sorrendben végigmegyünk a kártyákon | ||
+ | for i in range(len(kez)): | ||
+ | lap = kez[i] | ||
+ | # Ha a kártya különbözö szinü, betesszük, | ||
+ | # és kitöröljük a kártyák listájáról | ||
+ | if fekete(elozo) != fekete(lap): | ||
+ | talalt = True | ||
+ | elozo = lap | ||
+ | pont += lap[0] | ||
+ | del kez[i] | ||
+ | break | ||
+ | return pont</python> | ||
+ | |||
+ | == Feladatok megoldása == | ||
+ | |||
+ | === kiertekel === | ||
+ | |||
+ | <python>def kiertekel(cel, l): | ||
+ | osszpont = 0 | ||
+ | cel_x, cel_y = cel | ||
+ | for lo_x, lo_y in l: | ||
+ | osszpont += pontertek(lo_x - cel_x, lo_y - cel_y) | ||
+ | return osszpont</python> | ||
+ | |||
+ | === kozel === | ||
+ | |||
+ | <python>def skalar_szorzat(a, b): | ||
+ | szorzat = 0 | ||
+ | for i in range(len(a)): | ||
+ | szorzat += a[i] * b[i] | ||
+ | return szorzat | ||
+ | |||
+ | def kozel(l): | ||
+ | max_szorzat = skalar_szorzat(l[0], l[1]) | ||
+ | for i in range(len(l)): | ||
+ | for j in range(i+1, len(l)): | ||
+ | max_szorzat = max(max_szorzat, skalar_szorzat(l[i], l[j])) | ||
+ | return max_szorzat</python> | ||
+ | |||
+ | === vananagram === | ||
+ | |||
+ | Az a hiba, hogy a 24. sorban '''l[j]''' helyett '''l[i]''' van írva. | ||
+ | |||
+ | == Házi feladatok megoldása == | ||
+ | |||
+ | === madarnyelv_dekod === | ||
+ | |||
+ | <python>def madarnyelv_dekod(szo, szotar): | ||
+ | for szotar_szo in szotar: | ||
+ | if szo == madarra(szotar_szo): | ||
+ | return szotar_szo | ||
+ | return None</python> | ||
+ | |||
+ | === pasziansz === | ||
+ | |||
+ | Akkor van baj, ha valamelyik színből több van mint a másikból, de a legértékesebb lap nem ebből a színből van, mert akkor a másik színnel kezdjük a tevést, és így eggyel kevesebbet tudunk tenni ebből a színből, mint lehetne. Egy lehetséges megoldás, hogy miután leraktam az eredeti módszerrel minden kártyát amit lehetett, ha a maradék kártyák más színűek mint az első kártya, akkor még az első kártya elé tehetek belőlük egyet, a legértékesebbet. Ebben a megoldásban a ''return'' előtti 3 sor a módosítás: | ||
+ | |||
+ | <python># Ez a függvény megmondja a legjobb kirakható | ||
+ | # sor értékét. | ||
+ | def pasziansz(kez): | ||
+ | # Ha egy kártyánk sincs, 0 pont a max. | ||
+ | if len(kez) == 0: | ||
+ | return 0 | ||
+ | |||
+ | # Csökkenö sorrendbe tesszük a kártyákat. | ||
+ | kez.sort(reverse=True) | ||
+ | |||
+ | # Az els? kártya a legértékesebb. | ||
+ | elso = kez[0] | ||
+ | elozo = kez[0] | ||
+ | pont = elozo[0] | ||
+ | del kez[0] | ||
+ | |||
+ | # Mindig megkeressük a legértékesebb lapot, | ||
+ | # ami lehet a következö, mert más szinü. | ||
+ | # Ezt addig csináljuk amig találunk ilyent | ||
+ | talalt = True | ||
+ | while talalt: | ||
+ | talalt = False | ||
+ | # Csökken? sorrendben végigmegyünk a kártyákon | ||
+ | for i in range(len(kez)): | ||
+ | lap = kez[i] | ||
+ | # Ha a kártya különbözö szinü, betesszük, | ||
+ | # és kitöröljük a kártyák listájáról | ||
+ | if fekete(elozo) != fekete(lap): | ||
+ | talalt = True | ||
+ | elozo = lap | ||
+ | pont += lap[0] | ||
+ | del kez[i] | ||
+ | break | ||
+ | |||
+ | # Ha a maradek kartyakbol egy meg a sor elejere | ||
+ | # teheto, tegyuk oda. | ||
+ | if len(kez) != 0: | ||
+ | if fekete(elso) != fekete(kez[0]): | ||
+ | pont += kez[0][0] | ||
+ | |||
+ | return pont</python> |
A lap jelenlegi, 2015. március 19., 13:54-kori változata
Tartalomjegyzék |
2. gyakorlat - Függvényhívás, hibajavítás
Ezen a gyakorlaton is még főleg az előző féléves Informatika 1 anyagát ismételjük, az ott tanultakat kell használni. Amire biztosan szükség lesz ma:
- Python alapjai, futtatása; karakterláncok; elágazások, ciklusok; függvények definiálása: Informatika1-2014/eloadas3
- Listák, szótárak: Informatika1-2014/eloadas4
Ha valaki nem hallgatta ezt a tárgyat, és nincs tisztában a python alapjaival, nyugodtan kérdezzen laboron, és igyekezzen egy-két héten belül behozni a lemaradást.
Feladatok
Feladatok a CloudCoder-en megtalálhatóak. Ajánlott sorrend:
- kiertekel
- kozel
- vananagram
A vananagram feladathoz az eredeti kód itt van, ha valaki véletlenül eltüntette volna a rendszerben:
# Ez a függvény megszámolja egy szóban hogy melyik # betü hányszor szerepel, és egy szótárban visszaadja def betuszamolo(szo): szamolo = {} for betu in szo: # Ha már volt ilyen betü, növeljük a számát if betu in szamolo: szamolo[betu] += 1 # Ha még nem volt ilyen betü, most már egyszer volt else: szamolo[betu] = 1 return szamolo # Ez a függvény megmondja hogy a szavak listájában van-e # anagramma pár def vananagram(l): # Ez a két for ciklus végigmegy minden i, j páron # hogy i < j < len(l) for i in range(len(l)): for j in range(i+1, len(l)): # Megszámoljuk mindkettöben a betüket, és # összehasonlítjuk a kettöt i_szamolo = betuszamolo(l[i]) j_szamolo = betuszamolo(l[i]) if i_szamolo == j_szamolo: return True # Ha nem volt anagramma, False-al térünk vissza return False
CloudCoder használata
A legtöbb python feladathoz gyakorlaton egy CloudCodernek nevezett rendszert fogunk használni. Ennek elõnye, hogy helyben ki is javítja a feladatot. Elérés:
Részletes leírás a tárgylapon.
Házi Feladat
A pasziansz feladathoz az eredeti kód itt van, ha valaki véletlenül eltüntette volna a rendszerben:
# Megmondja egy kártyáról hogy fekete-e def fekete(kartya): szam, szin = kartya fekete_szinek = ["pikk", "treff"] if szin in fekete_szinek: return True else: return False # Ez a függvény megmondja a legjobb kirakható # sor értékét. def pasziansz(kez): # Ha egy kártyánk sincs, 0 pont a max. if len(kez) == 0: return 0 # Csökkenö sorrendbe tesszük a kártyákat. kez.sort(reverse=True) # Az első kártya a legértékesebb. elozo = kez[0] pont = elozo[0] del kez[0] # Mindig megkeressük a legértékesebb lapot, # ami lehet a következö, mert más szinü. # Ezt addig csináljuk amig találunk ilyent talalt = True while talalt: talalt = False # Csökkenő sorrendben végigmegyünk a kártyákon for i in range(len(kez)): lap = kez[i] # Ha a kártya különbözö szinü, betesszük, # és kitöröljük a kártyák listájáról if fekete(elozo) != fekete(lap): talalt = True elozo = lap pont += lap[0] del kez[i] break return pont
Feladatok megoldása
kiertekel
def kiertekel(cel, l): osszpont = 0 cel_x, cel_y = cel for lo_x, lo_y in l: osszpont += pontertek(lo_x - cel_x, lo_y - cel_y) return osszpont
kozel
def skalar_szorzat(a, b): szorzat = 0 for i in range(len(a)): szorzat += a[i] * b[i] return szorzat def kozel(l): max_szorzat = skalar_szorzat(l[0], l[1]) for i in range(len(l)): for j in range(i+1, len(l)): max_szorzat = max(max_szorzat, skalar_szorzat(l[i], l[j])) return max_szorzat
vananagram
Az a hiba, hogy a 24. sorban l[j] helyett l[i] van írva.
Házi feladatok megoldása
madarnyelv_dekod
def madarnyelv_dekod(szo, szotar): for szotar_szo in szotar: if szo == madarra(szotar_szo): return szotar_szo return None
pasziansz
Akkor van baj, ha valamelyik színből több van mint a másikból, de a legértékesebb lap nem ebből a színből van, mert akkor a másik színnel kezdjük a tevést, és így eggyel kevesebbet tudunk tenni ebből a színből, mint lehetne. Egy lehetséges megoldás, hogy miután leraktam az eredeti módszerrel minden kártyát amit lehetett, ha a maradék kártyák más színűek mint az első kártya, akkor még az első kártya elé tehetek belőlük egyet, a legértékesebbet. Ebben a megoldásban a return előtti 3 sor a módosítás:
# Ez a függvény megmondja a legjobb kirakható # sor értékét. def pasziansz(kez): # Ha egy kártyánk sincs, 0 pont a max. if len(kez) == 0: return 0 # Csökkenö sorrendbe tesszük a kártyákat. kez.sort(reverse=True) # Az els? kártya a legértékesebb. elso = kez[0] elozo = kez[0] pont = elozo[0] del kez[0] # Mindig megkeressük a legértékesebb lapot, # ami lehet a következö, mert más szinü. # Ezt addig csináljuk amig találunk ilyent talalt = True while talalt: talalt = False # Csökken? sorrendben végigmegyünk a kártyákon for i in range(len(kez)): lap = kez[i] # Ha a kártya különbözö szinü, betesszük, # és kitöröljük a kártyák listájáról if fekete(elozo) != fekete(lap): talalt = True elozo = lap pont += lap[0] del kez[i] break # Ha a maradek kartyakbol egy meg a sor elejere # teheto, tegyuk oda. if len(kez) != 0: if fekete(elso) != fekete(kez[0]): pont += kez[0][0] return pont