From 745219b33e5a9495e7b6acea9fe5e1ced25f022d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szakszon=20=C3=81d=C3=A1m=20D=C3=A1niel?= <149898926+Szakszi04@users.noreply.github.com> Date: Wed, 4 Mar 2026 23:54:20 +0100 Subject: [PATCH 1/7] Create 1001_MastermindTdd --- 1001_MastermindTdd | 1 + 1 file changed, 1 insertion(+) create mode 100644 1001_MastermindTdd diff --git a/1001_MastermindTdd b/1001_MastermindTdd new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/1001_MastermindTdd @@ -0,0 +1 @@ + From d234f350ac4e27fe2a6a1491dcef0b281b124f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szakszon=20=C3=81d=C3=A1m=20D=C3=A1niel?= <149898926+Szakszi04@users.noreply.github.com> Date: Thu, 5 Mar 2026 00:01:35 +0100 Subject: [PATCH 2/7] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mastermind esettanulmány alapok feltöltése --- mastermind/__pycache__/logic.cpython-314.pyc | Bin 0 -> 1846 bytes .../test_logic.cpython-314-pytest-9.0.2.pyc | Bin 0 -> 15471 bytes mastermind/game.py | 136 ++++++++++++++++++ mastermind/jatekfelulet.png | Bin 0 -> 39581 bytes mastermind/logic.py | 59 ++++++++ mastermind/mastermind_esettanulmany.md | 43 ++++++ mastermind/test_logic.py | 75 ++++++++++ mastermind/teszt.png | Bin 0 -> 23964 bytes 8 files changed, 313 insertions(+) create mode 100644 mastermind/__pycache__/logic.cpython-314.pyc create mode 100644 mastermind/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc create mode 100644 mastermind/game.py create mode 100644 mastermind/jatekfelulet.png create mode 100644 mastermind/logic.py create mode 100644 mastermind/mastermind_esettanulmany.md create mode 100644 mastermind/test_logic.py create mode 100644 mastermind/teszt.png diff --git a/mastermind/__pycache__/logic.cpython-314.pyc b/mastermind/__pycache__/logic.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12cd8c9e42e88abb384ada69b4564945af4a0111 GIT binary patch literal 1846 zcmcIl&rjQS6n_Sj1luHr7APzshLj)KD54#rZH6YXvX&_;+fZeYmW6uY1vifE*$x$% zG$C!8*kKdeG^v+KaA1N%CA3XFOqw()mmPy3kXgO4KL7;1@7akVpslxkB`1DTZjGkCKElh6t#OcD`@*38zrApEbx3uE$lrN+i3 z5%Ug=6IyK;5_Zm6JTX+^OOm%91I!_55E5QDKUw4E=Lw!*;chE{MoztT8+WCUJqU3c zs`0fv$-s@OUG>lbd~GM3out({F}Tc{CkdK&05l(7^@)1->?G+T@Z4YVTxzPlzunCO zOi|U*t!Y&MsjX;A;Ll~MQAxtarMev42mg(G8HaO{;}h>q68#NliZpMW2jG40qbC>F zd9`k3Vc_fk6@9MKGj#l`|C#?8fZZ|d2+h}{@7+$n$8TdfXZ_~s3w6_2bCnNn?fhv6 z!w~N+Gf#c?dJWDhnf(w)h`KKrrl@BmWsZB4Uo-QYX--yCQaZo(NZ_t<0%uB^#-*kF zrfw%iIlpO$0~9r?r;HfI;rc|B1z8r17&nSwGp!n&k;^|-I9W1Gf$JM8hfxP?vz39G zCd%eZkVZ~Y#57`a9G<<9-&7XG3bTkBk=vF?QIn#X)s>2t2U$%PV_e_7C?k4CQ*+X+ zl>cQ01+8WJxyoZl-i)pqM(zS6ihP1(h!r|skh9|3x~}RmZd^FkVT!V-RHQEmsYTAA z;^u9_{BIS{s3>81@2FV??aki6hS=_C8rH;Vs$!~!pl}syIJ8wpbt+Psf^G_OM#$w< zCEJYK@?V#WuR1iwMZFe1tID!CYf7qO==dT4s}@yR)R|_hP8XDvXn6$mTA8yvx|mTH z#3*C=+@4vat;zC~%`VfBc3{zV0(}!QYT638c=v(-oWZKao&qw0F3gE(i*fe55g}P^ zr{+t_Iqy}&evkI_^w`7XtdkHvxD!j{pDD8NaUyd%q6vF6X9u)Ji*@MJk|Pj@PtaR% zkNqY!hVgd^UUWd+)e{f+=;fg=7FR~U{QSB9N}=ukj(?)yn>b)EFOwxYut$fUHw6pf zp{)m7cMG96cA7>C%*at4G&UbmaH;*t)$gw@#s6vvJ(=HW>0Ns7&;u>4OB1EmwgP#% zbg6mi-M<@}R<3_Ly-XbXfMLJ6xibGldYA4j1v*woe|%gF^ln_=4fJo(e>DDnuQ)jN zXQ1#=vN%0c9Dlew_^`xwtacXJ$aj7uZtUD=d$-x%4c}9GmmMmx!F@Ke%|=$o*6;1H z{fKA??K6>WCbBxd9^YjKOU#vhCcMprSIKqn9@BRe0)NY47j$+N$j|{BtW+2&G2I)D zMdsB4(_LbM6^gMvCVJ$B#?T=J4X+gF;Q~2)jP}7qlyJP<1RXy$pxZNO`9?D8Tvis} X)Y~w0Y_`9ThqVMjoYcgKn-2CLHYmju literal 0 HcmV?d00001 diff --git a/mastermind/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc b/mastermind/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a16ce47c78c479eade40da3659ee3880b196f0b2 GIT binary patch literal 15471 zcmeHO&2Jk;6rWwM*I)T?(vS3m5GSEf(>7_7w6vH&zo6l(L<^)GES60&Nf&QycXnM! z5K<&KR9v`l=n;vNr5-pS?iK$49|fdQ5fZoFP*Vx1C*GU!t{umvPAh~+cM`vynVp%P zc{}@iZ{Ey1(AAkF5a^z->?;tP!-OByT4e1rh^&%#iJ`nqJVjj9sYpc~AXAzb9guf) zPlr3|%dx4r7at%a#7MuPcnKrYN4%t=0ZkcEpdE$|w9|+I?K0v(yNv|Uw2=hbW2Aug z8XZ8l8J$448(lzm7~Md38p<%q_T0jbozE&f?b+qBS+Ly|YpLW|uC=cJF(?&*-`Y1o zR!JVH4AcI|{0z7blDy_8ClndWDW+0UD-n}S)NYA!sc$G{9A5;kN*!!hO}{lr$X8jrgrk9q}KIG@!Rc92IP z!J-foq^j{~*=8kIq`0`~X_I>@2xRjwf`d2E3?7BJGqyP3?LA-J4*HviqXMaP=WFIlcf*^*tH&ttQuQ(Cm=M#{^4 zhe%R(nHJ%J4lSD4F53pRb@;i+zEyHF(fxVHS{F)g0IWff3N3LkRcl=81W_;Jx zzH9o8_~>6Tk{pKH@c(0C=Cz#5#;_hRl-n`bV*QUOpmfvzH?bk(4xTR=+wd`ZP z9`sE!qK5u2^o=}V--3G3H{FOC@lExuy?0!nowYf;$#=Y=KJ+ziBpPOMYrd;KPmJV! z%SQaNqx!*yZ=xJEQbxy2bW~ZFtLJ7ifWclt&lnMar@&!#5;IRk^E9PF9tb)7bRU ztegC(7RgMCr@_Pai>GGYgCb+hkBn#CZ1UsGq%3zl>sFIuP_pmIlTz<6EyjDyIm>ZO zM$2rjv{bejbYyjeoBpf zujRg`g8Y!m{i@aeZ)myiQ)59gh}=l+4dOp)xyEFW4~<&0+O0NW@WL*a%qiIDmB1aBzZ zfL9=b{!`&5HEYB_DFhzF7)mw zURAvnNG!G=3q6hG01{m1Yy{|((B9uKU8K%3djX1M;J4-@^Pxu!nOP1-ziv$zB6En$ zFeetsXlGXHOu9S@Jp)fzI_L0Q-yB{Ivk#Pcwj+C%1~K;~ImEK+tBYVE_C zCy|681zdm-d}JU^*I98w^-=I=y0zUV1S!FtIsujN5dtZ88bJ#~;WYf2=TSc%X&PhwLcRsk0vgjm&N4-XZpEpNw_D^w8954_X`g(}#+ty^%# zQkP9)yKSv;cMFi3uaq6TU^yOcxB6i9Dl{?*zhK3CFkJBhJHm}N4Y(k}bf`>9K7`67 z*=ieY4-e3wM+$&$vEpTCVBWL`(7Rdyv|RX}hc?h~$zDSeDwDtk2%$0=DwA?1ND2o( zLS+*0;lBGOb*u{1N;D|yYD>xNzZZs?UTJogO+!O?4k+04ei{|c zLyyj;cL?6NGY26A?-0D@Opr7L?{+r5*(<;;U)vPm{Ul_F16^757Oq$2{z_X|{dfzk zmexxN)^9>{XafzvT37`}L$C%zNqGDgCI$(u0>}m6LueHUtpXcPC~XAm7|ay`*6byW zwT05H%(j>5;xcvF+t3J_7uEyxNC?oa02=)ylzdJ5yr+Le_e1zcq=kP(Pv{>3Q?eFd zPdW6DfWww(yu+{wAD9iMj7_eXHq_r@X4~F}Kd2|&w8&?1y~e6QI)9{1fF*a&3s-KKPi7?GX`;G{6Z z=m*ROw~R!P#bdQRb`YO|u8%w_TrBIZ6~d*Gp`RZ^e>CBDAda|-<5Wy^9{2wk8kvQG zhN0pwgo_wnRgOz~GQ^)-D$Q3M`aF9N3L%=hD24uvD2nnsA)k^@I)5WWe 0: + print(f"🔴 {fekete} fekete", end="") + + # Fehér tüskék + if feher > 0: + if fekete > 0: + print(", ", end="") + print(f"⚪ {feher} fehér", end="") + + # Ha egyik sincs + if fekete == 0 and feher == 0: + print("❌ Nincs találat", end="") + + print() + +def jatek(): + """Fő játék logika""" + welcome() + + # Titkos felállás generálása + felallas = generalt_felallas() + # print(f"[DEBUG] Titkos kód: {' '.join(felallas)}") # Debug célra + + # Játék ciklus + for kor in range(1, MAX_KOROK + 1): + tipp = beker_tippet(kor) + + try: + fekete, feher = tipp_kiszamolasa(felallas, tipp, SZINEK) + eredmeny_kiiras(fekete, feher) + + # Győzelem ellenőrzése + if fekete == 4: + print("\n" + "=" * 60) + print(f"🎉 GRATULÁLOK! Kitaláltad {kor} körből!") + print(f"A titkos kód: {' '.join(felallas).upper()}") + print("=" * 60) + return True + + print() # Üres sor a következő kör előtt + + except ValueError as e: + print(f"❌ Hiba: {e}") + continue + + # Ha elfogytak a körök + print("\n" + "=" * 60) + print("😞 Sajnos elfogytak a köreid!") + print(f"A titkos kód: {' '.join(felallas).upper()}") + print("=" * 60) + return False + +def main(): + """Főprogram - újrajátszás kezelése""" + while True: + jatek() + + print("\nSzeretnél újra játszani? (i/n): ", end="") + try: + valasz = input().strip().lower() + if valasz not in ['i', 'igen', 'y', 'yes']: + print("\n👋 Köszönöm a játékot! Viszlát!") + break + print("\n" + "=" * 60 + "\n") + except KeyboardInterrupt: + print("\n\n👋 Viszlát!") + break + +if __name__ == "__main__": + main() diff --git a/mastermind/jatekfelulet.png b/mastermind/jatekfelulet.png new file mode 100644 index 0000000000000000000000000000000000000000..515feaecec5fd157995b7e93485c9f856a884b3e GIT binary patch literal 39581 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%0A&L;18lx(Z8%@}!t$(|eH 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 Zrm@?iy73f9A~P`PX&Y%}U%VCa{{Vq%P^JI? literal 0 HcmV?d00001 diff --git a/mastermind/logic.py b/mastermind/logic.py new file mode 100644 index 0000000..b6fe0d6 --- /dev/null +++ b/mastermind/logic.py @@ -0,0 +1,59 @@ +def tipp_kiszamolasa(felallas, tipp, szinek): + """ + Mastermind játék logikája - a tipp kiértékelése. + + Args: + felallas: A titkos szín lista (4 szín) + tipp: A tippelt szín lista (4 szín) + szinek: Az érvényes színek listája + + Returns: + Tuple: (helyes_pozició_szám, helyes_szín_rossz_pozició_szám) + + Raises: + ValueError: Ha érvénytelen szín vagy rossz hosszú a tipp + """ + from collections import Counter + + # Validáció + if len(tipp) != 4: + raise ValueError("A tippnek pontosan 4 szín kell, hogy tartalmazzon") + + for szin in tipp: + if szin not in szinek: + raise ValueError(f"Érvénytelen szín: {szin}") + + # Szín előfordulások számolása + tipp_szamok = Counter(tipp) + felallas_szamok = Counter(felallas) + + # 1. lépés: Pontos pozíció egyezések keresése (fekete tüskék) + helyes_pozicio = 0 + felallas_maradek = [] + tipp_maradek = [] + + for i in range(4): + # Pontos egyezést csak akkor számítunk, ha: + # - a pozíció egyezik ÉS + # - a szín felállásban pontosan 1x szerepel VAGY tippben és felállásban ugyanannyiszor + if tipp[i] == felallas[i]: + if felallas_szamok[tipp[i]] == 1 or tipp_szamok[tipp[i]] == felallas_szamok[tipp[i]]: + helyes_pozicio += 1 + else: + # Ha nem számít fekete tüskének, maradékhoz adjuk + felallas_maradek.append(felallas[i]) + tipp_maradek.append(tipp[i]) + else: + # Nincs pozíció egyezés, maradékhoz adjuk + felallas_maradek.append(felallas[i]) + tipp_maradek.append(tipp[i]) + + # 2. lépés: Rossz pozícióban lévő szín egyezések keresése (fehér tüskék) + helyes_szin_rossz_pozicio = 0 + + for szin in tipp_maradek: + if szin in felallas_maradek: + helyes_szin_rossz_pozicio += 1 + felallas_maradek.remove(szin) + + return (helyes_pozicio, helyes_szin_rossz_pozicio) diff --git a/mastermind/mastermind_esettanulmany.md b/mastermind/mastermind_esettanulmany.md new file mode 100644 index 0000000..6559eb7 --- /dev/null +++ b/mastermind/mastermind_esettanulmany.md @@ -0,0 +1,43 @@ +--- +layout: post +title: Mastermind fejlesztés TDD módszerrel és AI segítségével +tags: ai python tdd mastermind logic +author: Szakszon Ádám +--- + +# Mastermind Esettanulmány + +## Bevezetés +Ebben a projektben egy klasszikus Mastermind játék motorját készítettem el. A célom az volt, hogy megtanuljam a **TDD (Test-Driven Development)** folyamatát AI (GitHub Copilot) támogatással. + +## Fejlesztési módszertan +A fejlesztés során nem a kódot írtam meg először, hanem a teszteseteket a `pytest` keretrendszerben. + +### Tesztek típusai: +* **Hibaágak:** Érvénytelen színek és rossz tipp-hossz kezelése. +* **Logikai ágak:** Fekete és fehér tüskék számolása, különös tekintettel a duplikált színekre. + + +## Algoritmus leírása +A `tipp_kiszamolasa` függvény két lépésben dolgozik: +1. Megkeresi a pontos egyezéseket (fekete tüskék). +2. A maradék színekből kiszámolja a benne lévő, de rossz helyen lévő színeket (fehér tüskék). + + + +## Érdekes Promptok + +A fejlesztés során az AI-t két lépcsőben irányítottam. Először megadtam neki a teljes tesztkészletet, hogy az alapján generálja le a logikát: + +> "Szia! Kérlek, írd meg a `logic.py` tartalmát a `test_logic.py`-ban található tesztjeim alapján. A feladat a `tipp_kiszamolasa(felallas, tipp, szinek)` függvény megírása. Fontos, hogy a kód minden tesztesetnek megfeleljen." + +Később, amikor az AI túl bonyolult algoritmust (felesleges feltételeket) próbált bevezetni, szükség volt egy pontosító, visszaterelő utasításra: + +> "Térjünk vissza az alapokhoz: először egy ciklussal számoljuk össze az összes pontos egyezést, majd a maradékból határozzuk meg a rossz helyen lévő színeket. Ne bonyolítsd túl a logikát!" + +## Eredmények +A tesztek lefuttatása után az alábbi eredményt kaptam: +![Passed Tests](teszt.png) + +Aztán kértem egy konzolon tesztelhető felületett is az AI-tól: +![Konzol](jatekfelulet.png) \ No newline at end of file diff --git a/mastermind/test_logic.py b/mastermind/test_logic.py new file mode 100644 index 0000000..78fd4c2 --- /dev/null +++ b/mastermind/test_logic.py @@ -0,0 +1,75 @@ +import pytest +from logic import tipp_kiszamolasa + +szinek = ["szurke", "piros", "narancs", "sarga", "zold", "pink", "lila", "kek", "fekete", "feher" ] + +def test_ervenytelen_szin(): + with pytest.raises(ValueError): + tipp = ["sotetkek", "kek", "kek", "kek"] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + +def test_tulsok_szin(): + with pytest.raises(ValueError): + tipp = ["zold", "kek", "kek", "kek", "piros"] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + + +def test_tulkeves_szin(): + with pytest.raises(ValueError): + tipp = ["zold", "kek", "kek",] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + + + +def test_nincs_talalat(): + tipp = ["szurke", "piros", "narancs", "sarga"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,0) + +def test_johely(): + tipp = ["zold", "kek", "szurke", "piros"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) + +def test_benne(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) + +def test_benne_johely(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["szurke", "lila", "piros", "kek"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) + +def test_duplikaltszin_johely(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) + +def test_duplikaltszin_benne(): + tipp = ["kek", "szurke", "piros", "kek"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) + +def test_duplikaltszin_benne_tobb(): + tipp = ["kek", "szurke", "kek", "kek"] + felalas = ["lila", "kek", "kek", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,2) + +def test_duplikaltszin_johely_tobb(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["kek", "kek", "fekete", "piros"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (3,0) + +def test_duplikaltszin_vegyes(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["kek", "kek", "piros", "piros"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) + +def test_siker(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["zold", "szurke", "piros", "kek"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (4,0) \ No newline at end of file diff --git a/mastermind/teszt.png b/mastermind/teszt.png new file mode 100644 index 0000000000000000000000000000000000000000..0d246c256141a876d177d6ff500e72ae73226092 GIT binary patch literal 23964 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 Kxk|}0 Date: Thu, 5 Mar 2026 00:05:09 +0100 Subject: [PATCH 3/7] Delete 1001_MastermindTdd --- 1001_MastermindTdd | 1 - 1 file changed, 1 deletion(-) delete mode 100644 1001_MastermindTdd diff --git a/1001_MastermindTdd b/1001_MastermindTdd deleted file mode 100644 index 8b13789..0000000 --- a/1001_MastermindTdd +++ /dev/null @@ -1 +0,0 @@ - From 145151e65c56b1e66039741191222cc52159483b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szakszon=20=C3=81d=C3=A1m=20D=C3=A1niel?= <149898926+Szakszi04@users.noreply.github.com> Date: Thu, 5 Mar 2026 00:06:25 +0100 Subject: [PATCH 4/7] Delete mastermind directory --- mastermind/__pycache__/logic.cpython-314.pyc | Bin 1846 -> 0 bytes .../test_logic.cpython-314-pytest-9.0.2.pyc | Bin 15471 -> 0 bytes mastermind/game.py | 136 ------------------ mastermind/jatekfelulet.png | Bin 39581 -> 0 bytes mastermind/logic.py | 59 -------- mastermind/mastermind_esettanulmany.md | 43 ------ mastermind/test_logic.py | 75 ---------- mastermind/teszt.png | Bin 23964 -> 0 bytes 8 files changed, 313 deletions(-) delete mode 100644 mastermind/__pycache__/logic.cpython-314.pyc delete mode 100644 mastermind/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc delete mode 100644 mastermind/game.py delete mode 100644 mastermind/jatekfelulet.png delete mode 100644 mastermind/logic.py delete mode 100644 mastermind/mastermind_esettanulmany.md delete mode 100644 mastermind/test_logic.py delete mode 100644 mastermind/teszt.png diff --git a/mastermind/__pycache__/logic.cpython-314.pyc b/mastermind/__pycache__/logic.cpython-314.pyc deleted file mode 100644 index 12cd8c9e42e88abb384ada69b4564945af4a0111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1846 zcmcIl&rjQS6n_Sj1luHr7APzshLj)KD54#rZH6YXvX&_;+fZeYmW6uY1vifE*$x$% zG$C!8*kKdeG^v+KaA1N%CA3XFOqw()mmPy3kXgO4KL7;1@7akVpslxkB`1DTZjGkCKElh6t#OcD`@*38zrApEbx3uE$lrN+i3 z5%Ug=6IyK;5_Zm6JTX+^OOm%91I!_55E5QDKUw4E=Lw!*;chE{MoztT8+WCUJqU3c zs`0fv$-s@OUG>lbd~GM3out({F}Tc{CkdK&05l(7^@)1->?G+T@Z4YVTxzPlzunCO zOi|U*t!Y&MsjX;A;Ll~MQAxtarMev42mg(G8HaO{;}h>q68#NliZpMW2jG40qbC>F zd9`k3Vc_fk6@9MKGj#l`|C#?8fZZ|d2+h}{@7+$n$8TdfXZ_~s3w6_2bCnNn?fhv6 z!w~N+Gf#c?dJWDhnf(w)h`KKrrl@BmWsZB4Uo-QYX--yCQaZo(NZ_t<0%uB^#-*kF zrfw%iIlpO$0~9r?r;HfI;rc|B1z8r17&nSwGp!n&k;^|-I9W1Gf$JM8hfxP?vz39G zCd%eZkVZ~Y#57`a9G<<9-&7XG3bTkBk=vF?QIn#X)s>2t2U$%PV_e_7C?k4CQ*+X+ zl>cQ01+8WJxyoZl-i)pqM(zS6ihP1(h!r|skh9|3x~}RmZd^FkVT!V-RHQEmsYTAA z;^u9_{BIS{s3>81@2FV??aki6hS=_C8rH;Vs$!~!pl}syIJ8wpbt+Psf^G_OM#$w< zCEJYK@?V#WuR1iwMZFe1tID!CYf7qO==dT4s}@yR)R|_hP8XDvXn6$mTA8yvx|mTH z#3*C=+@4vat;zC~%`VfBc3{zV0(}!QYT638c=v(-oWZKao&qw0F3gE(i*fe55g}P^ zr{+t_Iqy}&evkI_^w`7XtdkHvxD!j{pDD8NaUyd%q6vF6X9u)Ji*@MJk|Pj@PtaR% zkNqY!hVgd^UUWd+)e{f+=;fg=7FR~U{QSB9N}=ukj(?)yn>b)EFOwxYut$fUHw6pf zp{)m7cMG96cA7>C%*at4G&UbmaH;*t)$gw@#s6vvJ(=HW>0Ns7&;u>4OB1EmwgP#% zbg6mi-M<@}R<3_Ly-XbXfMLJ6xibGldYA4j1v*woe|%gF^ln_=4fJo(e>DDnuQ)jN zXQ1#=vN%0c9Dlew_^`xwtacXJ$aj7uZtUD=d$-x%4c}9GmmMmx!F@Ke%|=$o*6;1H z{fKA??K6>WCbBxd9^YjKOU#vhCcMprSIKqn9@BRe0)NY47j$+N$j|{BtW+2&G2I)D zMdsB4(_LbM6^gMvCVJ$B#?T=J4X+gF;Q~2)jP}7qlyJP<1RXy$pxZNO`9?D8Tvis} X)Y~w0Y_`9ThqVMjoYcgKn-2CLHYmju diff --git a/mastermind/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc b/mastermind/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc deleted file mode 100644 index a16ce47c78c479eade40da3659ee3880b196f0b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15471 zcmeHO&2Jk;6rWwM*I)T?(vS3m5GSEf(>7_7w6vH&zo6l(L<^)GES60&Nf&QycXnM! z5K<&KR9v`l=n;vNr5-pS?iK$49|fdQ5fZoFP*Vx1C*GU!t{umvPAh~+cM`vynVp%P zc{}@iZ{Ey1(AAkF5a^z->?;tP!-OByT4e1rh^&%#iJ`nqJVjj9sYpc~AXAzb9guf) zPlr3|%dx4r7at%a#7MuPcnKrYN4%t=0ZkcEpdE$|w9|+I?K0v(yNv|Uw2=hbW2Aug z8XZ8l8J$448(lzm7~Md38p<%q_T0jbozE&f?b+qBS+Ly|YpLW|uC=cJF(?&*-`Y1o zR!JVH4AcI|{0z7blDy_8ClndWDW+0UD-n}S)NYA!sc$G{9A5;kN*!!hO}{lr$X8jrgrk9q}KIG@!Rc92IP z!J-foq^j{~*=8kIq`0`~X_I>@2xRjwf`d2E3?7BJGqyP3?LA-J4*HviqXMaP=WFIlcf*^*tH&ttQuQ(Cm=M#{^4 zhe%R(nHJ%J4lSD4F53pRb@;i+zEyHF(fxVHS{F)g0IWff3N3LkRcl=81W_;Jx zzH9o8_~>6Tk{pKH@c(0C=Cz#5#;_hRl-n`bV*QUOpmfvzH?bk(4xTR=+wd`ZP z9`sE!qK5u2^o=}V--3G3H{FOC@lExuy?0!nowYf;$#=Y=KJ+ziBpPOMYrd;KPmJV! z%SQaNqx!*yZ=xJEQbxy2bW~ZFtLJ7ifWclt&lnMar@&!#5;IRk^E9PF9tb)7bRU ztegC(7RgMCr@_Pai>GGYgCb+hkBn#CZ1UsGq%3zl>sFIuP_pmIlTz<6EyjDyIm>ZO zM$2rjv{bejbYyjeoBpf zujRg`g8Y!m{i@aeZ)myiQ)59gh}=l+4dOp)xyEFW4~<&0+O0NW@WL*a%qiIDmB1aBzZ zfL9=b{!`&5HEYB_DFhzF7)mw zURAvnNG!G=3q6hG01{m1Yy{|((B9uKU8K%3djX1M;J4-@^Pxu!nOP1-ziv$zB6En$ zFeetsXlGXHOu9S@Jp)fzI_L0Q-yB{Ivk#Pcwj+C%1~K;~ImEK+tBYVE_C zCy|681zdm-d}JU^*I98w^-=I=y0zUV1S!FtIsujN5dtZ88bJ#~;WYf2=TSc%X&PhwLcRsk0vgjm&N4-XZpEpNw_D^w8954_X`g(}#+ty^%# zQkP9)yKSv;cMFi3uaq6TU^yOcxB6i9Dl{?*zhK3CFkJBhJHm}N4Y(k}bf`>9K7`67 z*=ieY4-e3wM+$&$vEpTCVBWL`(7Rdyv|RX}hc?h~$zDSeDwDtk2%$0=DwA?1ND2o( zLS+*0;lBGOb*u{1N;D|yYD>xNzZZs?UTJogO+!O?4k+04ei{|c zLyyj;cL?6NGY26A?-0D@Opr7L?{+r5*(<;;U)vPm{Ul_F16^757Oq$2{z_X|{dfzk zmexxN)^9>{XafzvT37`}L$C%zNqGDgCI$(u0>}m6LueHUtpXcPC~XAm7|ay`*6byW zwT05H%(j>5;xcvF+t3J_7uEyxNC?oa02=)ylzdJ5yr+Le_e1zcq=kP(Pv{>3Q?eFd zPdW6DfWww(yu+{wAD9iMj7_eXHq_r@X4~F}Kd2|&w8&?1y~e6QI)9{1fF*a&3s-KKPi7?GX`;G{6Z z=m*ROw~R!P#bdQRb`YO|u8%w_TrBIZ6~d*Gp`RZ^e>CBDAda|-<5Wy^9{2wk8kvQG zhN0pwgo_wnRgOz~GQ^)-D$Q3M`aF9N3L%=hD24uvD2nnsA)k^@I)5WWe 0: - print(f"🔴 {fekete} fekete", end="") - - # Fehér tüskék - if feher > 0: - if fekete > 0: - print(", ", end="") - print(f"⚪ {feher} fehér", end="") - - # Ha egyik sincs - if fekete == 0 and feher == 0: - print("❌ Nincs találat", end="") - - print() - -def jatek(): - """Fő játék logika""" - welcome() - - # Titkos felállás generálása - felallas = generalt_felallas() - # print(f"[DEBUG] Titkos kód: {' '.join(felallas)}") # Debug célra - - # Játék ciklus - for kor in range(1, MAX_KOROK + 1): - tipp = beker_tippet(kor) - - try: - fekete, feher = tipp_kiszamolasa(felallas, tipp, SZINEK) - eredmeny_kiiras(fekete, feher) - - # Győzelem ellenőrzése - if fekete == 4: - print("\n" + "=" * 60) - print(f"🎉 GRATULÁLOK! Kitaláltad {kor} körből!") - print(f"A titkos kód: {' '.join(felallas).upper()}") - print("=" * 60) - return True - - print() # Üres sor a következő kör előtt - - except ValueError as e: - print(f"❌ Hiba: {e}") - continue - - # Ha elfogytak a körök - print("\n" + "=" * 60) - print("😞 Sajnos elfogytak a köreid!") - print(f"A titkos kód: {' '.join(felallas).upper()}") - print("=" * 60) - return False - -def main(): - """Főprogram - újrajátszás kezelése""" - while True: - jatek() - - print("\nSzeretnél újra játszani? (i/n): ", end="") - try: - valasz = input().strip().lower() - if valasz not in ['i', 'igen', 'y', 'yes']: - print("\n👋 Köszönöm a játékot! Viszlát!") - break - print("\n" + "=" * 60 + "\n") - except KeyboardInterrupt: - print("\n\n👋 Viszlát!") - break - -if __name__ == "__main__": - main() diff --git a/mastermind/jatekfelulet.png b/mastermind/jatekfelulet.png deleted file mode 100644 index 515feaecec5fd157995b7e93485c9f856a884b3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39581 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%0A&L;18lx(Z8%@}!t$(|eH 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 Zrm@?iy73f9A~P`PX&Y%}U%VCa{{Vq%P^JI? diff --git a/mastermind/logic.py b/mastermind/logic.py deleted file mode 100644 index b6fe0d6..0000000 --- a/mastermind/logic.py +++ /dev/null @@ -1,59 +0,0 @@ -def tipp_kiszamolasa(felallas, tipp, szinek): - """ - Mastermind játék logikája - a tipp kiértékelése. - - Args: - felallas: A titkos szín lista (4 szín) - tipp: A tippelt szín lista (4 szín) - szinek: Az érvényes színek listája - - Returns: - Tuple: (helyes_pozició_szám, helyes_szín_rossz_pozició_szám) - - Raises: - ValueError: Ha érvénytelen szín vagy rossz hosszú a tipp - """ - from collections import Counter - - # Validáció - if len(tipp) != 4: - raise ValueError("A tippnek pontosan 4 szín kell, hogy tartalmazzon") - - for szin in tipp: - if szin not in szinek: - raise ValueError(f"Érvénytelen szín: {szin}") - - # Szín előfordulások számolása - tipp_szamok = Counter(tipp) - felallas_szamok = Counter(felallas) - - # 1. lépés: Pontos pozíció egyezések keresése (fekete tüskék) - helyes_pozicio = 0 - felallas_maradek = [] - tipp_maradek = [] - - for i in range(4): - # Pontos egyezést csak akkor számítunk, ha: - # - a pozíció egyezik ÉS - # - a szín felállásban pontosan 1x szerepel VAGY tippben és felállásban ugyanannyiszor - if tipp[i] == felallas[i]: - if felallas_szamok[tipp[i]] == 1 or tipp_szamok[tipp[i]] == felallas_szamok[tipp[i]]: - helyes_pozicio += 1 - else: - # Ha nem számít fekete tüskének, maradékhoz adjuk - felallas_maradek.append(felallas[i]) - tipp_maradek.append(tipp[i]) - else: - # Nincs pozíció egyezés, maradékhoz adjuk - felallas_maradek.append(felallas[i]) - tipp_maradek.append(tipp[i]) - - # 2. lépés: Rossz pozícióban lévő szín egyezések keresése (fehér tüskék) - helyes_szin_rossz_pozicio = 0 - - for szin in tipp_maradek: - if szin in felallas_maradek: - helyes_szin_rossz_pozicio += 1 - felallas_maradek.remove(szin) - - return (helyes_pozicio, helyes_szin_rossz_pozicio) diff --git a/mastermind/mastermind_esettanulmany.md b/mastermind/mastermind_esettanulmany.md deleted file mode 100644 index 6559eb7..0000000 --- a/mastermind/mastermind_esettanulmany.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: post -title: Mastermind fejlesztés TDD módszerrel és AI segítségével -tags: ai python tdd mastermind logic -author: Szakszon Ádám ---- - -# Mastermind Esettanulmány - -## Bevezetés -Ebben a projektben egy klasszikus Mastermind játék motorját készítettem el. A célom az volt, hogy megtanuljam a **TDD (Test-Driven Development)** folyamatát AI (GitHub Copilot) támogatással. - -## Fejlesztési módszertan -A fejlesztés során nem a kódot írtam meg először, hanem a teszteseteket a `pytest` keretrendszerben. - -### Tesztek típusai: -* **Hibaágak:** Érvénytelen színek és rossz tipp-hossz kezelése. -* **Logikai ágak:** Fekete és fehér tüskék számolása, különös tekintettel a duplikált színekre. - - -## Algoritmus leírása -A `tipp_kiszamolasa` függvény két lépésben dolgozik: -1. Megkeresi a pontos egyezéseket (fekete tüskék). -2. A maradék színekből kiszámolja a benne lévő, de rossz helyen lévő színeket (fehér tüskék). - - - -## Érdekes Promptok - -A fejlesztés során az AI-t két lépcsőben irányítottam. Először megadtam neki a teljes tesztkészletet, hogy az alapján generálja le a logikát: - -> "Szia! Kérlek, írd meg a `logic.py` tartalmát a `test_logic.py`-ban található tesztjeim alapján. A feladat a `tipp_kiszamolasa(felallas, tipp, szinek)` függvény megírása. Fontos, hogy a kód minden tesztesetnek megfeleljen." - -Később, amikor az AI túl bonyolult algoritmust (felesleges feltételeket) próbált bevezetni, szükség volt egy pontosító, visszaterelő utasításra: - -> "Térjünk vissza az alapokhoz: először egy ciklussal számoljuk össze az összes pontos egyezést, majd a maradékból határozzuk meg a rossz helyen lévő színeket. Ne bonyolítsd túl a logikát!" - -## Eredmények -A tesztek lefuttatása után az alábbi eredményt kaptam: -![Passed Tests](teszt.png) - -Aztán kértem egy konzolon tesztelhető felületett is az AI-tól: -![Konzol](jatekfelulet.png) \ No newline at end of file diff --git a/mastermind/test_logic.py b/mastermind/test_logic.py deleted file mode 100644 index 78fd4c2..0000000 --- a/mastermind/test_logic.py +++ /dev/null @@ -1,75 +0,0 @@ -import pytest -from logic import tipp_kiszamolasa - -szinek = ["szurke", "piros", "narancs", "sarga", "zold", "pink", "lila", "kek", "fekete", "feher" ] - -def test_ervenytelen_szin(): - with pytest.raises(ValueError): - tipp = ["sotetkek", "kek", "kek", "kek"] - felalas = ["piros", "kek", "zold", "sarga"] - tipp_kiszamolasa(felalas, tipp, szinek) - -def test_tulsok_szin(): - with pytest.raises(ValueError): - tipp = ["zold", "kek", "kek", "kek", "piros"] - felalas = ["piros", "kek", "zold", "sarga"] - tipp_kiszamolasa(felalas, tipp, szinek) - - -def test_tulkeves_szin(): - with pytest.raises(ValueError): - tipp = ["zold", "kek", "kek",] - felalas = ["piros", "kek", "zold", "sarga"] - tipp_kiszamolasa(felalas, tipp, szinek) - - - -def test_nincs_talalat(): - tipp = ["szurke", "piros", "narancs", "sarga"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,0) - -def test_johely(): - tipp = ["zold", "kek", "szurke", "piros"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) - -def test_benne(): - tipp = ["zold", "szurke", "piros", "kek"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) - -def test_benne_johely(): - tipp = ["zold", "szurke", "piros", "kek"] - felalas = ["szurke", "lila", "piros", "kek"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) - -def test_duplikaltszin_johely(): - tipp = ["kek", "kek", "szurke", "piros"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) - -def test_duplikaltszin_benne(): - tipp = ["kek", "szurke", "piros", "kek"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) - -def test_duplikaltszin_benne_tobb(): - tipp = ["kek", "szurke", "kek", "kek"] - felalas = ["lila", "kek", "kek", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,2) - -def test_duplikaltszin_johely_tobb(): - tipp = ["kek", "kek", "szurke", "piros"] - felalas = ["kek", "kek", "fekete", "piros"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (3,0) - -def test_duplikaltszin_vegyes(): - tipp = ["kek", "kek", "szurke", "piros"] - felalas = ["kek", "kek", "piros", "piros"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) - -def test_siker(): - tipp = ["zold", "szurke", "piros", "kek"] - felalas = ["zold", "szurke", "piros", "kek"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (4,0) \ No newline at end of file diff --git a/mastermind/teszt.png b/mastermind/teszt.png deleted file mode 100644 index 0d246c256141a876d177d6ff500e72ae73226092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23964 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 Kxk|}0 Date: Thu, 5 Mar 2026 00:07:07 +0100 Subject: [PATCH 5/7] Add files via upload --- .../__pycache__/logic.cpython-314.pyc | Bin 0 -> 1846 bytes .../test_logic.cpython-314-pytest-9.0.2.pyc | Bin 0 -> 15471 bytes 1001_MastermindTdd/game.py | 136 ++++++++++++++++++ 1001_MastermindTdd/jatekfelulet.png | Bin 0 -> 39581 bytes 1001_MastermindTdd/logic.py | 59 ++++++++ .../mastermind_esettanulmany.md | 43 ++++++ 1001_MastermindTdd/test_logic.py | 75 ++++++++++ 1001_MastermindTdd/teszt.png | Bin 0 -> 23964 bytes 8 files changed, 313 insertions(+) create mode 100644 1001_MastermindTdd/__pycache__/logic.cpython-314.pyc create mode 100644 1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc create mode 100644 1001_MastermindTdd/game.py create mode 100644 1001_MastermindTdd/jatekfelulet.png create mode 100644 1001_MastermindTdd/logic.py create mode 100644 1001_MastermindTdd/mastermind_esettanulmany.md create mode 100644 1001_MastermindTdd/test_logic.py create mode 100644 1001_MastermindTdd/teszt.png diff --git a/1001_MastermindTdd/__pycache__/logic.cpython-314.pyc b/1001_MastermindTdd/__pycache__/logic.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12cd8c9e42e88abb384ada69b4564945af4a0111 GIT binary patch literal 1846 zcmcIl&rjQS6n_Sj1luHr7APzshLj)KD54#rZH6YXvX&_;+fZeYmW6uY1vifE*$x$% zG$C!8*kKdeG^v+KaA1N%CA3XFOqw()mmPy3kXgO4KL7;1@7akVpslxkB`1DTZjGkCKElh6t#OcD`@*38zrApEbx3uE$lrN+i3 z5%Ug=6IyK;5_Zm6JTX+^OOm%91I!_55E5QDKUw4E=Lw!*;chE{MoztT8+WCUJqU3c zs`0fv$-s@OUG>lbd~GM3out({F}Tc{CkdK&05l(7^@)1->?G+T@Z4YVTxzPlzunCO zOi|U*t!Y&MsjX;A;Ll~MQAxtarMev42mg(G8HaO{;}h>q68#NliZpMW2jG40qbC>F zd9`k3Vc_fk6@9MKGj#l`|C#?8fZZ|d2+h}{@7+$n$8TdfXZ_~s3w6_2bCnNn?fhv6 z!w~N+Gf#c?dJWDhnf(w)h`KKrrl@BmWsZB4Uo-QYX--yCQaZo(NZ_t<0%uB^#-*kF zrfw%iIlpO$0~9r?r;HfI;rc|B1z8r17&nSwGp!n&k;^|-I9W1Gf$JM8hfxP?vz39G zCd%eZkVZ~Y#57`a9G<<9-&7XG3bTkBk=vF?QIn#X)s>2t2U$%PV_e_7C?k4CQ*+X+ zl>cQ01+8WJxyoZl-i)pqM(zS6ihP1(h!r|skh9|3x~}RmZd^FkVT!V-RHQEmsYTAA z;^u9_{BIS{s3>81@2FV??aki6hS=_C8rH;Vs$!~!pl}syIJ8wpbt+Psf^G_OM#$w< zCEJYK@?V#WuR1iwMZFe1tID!CYf7qO==dT4s}@yR)R|_hP8XDvXn6$mTA8yvx|mTH z#3*C=+@4vat;zC~%`VfBc3{zV0(}!QYT638c=v(-oWZKao&qw0F3gE(i*fe55g}P^ zr{+t_Iqy}&evkI_^w`7XtdkHvxD!j{pDD8NaUyd%q6vF6X9u)Ji*@MJk|Pj@PtaR% zkNqY!hVgd^UUWd+)e{f+=;fg=7FR~U{QSB9N}=ukj(?)yn>b)EFOwxYut$fUHw6pf zp{)m7cMG96cA7>C%*at4G&UbmaH;*t)$gw@#s6vvJ(=HW>0Ns7&;u>4OB1EmwgP#% zbg6mi-M<@}R<3_Ly-XbXfMLJ6xibGldYA4j1v*woe|%gF^ln_=4fJo(e>DDnuQ)jN zXQ1#=vN%0c9Dlew_^`xwtacXJ$aj7uZtUD=d$-x%4c}9GmmMmx!F@Ke%|=$o*6;1H z{fKA??K6>WCbBxd9^YjKOU#vhCcMprSIKqn9@BRe0)NY47j$+N$j|{BtW+2&G2I)D zMdsB4(_LbM6^gMvCVJ$B#?T=J4X+gF;Q~2)jP}7qlyJP<1RXy$pxZNO`9?D8Tvis} X)Y~w0Y_`9ThqVMjoYcgKn-2CLHYmju literal 0 HcmV?d00001 diff --git a/1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc b/1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a16ce47c78c479eade40da3659ee3880b196f0b2 GIT binary patch literal 15471 zcmeHO&2Jk;6rWwM*I)T?(vS3m5GSEf(>7_7w6vH&zo6l(L<^)GES60&Nf&QycXnM! z5K<&KR9v`l=n;vNr5-pS?iK$49|fdQ5fZoFP*Vx1C*GU!t{umvPAh~+cM`vynVp%P zc{}@iZ{Ey1(AAkF5a^z->?;tP!-OByT4e1rh^&%#iJ`nqJVjj9sYpc~AXAzb9guf) zPlr3|%dx4r7at%a#7MuPcnKrYN4%t=0ZkcEpdE$|w9|+I?K0v(yNv|Uw2=hbW2Aug z8XZ8l8J$448(lzm7~Md38p<%q_T0jbozE&f?b+qBS+Ly|YpLW|uC=cJF(?&*-`Y1o zR!JVH4AcI|{0z7blDy_8ClndWDW+0UD-n}S)NYA!sc$G{9A5;kN*!!hO}{lr$X8jrgrk9q}KIG@!Rc92IP z!J-foq^j{~*=8kIq`0`~X_I>@2xRjwf`d2E3?7BJGqyP3?LA-J4*HviqXMaP=WFIlcf*^*tH&ttQuQ(Cm=M#{^4 zhe%R(nHJ%J4lSD4F53pRb@;i+zEyHF(fxVHS{F)g0IWff3N3LkRcl=81W_;Jx zzH9o8_~>6Tk{pKH@c(0C=Cz#5#;_hRl-n`bV*QUOpmfvzH?bk(4xTR=+wd`ZP z9`sE!qK5u2^o=}V--3G3H{FOC@lExuy?0!nowYf;$#=Y=KJ+ziBpPOMYrd;KPmJV! z%SQaNqx!*yZ=xJEQbxy2bW~ZFtLJ7ifWclt&lnMar@&!#5;IRk^E9PF9tb)7bRU ztegC(7RgMCr@_Pai>GGYgCb+hkBn#CZ1UsGq%3zl>sFIuP_pmIlTz<6EyjDyIm>ZO zM$2rjv{bejbYyjeoBpf zujRg`g8Y!m{i@aeZ)myiQ)59gh}=l+4dOp)xyEFW4~<&0+O0NW@WL*a%qiIDmB1aBzZ zfL9=b{!`&5HEYB_DFhzF7)mw zURAvnNG!G=3q6hG01{m1Yy{|((B9uKU8K%3djX1M;J4-@^Pxu!nOP1-ziv$zB6En$ zFeetsXlGXHOu9S@Jp)fzI_L0Q-yB{Ivk#Pcwj+C%1~K;~ImEK+tBYVE_C zCy|681zdm-d}JU^*I98w^-=I=y0zUV1S!FtIsujN5dtZ88bJ#~;WYf2=TSc%X&PhwLcRsk0vgjm&N4-XZpEpNw_D^w8954_X`g(}#+ty^%# zQkP9)yKSv;cMFi3uaq6TU^yOcxB6i9Dl{?*zhK3CFkJBhJHm}N4Y(k}bf`>9K7`67 z*=ieY4-e3wM+$&$vEpTCVBWL`(7Rdyv|RX}hc?h~$zDSeDwDtk2%$0=DwA?1ND2o( zLS+*0;lBGOb*u{1N;D|yYD>xNzZZs?UTJogO+!O?4k+04ei{|c zLyyj;cL?6NGY26A?-0D@Opr7L?{+r5*(<;;U)vPm{Ul_F16^757Oq$2{z_X|{dfzk zmexxN)^9>{XafzvT37`}L$C%zNqGDgCI$(u0>}m6LueHUtpXcPC~XAm7|ay`*6byW zwT05H%(j>5;xcvF+t3J_7uEyxNC?oa02=)ylzdJ5yr+Le_e1zcq=kP(Pv{>3Q?eFd zPdW6DfWww(yu+{wAD9iMj7_eXHq_r@X4~F}Kd2|&w8&?1y~e6QI)9{1fF*a&3s-KKPi7?GX`;G{6Z z=m*ROw~R!P#bdQRb`YO|u8%w_TrBIZ6~d*Gp`RZ^e>CBDAda|-<5Wy^9{2wk8kvQG zhN0pwgo_wnRgOz~GQ^)-D$Q3M`aF9N3L%=hD24uvD2nnsA)k^@I)5WWe 0: + print(f"🔴 {fekete} fekete", end="") + + # Fehér tüskék + if feher > 0: + if fekete > 0: + print(", ", end="") + print(f"⚪ {feher} fehér", end="") + + # Ha egyik sincs + if fekete == 0 and feher == 0: + print("❌ Nincs találat", end="") + + print() + +def jatek(): + """Fő játék logika""" + welcome() + + # Titkos felállás generálása + felallas = generalt_felallas() + # print(f"[DEBUG] Titkos kód: {' '.join(felallas)}") # Debug célra + + # Játék ciklus + for kor in range(1, MAX_KOROK + 1): + tipp = beker_tippet(kor) + + try: + fekete, feher = tipp_kiszamolasa(felallas, tipp, SZINEK) + eredmeny_kiiras(fekete, feher) + + # Győzelem ellenőrzése + if fekete == 4: + print("\n" + "=" * 60) + print(f"🎉 GRATULÁLOK! Kitaláltad {kor} körből!") + print(f"A titkos kód: {' '.join(felallas).upper()}") + print("=" * 60) + return True + + print() # Üres sor a következő kör előtt + + except ValueError as e: + print(f"❌ Hiba: {e}") + continue + + # Ha elfogytak a körök + print("\n" + "=" * 60) + print("😞 Sajnos elfogytak a köreid!") + print(f"A titkos kód: {' '.join(felallas).upper()}") + print("=" * 60) + return False + +def main(): + """Főprogram - újrajátszás kezelése""" + while True: + jatek() + + print("\nSzeretnél újra játszani? (i/n): ", end="") + try: + valasz = input().strip().lower() + if valasz not in ['i', 'igen', 'y', 'yes']: + print("\n👋 Köszönöm a játékot! Viszlát!") + break + print("\n" + "=" * 60 + "\n") + except KeyboardInterrupt: + print("\n\n👋 Viszlát!") + break + +if __name__ == "__main__": + main() diff --git a/1001_MastermindTdd/jatekfelulet.png b/1001_MastermindTdd/jatekfelulet.png new file mode 100644 index 0000000000000000000000000000000000000000..515feaecec5fd157995b7e93485c9f856a884b3e GIT binary patch literal 39581 zcmdSBby!q!yYD?T(jh4&EnSkrfOI1v(jbDMlz`FP#T*?fy)^Ek!@%eu56{V-6N=!gc00M!C)zy^rK_E;=;Aa*e z7kH)R4cBep9}EwD)rX+U-wa#8FWAo&v=u<0ns`El4G!@8EjKk24-kmL^ZEy4-k#YT z1j-aqS5h$aw%kPqB#M$yqNre1vx_Y6F7I}ZagX7& zrR0$9jNDF%EV^I#>(Bm|rf-ve8((w5ho}+a)18mczvq_Ew~pd%EG~lPF3zOz*Pjcp<>rB6Ff~&QBqPeR3I7w-i_pm zRG`297>=+S8}N2H3$7#Zt`b$(fBf*!SJDx&&bL#}3OZbG#b}FfjSjUyi71O5+u#-0 z13`|NOMQaH>~x=9>h>S}ID^uyKBg&l%%3r><7g4LYRNvkxEy>Cx_~ZB2+WF%bP2)< z6$Af@#JT6gHL{3(r?okKk0HZS_Y%Q48qO;=#MgxAmzFj(3M)5t8*$XEKE6uJqpQWK z6wAu>r3^%$FTBmwfa)qKNlb?*WDeFKKl`4)RR;`6E*8plUvY@Aq}&Qq=JsMl8~{ zv>4Ns(qi(b-1Iw&vk9W~nh!~{(6wnn3$W|^(zqkLPJ@X8XSTe8gv8PN^9M{EvS{^|1H3?ri%r3$(F4e>T>pJK|3%q&tSWzjql5T>!T2T0 zU+a)H59ZEu#3Wb#F{dvzGkPF?F=In6T(@7x0zl#VKA+$4Ra~bKoMEZIc`- z>*ALm*`M6V((=@WB+dpmmRoLkvQ^zL7ecVedt*I%K%isUv8AVCYFz#0@$+qAll>&` zUxeQ(a_Pj6(C3%TPfYI@RFlqRW7D8vXGoqS8)(BIq3mq0EM;HcyOl_S)9&VCd6~3B zsu1#J=A@U3o%Oj)u=B!1aPRtMIha(-@fhA=7Bl1z@8Z$1czha!1QKUCN1cU?xWs~z*G!+a-(_o5V1#5oM$`4M6nmMcOk#iUbF{; z)N_xvdlFlko+bGyTdd6=WwNlo(~D;>#C0 zSw4V=YsZ5fzmd@oD9NXqLE3gwL_%8xb~_D8tuoFOyXMVhltOuKxqb2$bhJbwb3~!^ zAK387-W1e1o(bA6qk1Y9ZZpbe8c6j~eXYsi1zmJK*FEa`#?%=B^1rZZ!F+)9_I%V9 zVHxiwdqjXzet^$={G*CJq@KnSH^;w^e^Ifj+sd2%Vi~Fiiw;;cHrVO!vHBzG>doMd zI>DF84?I5cW{O`S9>j*A<-bhqQ08`cR4G9)s}?<=)T@Cwxp0%Jb0SdSE+z91yoD3V z9P}!w(%K5w(aT&voOtj_U^2;QNRA9k3Yrr5a>-5S6Vc_7nt}L8A=VF;R@?D_7=50a$yGSO`Y`d9Ua-i#*!PZj^kzbda z-;QouwrdWCxh|&3Aszjt{R6O%-Vci8T**H`mn12cocJP$y>SoyMsqsg$egD5z(ZN@ z2TYz6XI#L%)Eo%Vr-D>0)BzS>CA_2`#8F9^L0kOkwh_b@)drIoW=|D(XIA<7SK|DYsx}A$u^2PhqaqGMJn-P<|lEYw@$g8$HwjND6Ke{0&Sl-*0)}==Q z-V1QK@IemWk!V?T4~y&W+MsdP46k5&3>!FDSC;1VQ^4(mK%V(pRV72`9nulRT@|k( z-d7X{1#=!POJho7ECqJ#5d|$-L)6$bNG9CMNPD4;(uK~pvvpNvJ4d106bU?e!v%GEi-y)MAnfR0^>Tm+z2j_JJfunYf<_9 z=xE_Iq^qOp#b6)<7?IO`geb{pIiLi??z!enyMAZZl|`48opG_2CywJfx)aWI>1EwA zNE6B~YUs%2TK&1vnt>OTLD_ZtIOMy-cSGjA04#C#O`9o#?J{0;@vRWWQK-8x!M|Wdxyd$KH8m!aG;!c|m*d{a5MV-~Y9rUScPP+%QrsV+LZv#JuU1hfX zcV8CyCB=tV&Fq}QwX4u)6tk>sflKl^q)5cf;mU!pPqCSmdDC-n+ydg4-{I43YHA>J z7KO`JMSBs(owv|J-B=cYi=yqnnz7L_6G%qx95N0oG)nY3v)SL{6YnUVK;vGONi20Q z5cxuKOHK^z+!N^WuGXi&wYp80vJvcBdhb&inF*ClgSp zvYOU>J`!Ds>RVrk#T4^yeX(*i<93;b5%m- z{rYqfBi=7Q!nW~epr}`ENEK-g|H+2*z&jxGJKHGX(Tv}xp7iOzJ&Q#HYCLVB?*gv^ zn%}%QNBssf#fMFlERc@ppwTuvRw#qTW04Qn8&%@{Vg#Q>(=@iIK}kWStkWjoS@(--;FYepYx;huUfssiDq+6!m91eRk z#kJNZ{-Bj{e(H{(sR2@JGx(oDj3gw5VJ4e0nQpor|^EK0j-U zf_y;JC9gs=$k`ey+Z`}OGoY*FN&N2(LtPVMo~FI# zSEQzg4YNvE0<&EY>0wGV^?ULTV&u8|g>;-iPoQa(7cK~n+}a%WOT}u7;-?|?Tt4ut z5-J9Px;2v7)TCoScHo>HY+mlf<7HNwsd_B43((Y)kM~t$s7n-_(QG!HQ_k2;_N1O^ zIV{+HwTiU|E>wP2r~K%Efe-RkCFznS4vMw6jVxdSjgfaLOy}Tx4Jk4+GDsb!;RIo*2(YNV7)$#4)V<;s zxd3i!;MNt5v`c{mA2Y-2I0ku#k0$j9%%mBws8wnb_BQc+8w=p9#Q_Wd{+pcP6=~+I zlC5{Lbd;astI(W@^O2)`d@%P;L91(fFuq-$85sLA)VQ4C(XG*zyz#N@>asJz5=vZO z4k8t|yVecwb<(@*VEh#yk=1yLX+m|qgGFqt%_Ovi!}o{U-?QcW47DAWVgWgnD6vj9 z5~vU)n@CmM$cY6p88^!bjJ__)2Nh-sY1{r}VUsQ4q0++k7~$iB+0Q0lrHu>QOk{cB zW)N~aEr<|I>)saLI>rK49t*6T@6u8h;kEHAn1$%o?Kg@(vdX|Yk*t|73nayoa8(mv z`V^(t`}@pdy4ACO#GyPs7V7{ODCJQ1jU(?gS)9M zt)VX_lOk4EsWVv-QHQ)kN0mVj@SEQjk3;O|s~v4MNVC1bqBJm@CSLZn$Gp_HFO55K zE!NmVJyojGwG>uTt~O=W%jX&1hXiAu6R99#mllf-5{JY3Xu-vO4AfS|nOeXz*AP4`8aPu$N;Uf-nb!EE{ zRpeF!M%&lCeP$r^Y3Y^(Z)rW39;MNgfX!@{ER?)_-hP86A|D5L-b7KVI%{3}2$>8Z zMs8S3k7j%y@g(t@CnEftcTSeCOM@x?MzrdQ< z5JV=%s90wj^hqIiE69&}Leb^5%}-y?4T+s2I<|(PcZ@GhP&Ja>uU323a|8W-W<;9g zG*=-ye`_9j40%3rjrm*gq=rmW!-qoVvW;Lnp_ z=SJ_%HZuv7x>9Qo6+Q)Ymy)mJsnE0^xgEubEN zE}7F*HqzjL+$o70-I6q&TLS%0> zq=Zh0iadzY#p=E1<>lF69-UAY8*Qt_rk|?b8HT9^Rd)oNm@WKsDMG8+>Re$Rsa8x( zFtb5hUe-3FE#PF!yccc^c{vosdMoH97s`3JVVHDgH0eR=Gazr$V_~&g$V%gew6yC> z&5&2Eh-KIka!e2E4z@5SITm!l`k1WBU;J)B+93PBG6(f6;3z4HHKd#uDr2N=5AKOr z8c+x5nWYd$yl5)kt5 z4ZfJ@ue}br>^EzN*l|=dKQUC6U~A*9JsMvR*nQ6W9HIFuyu-C=y;jA6lr!;>k&hjV z6zEs|N@*;P#-#v~q>WB%D%K#&w%k<`y$4}DUk0zQQIizj{d6j%HH9D~OWCAmEOxYy zs5ZY-kHxZy%ux57!8s^mvp}#PxB6ZjT*E}#W$p(vgpJukuLqlwR?<}Se#zs!g|Ez}PGbGl=`%C<<^X(v+ z%=DbwXuB!^US@MArn3e<9J1a7@QI19QmWU(SD#iB(#p#-{C=EyLTGgb8^<4p#6Fg2 z-U~U;be0rY#gjXN4a;!!kw)BZ&69eR!LP?VDrcNOcGMJ^xM%iJ3qIiQ-^AvbY6xa& zyz)#PWF{x4GT~EG#8V|<5nquQJq>r5RS;yLk6O?6p?p6I9fR*NG2{i?za-6n$;L3Z zeJz6QF~Ho9$AFQ@Uc4TEHawsEIM7p{ zoLyF!ebs_iFMGicGx+>FEwib{gFI_@UsYopDc0nRX0G|mc~{a%y<->5Z1Vmo!s)@c z-)DgP!~fmf)^jsOUIDP=rHWt`l7c1;1|a0Qu4?mYWbN0%-DudLr(OJ@4^=}|!{nD~ z!2tiWR}Yk)B8%tS+VCrb_)UQOznLOtE+jPaDI%xQrpK%h0Q=fCZo2ft14ZqT=aY^+ z?0LJ{8UW1S0#b5aWSPV$2PVGH16rL#nle{tV}p z^B9hYB=u&oGz{IRij2cCGRmtuc~AxH5bLtUomfS$3dxjdK?zji`bN7A@U1Z84W5}2 zqNcD)){Yw3`w71GSBW%}#qoJ%!s9%ip0wgDTS;*kz_mCtlT`WpBR505odN`W27ltxeV6I3KJXCE41XItLs(GjEj9Eyt@9*u;(V*OE|kb>O^ zvl)Z`8McuMnlv9Fb8=)%uP0Q{pUMJiwG_R-`EZ@DB`4wTr;d3J*GaO+^=SjViumX^ z&TI@C$v{^8r$#VrhFM<||HewCqC%10wECm`5e3FXcnvcSQBtoil$oX~)IR;u6ln2@ z=$V7v#LC;f6z!8V{AqPj>z|LAzLR<@=ozcpT7PV)7;Hh>nA(!@Ggk_h+uj`rYIs?~ zf3S!4b(%{s+uR1C&m`Fv!;Y>ibBD818SK{DcsC6LRu7EpI_`6v6-Mb%c#QPwcEp9W zSeK3gIV#B`4f|H}RM#(NidqJY5d~fi8Y(eW6|r;egpXHqcSm~<8qPcK)}JOgv&vV@ z2tB=Id~`28mZ^Xa;7JjhozfRT*29byBI6b=(M>q*hcRF5NjSrSBIs?|7&5Qh9fJaN z6DvDdKIj$J5Mn4Yz%kwfYQ+}@(CgX0$HHvi0&txqnqqJA)S704?n5-KBL1XvA>}nl za8*|@_0=)0=VHy3m|c5v6x7E2=7pGTr-i~`2DIxv7XCLI9tK|VC`izI!m)!M(PXf~ zzK|tAra{Z|M4eArVH$jV4b6Jn;v{|dE!m&LWjPwG098Oi$n?#EGEn2^v}IhJ{ArP| z^><5$21rrJ=1R@vE;GugGtSA>PsIS2dFM+Zi?eWkVvC5FtY_F0S3QECWLr=SSVrAr*?p=XF;(sM11PX6jH6fvYL;8wP%op}dtdYlk}F|%-0f30 z7JMOeii@kF5I>aN>jcp~k9fb)NUV(Zmb|~2Q3{E@3)CW%GoSaOf;SSD?D6`!+sXXcgErPB z9O^Qr=9br3J-mEL&O$T31y{Zdnm>kfB%sdFxj_?j;c@LAb$11T!yM+QNk$?;RT1SC znzSwsWTMD!5U{2ziz7EKi#teh*k|GZT>HcRVXA>!KogUR7b<3&vq+cTuDvY|Bx#Rh zQB{DcRTBI~Ydn#%|3lsOUt;YO4E{G^* zKvGpL3aML+ndOs9(pP>9=R3+gs?o2wEhjOqAse@2ufAVG+>*vfK1^)*0cZr4#Rbd3s$z33 z>5-0r=x2m>T7W#<-ER6f4P?lt80j%H;YTLpp2MHn5VweNn&o_@xI#mdvM@7V5U}_& z^gJ`$%2G&+x`nTs@FN9= zsjS@Wi+1vqkrVm?W_*P}EZA2%cUNm;PO&geKsRhbI z{BI5*hh2gokJ}%Fq*dKmtQ*J?7R88x6q03=88)b1^iK21rK?DTcxQ+MrzUO!Wv2$zh@rIq%*&&f{;gM)2nGjwr(pi2~A6Kzr`6!tMh%8T0J8X1sVZ-|=#7}7! z(UB$u|A(upvFE;)GL}__vQ(dY&$pwX z#vP0{8LINS=OuKTRL!k~BL~xufPCU{KQL6wHJKVM{!fn;Cx>o`qwD#?tSc5hQBea+>=?3HJ_?^gvFWhi-ehx z9w}E2o+8+C@PlLKke8q3$0yMe=zDU>^ert(bNOq=x%TW0GgCmfW#TSK;vQr8iEgcXWgvAE|G-9T9n0QwhbF-y+#3PX`*jTJD+vx2lcz+Tn&Iz z#9r0%VHQ<;d`_dp-Evoud=8Y-h|~Qu5lGS$;afA(4k`eu+LS)_V~X%;cyO0BU)chl zQ&+J#@Re7XD;mgs4w$e)e(nR6(x@yS3JWtp9bh%(_@{wnNe4hL|5Lk(1)2~~46B$m z93s8tmw6ddAvSmVPEK>Zl z^N}i&kHz1m-q(N)294mG>)T)sW!Qr?~dPkkv)6(@%k1^?}M&@oQFL3eC1ot+b*o1IE5*AHiGk) zsyyMiuX|FG(9LwQ=J?;35KO9@kGL@=+szU@-+b+Gg zX<=Tw@KYG%HDopuc0Z;bVuQlGmN2FbQ*Moj8HFs844F-2JiiB^7Jy1c>*TkOmrXpx z`i3d=AnqVp&X;$SXLpN-5754!ZzM`R=2MHp;XN|d?t^^3prIuCbD>~ThwNL;wI4<( zDP@(@13g8E#E8^ZjIm0^4l=s(%KUcIYqxj4Be=9pL6foPnLdhoJ-l*hwGioMVBvXh zlYY1Isw;E&Ee|FQKn4J7((7B*qy~!3eU9i)$}`YssCIk-rCmE}o($mfW|p^6;$1@_ z_DO?%(|tiU@1(5fO=%`q0^4^1qUJ@dqYHiyio+o!$Sj!JHnDg#gZBk)jY1~1+P30$ z8nSeRIeVXE9m5o=b3`sBG9+HfIUv+$#2|3L7Q{P+zX;-{;z+jBY-mSzcY^=$vFydW!X!o5(I1)C?T^VNsxDDD6Y#pbvxgY z)yH1Tw$4CZVfSf~P8g7bls&C~v#g;EU&+3*C}NrAQ-8yt*HRnIqa>8dRRy$RL} z$^eo^n^j?N!@bqhoUFIslI zUn>p;poqL7QNLGryzZ1?+d)VRhZWSVpXUVvQj9WD8va6VR_x>JCfFJ}r^{8jpf%GF3(IhZuiemN zKo@q@1S&~S^`Mt&yyw2XQ(yxh_(OVAy%K@lw4G@o*o*@$=WTLJGv*4>eYB(dww0$p zRT0-}GL-#<31Sz2U}Um)1wi1F2CESSykYigLl7*f^Zd7};VaE;^`znLOre3rabiD=Z-*2;(wa%8089ik7^ji7_ot=5M4C@}uUqa)Z> z!+9QVaHmlMP#c0Kw7EX@^ul!Ue4n@gTnS7uAXz5rmJ3@?4p+c1304i^|>;S`v}FE;AX%@sB6!!{!~&Z~*C4;B!F3qXHw&m7HaxE< zRh)i(-pwvlr=FFQzwx(S>PGj#)JeE-JB8Z&+*>H+y;<+oAVUfZq(t)9uy5hj>`}5a z5`=7ldQS6K{A>st(4H}4U?+ILVaR0ltW*8B0nz$x(gz4ow=qg+ z4$5}q8yMtgv-ASL$K_ldKS_aF3rU*oO>I}2C7c_RB5 z!IT3{f$@YhL~)FO=K8zz$J>>PL->86y$gQHz~ho{$%fU)7%{2g*EN6!*XD9sAdptd zUKQJa$1>ANU)Q45P(EV+RH0F{Vc^Q`usRNI_dTu@;87N}=J{ngp3>}l3n;`i z8c`j4W@3<@y<8=iqJv1LQreazr3WP&B9S}q*^p)?<` zvICKkd>C*t&jS4nfb#zLDm)7xAiy^ZeLIrT5!6trkm+O#ef-HAj(EOu+0YBii52Q& zL_Z(Mb;&h3vC?g4?3)Ojbx_%Diac2mM)qz4l>l$8bprJRe+eIbK@zR<=f~>5318$> zI?`k)mrjeZdBi?exiD9Ix!+9;Eb^?*I${0QoOEUuebcpvpAwIDHHZCvC&Vcly{p#w zlZaGZpa9UjJG;Ml4_0KaDYP4ZK>GqNoec<+1CEm~&@6Jlyr(ejCIq4%c(*Ne^2>oy zOi0LZw;_HsN}jB)iwSq)fS7<8rU{&gx>B6nxh+{fT9jhzd0b1xOffUhgT1B3ExQ7| zE9s@q{*pD)z9)-!e=)h5Z7W|QB5sjt%Kd8ShuJYbWbpI$Oh#W5s)no>uSa6y3K_^HmhzUM<&IHA$_wN|?xc$xI)nibKz^Y-RyOIUx~ zN=#FA5oc*@A7|#j z<2w#^lv}re2w|6+#xdW< zo1wi!%_q#ImEg&ZAKp^Clbf33jPB`1vl}!(m4H+3Aj;3Lrr7<~!j+SA{5%hkCL|yG z#~I)i?>&qpjVGY+6vd~`XJWm*I;d*}r~(2%Fk`=PI_LgXHd>5JvF6-CuLQ*p_@_Mn zNV$V-XpkX@uswtHg^edQIk^}rMWKsw)2(CmzqG}$X+kY;vvc^ST*(rRtPQrJIMh$I ze#S%dPg`JvQm7d7GZ-cLaLN-)ATIf0eH`x3@m1mod|jBq7~=jnK4U9bF87#YjU;SjCgR+RyqMH8d0{UsjQcu&1;qHgqE zR?45}$5S##;g9?Y&gmLJZ^^Qbl#;Pw^Os8$EA3P1PSB3D;PIo zkscne-CCOLbyvOFM^fBE*c(Bh#_`i69ti>}baG-acfxS{d#p%}rnbU@JJlBC8s54U z`H1-;U9pXxEQi*yxM&V+hv0tLnICQAFhT_2W8{6rWz?&JPPrY3zG2t%MSNm0Ge0tm zJL}2BNoII`a}baaE&oBZ`9ET8iNS*?ApLt;V+|wpoVuy z#F+GFrCXmlax?AT&vhH^K4$)dR|sD1tO9ohBg?5E38k|A^J46P;qi>o+pbpP)&1s3 z`fn5>FMUzVu#D6N-8(-w%$1E9QXLoMhkj>NkQx|sb<|iZ9PLCDeTIxsrBa?lZ577x zGV0ZTllIqJ_@Y=i8Ei#ALx7@jFt?xW)|PE3;4gIo>_MB-eT4eY)d4Xnb0P6B9Cx7m z=Lpn)8kPfb;lFEg|4Ta%`@29nt(|U9!!Pwg?K(<5_zFKih#z&;Cjq2L0gU=!sGJMa95qTV&Uiaa!ZAv;&vhJ^ze10T{@s=&RhKe0Ka`hm^&i`)vQH{+P3cp^Ii{W zIsf=_Hp7=?iQcjQvmzK_-*$R_@0^#Me`X!eu}rY%G_7cM+kT|OvnkBw_fSzPY+k+uonw0#4DJ7Q-lPUR}`bN4X`GHOmsxJMmA2RR>^!L%`-hAiUJ_ zE34FbULOiR4MF{c1@KXMIl;I)i`o?hOs-;)CJ~!L+dbEc1z1Pos^7jv&U*s;v4Ia^T+Y=yTk>@tv+JX^r4%W;Z9OIPpobn zr)`t21@RwSyLLrt5cAEpb~LN!^Wu4tLAC=Unp@5>Vs+LE!K_!V-`>=H&%SEEHO=-S zX1+3K;9%muMTrTF{P+*JXs?4K{716li zBGnS-w78`B!=)?PjH{x!&yHJD*L_9zl7F`q;)HzI+S^KL*tcXqck?349JLIOh!me8 z-cqN`V_$#wVL3kBO>?8K6G>yU73 z7m>_Frbg*(Dp(RKstOc98v8|1#Be>GxcMXXF+dvCLWQOh zd1_4xuD79?75kUW?%jR2oJ@HWklYy7X z?e$-1GL1)hqT15rZs#lL4#Z1tM(fp|;W0A4BG!B7Lcex%oC0;3_i_N`V_2CE@RYSH z2)eRy@;F%i!#0#%whN5&h&aN{iF^Zn2)|mH{8M7t?Bf?xZrl3d7a$GTj6M*~G;q(= z_QTHOpozKhQJj0Zix*jzf!rm5N}i&IENUlQKfA3&z1C>3AMK0?+k9iq+(D$w+^8iS z1p1;h{EgyHctJz*q9remTAE~|a4wB`8M}7Wj9tsecAditq&yrmVA?%}RbP6oF#;J$+Z~vH|LdX=9tT05D|5ieDBG~+T$tJ&6b=~ z^}8Mgj0U?_6;xDb@50t}V}Gw(eYV!o-R+2-vwRBgJ35aF(h^j8pARDrVNw`L>bt~K z^Q^T!=tTfXu?(-Dc+HE8`m8}I#p!Mp$5)&C7}_fLHG0&x7i7Q@Ab%^(f+ z2`wx_7N6*y>4?137_v?$Py)pjJw3@3GK2gxGPAv|yFffZ2^Y|D-W~>U?vuXtm)Fn@ zZSMO`@GHUzF3^A=IB7VUc3~#B(A3;f2TI}V3FO34b%}7mG%E(A#Z(XzEi|#4IG6&{*M@H9=z1K)>%A^x&k;)@ySou;$ zH%Y}K`Y)`SR)IPTSHeg&^@ujhV2<$JCszh4la_ZRFJ z-f-MM=IXDFW{z)yvz(u#7<{kdhH$p7q9hL1O71#@+P?Og;ku#g$p|el2V^(_y$>{my|=`7-8@RkEcgg6~D%u?*1Z zkex3(a}-RGElw9Vkcwg9NygR>Uu*tN$B$Uim~iOfg;_TY_&QB4D`Wy{wju-G#_6>% z=&*T>Ke(kO4 zm(suutl#kJiFgnJkf1i{t?N#GJUsqbx#Zo$)Da9^v&U;rAv(RQHZ;IO8-p`wcLEpL z(d{XwVFt&T)FE#AonCFRx0|Yz(!L^#`v3v6L#OqEH&B9g;d{WXSsiw*lWXBhq0$N) zOE7>DW?nbtlu~cw9NemlpKAt{qn$o& zZKIEUG6e|Bsmp{Xf-Pu5zSr=lU`}Axp)EuqGaTScrO%-3KV&~bVwZ?o^(&U29OcoX zQzT6y^+K+A&qfqKWHuZ&UxgKX$2!iIZ z@%I_0bOVME^y+)2`RFPcLB_~R>%N(K?f|kG(xdqZU?zBE=iWEumVbH;$|u;56S5qI z)oyVT8Y82zdh=DshI@7#C8gnNHFmg#w20XAgP#Zla6DVTc*FNZFVWammlw(cv4jtd zpn^}`w^m%|_Xx4qo&!3e(IlY#9{&jacHckgDn5_C7}~hfZuKhr;dLA08AI$PpcP8a z3>h+1d+7hWXZ&zI^HriSken<&R2-;h`HKD-*Cee4&5yrLV&1$St*i4jX1>8vkA6~- z-lVZdO#kB?Gn6UFfbXJ2|1H{My+Y>1_2+iaJ?O9g9jkYXJfo-D52{RI_FrmE#Lyk~ z^U%>a!D~OJNi~fDzXq0b?gMT6 zv>q@t^8ErUju=q0(zha3fxF0fd|X!DdVHdoA%BM44_{s=(jICw=-NQjrF|D2rx*1 zWO_~od&^KcL!Td`2Fz4Z!kL0u;3nsc(gglZhs1UIs=s{ZVI|G-7g zb=NLSLU%XJD!@&-w-c!$Hv5UL3}%p*iXV6E5WWTWmg8aj2H`wdXhA54*en9J8B0(K z{!pkr7k5KBx07Zq^%JpjOty;M)?*l=soqB-O3sGN5u_27hElPw^_RL6Y(3yl!HJtUre z>ckQ;le{#wtCZ}U_GCoLXTKJ}QZo|5XeXfi)tLKfqbI+$m&;y-I!Pb-UKBToK+b@M zCaFLh+~rmq_$0v8dkC~I`TG1hNGX^iI)by4ssYH4(jw*8W?xWb1PX4?huOGnuU?nM zefeQ^56y1=o2>gtd=D6XnM2#^!^d9f!qUEGcgb;2_1u2-5B{(7%mk3Ej?-9yCruFB z*tx7dsz#0`OMfT0UGJK)A__sj0THQ`U48(9v(kru-#tcmG%3zyRez7TDw?*_yGkMa z#*iO=p82YAyS$N&kK)elm=717ca2;dwG2msm1=VKNjtYxiX+PVQ6EyF>Hlti@;|=K zWW}NFv|z`W%bLuBZ}8V91steR-7?GPP~dq6DLy*=Afcd%_hhRuLG1Jq1C|Dor&|FG zq!?odmx``GF1dzdTPzc$E<9j~ik=?VhW&y|O(wvU+3|G%5mf9U=Cf}W9Ou&ZMw#2b z8vJ|)I)$+F4py6!>pva({S|qumf0$dU|Pb*pZZp~?FxoleTlS7{W0MB>wWD0`nl=+ zxMTachmWJYKa=t4ZHxow8^q3r-u?!JIX560<)0b`PQWVbh(=;24op_Jf3K?7_NVv_ zUll~{CHcPpvh&N_B18J+p#R#_!XcwIOu+I>AqR1Q3fCbQCPA?_4>Q&1wU4aOE_J^wE({X_5c4Y_dwYF&yuYd=LZYSB@2AIp*B2Zqpny% zFBRv&_Q053jt&+u^6XhGnCb#dFzG^dCw_IBk>XeruYWiug9W` zwixzX=zuAV>yp=j>aPg#pIyj5@!kK)6O8@~TAYt-*p4^Db;b=GC23FSfYNWu+2)x3 z{(pR4644ETE1vrCLSoQtVO5+@1DXL?WcIo(zpw4*F0c4WuP^K(lss$sxzw;glGTQQ z9{%*&Q1Ez@UAjVU8b1G~ESy;4gLxtigUd3^ILN-A_6d-OoWBF!yPIbo0eVTBddX*H zyyo(U<1+JB&A{xz67s9Szx6Pe6}~uEd&np-8E`ekhoeLPWvW2>XnhFA(u{RFt?Gt- zi|5;0;7>~10Q(!TXZVws8!D1u0eU9FaQeiVZdUm8xH66sFV|%5=2}lvQ1= z&yuN$aQp-r6BE<~v~tx%t>2gpg&@ixcvWu-M=0G4w?$wJvgFpuJysC8h9#rH z$=xJn)ss$&88R2YN6l6m3h?A9u)-yWM8KEqm2ahix1=tgCnn|YSgl+|ZK{~ON~pK| zXPK{NAgaav`c635O2_E>Nj*fj|IP~>rq%$Nto;io+*k2KXwLsr-FpBv-L_l56akec zSU{;ZP!Iy5bchHDNL48cNJLaXq)BfHqEZ!9R8&fosv=E#NdRdA0@6!>&_igULr6P! z!1sNhXScKWcfOf3d&U`NoMBS_3IBUtYpvhK_r<&7l++SSj(&}sI`Zq0T)X|)$PV^B zyr8(IfHZpX@f@oRhd}o43)fmDvA}Ps+5a5W%Xm_Vpy+;lzo6u^ z6s;-tP#Kh0{med*p1J9ExFO#N-7EhF?jk=l9#A?vnhV-4lI&Ui8hpGdjavsNk=i!! zY(&tkcyc_>f0rW|oN`th3*M0+2l=0k zTzt~|KArBV^rS-Ol2^}K_uYGe0ja}6?Q*0A9GEPj9=IdrOe2EYc=~BQ*Q&@}+5chE z^~$j7$dGptf|3cb{8;qZDt z5)AHR*JkeG{8O3o-~0v!$i6pyaU~+D;Q<%GjnENwRU5BAcD>rfaIR2<5cI5t?b^&_ znDWtWi=^5lxvXQf>U~Mds)}CTs@{BlHsx{1c)(T4Sh<5G^=$eiZp)$)eyr@h1aGRg z!n2n6<}2npz&<IhKy*PIo_Az*0Dr*v80vFS69IYGTJePv znte9zbqh590l4&u^h<9)sbT5aoxsF1e8Rc&myJfTU{Jw^l;XZm?*MiIe8*TH_m$ViW=Bx`i>qU4g6H#glR9$h~%!cvRtxf5#FiUyb zgYU#rs#i8L+~vang|yLtSFi^KtbGjEb(`_K8-*z87E?Z~HjBp?8xRd<+$MZ3J3^zl4t>J2wJamt?QOK^Rd_f{rUIi@-p4)^m>=6e2HO)yw2D!GOxqH|J}obg`NTRh zkruba%|`RT9DGPsRgL&gptSpD`~H*WT5@MGCLq-)5_i}3swCsJ=$P-s3@{V}$AlYi zxI0w)aWHeK-4`pL2bpE9Ce9)@R$0iuS1O||V1b8mIci#2=9-ii*IHK;g|xUoCP+nn zIhs(P*bC)iP!vLOjF)1oAqlETX|WowS%*V|0y)^>u&-ZxGx?kk3AhFBMTF%+>cVyk^7%Vr8b72hy-rpb5I4hu?Nmxx|Bm=p5zidxqzc>d@Pg?&K$*TI&_ zy|vAH#g)A)9}pF_cUQE>8g%a|i4$%huUMtVn!f>{E`u$8;BvL(A60W~Kb}!x!57hf z{*Mg%WI~6+`FbQLi$eG%3c;XkvE8iSliB-RjPSk_r^?knhjLo{^`_N~JcE_IsN-=* z%OeIvx1o7M&hguABc#`#YxHyW&z1(0VLn=eF7n7QsQ!{!mNsP{dnoF05FVB)28zePC?8N zKs#R-;7v`#rE04gB;9Gdf&0n$;J>5ltTMH!PTqc{n1H#jShABS3KfYUvqhYMMX77$<~W=2d}UX zQm2%uEg0HW|E1eP`@K=`Ig*+`^r;7LM*{1+IQd@kiAZbf7_+K^O2(2X`llHVyur^4 zk7`)HJQ_VNYe;udMv-{7Ct;deJH)^6@2z&XiFbkVmCbKd(Mz{u&Yg6y9z<+xsw{rW zIQgJ*VNcin^VaCq3`NSatn^Ual}zVPaDqAe*YTT(Re{YJB%H-=<1WMb3j8o;5r3Fo z7!CWBdaNg`M0oVYSA|t^iRQgsz~I4u>gjUZG_^>iEARgE+#Sk_4;ik!_vAk9>LB$& zf70*{1aqzZRa6rs1H0h2l3QjNZUpg>{&4Tiuzo6Z{Q!Jo9>HZ*US4I+Io=-Sz^(oi z=DR7*5KLRtr}4r9Mw^34XM?2zS5U>Ha)iw!PuXiA_Z9ANhJUr*tAbS;8kXsC&V2!+ z1-ja=G}9l>eq3F8X@8Pv|Cz45qB-|;bntP#<~CObso}<{4Wq5?8(}gp*U5QspOZ_N z%!q@%g~k|GHTk!zlc$SEbdYfF`#BhG=St8Bx0FlDMgpaT4%|Q2>nF?V}!!Oym~}=Oa)`{ zAloJ$T$IJaoHRc6p!F{s8BGZrI{)UwViv%&(PJ>n;suVhxnwt zC#S!w`D{tps1R9ObzpVSGrNB?jG)>Odm$Bz4T?UnDkpAqH3PUKI<)k~dOuB$e<|jA z^t%LNGC~=>JYp8OFjwf=p@k*+3RMOyOQ1b1)w#i+LMedt0Y9#=xR=Dz&+PwKz_0%+ zWK(88w7Z{5%%xg5bS{K#KQuiEJ|SDm#wFW~B7!dhFJWpHw$WSW&<7Z*Ma-Yt6FO#fR%VJf zJm8{(g7Ij|H(K|=>el|77Lwo#=6^tx@j|6SFgs7cY*a^fQW0Cb(8pf&kmI^0t{p|- zq||QxM^-1ir;|xC4Y=P7UbF!8B-7g4#ifn(@)JWnTp(zd7Y}9BB1ip$?L{8D_kxlf zf+^$%6GN8a+jNY`dyzNWh!YK)fdh2!=xi=_A;3$c0KUuX#S<;z-u1VTSoN3x#x;`H zk3&kUbi%79toiXmGM3>&ucsZm|XaP#5Vw_*wc`$k3_Sdb=va>nOU zzZ@2OUB+1>;$mjT9{u?VA1~l5Z@0MrsIr16o_nL5UR?ge3YOrOQHydb=_N4_LTL*LmMJUJ`1-dg6#UK+vl(*g$cjnR!!;m zrO=w8ufSG%bJb%dU6J{At9M>fCDV@=TA8ldx zQj3fe{mK|-+qNKA5y|lnP@w5>A#PVmQRyJ}7tjWM42k-OQsY~TWDuG*KWlQCO=uem z+P=G!@8i5i?Y;&L7S@zLw;Wb8-jVCE=z_?OX3!VYZ~=x<*P(g14G{#L1zHoGw%eO& zKG7o=s$BZ(@zagMm2mFIC)s45@>b5J%u5;}ht-LAVnykT{MF<-gU>MccLG15Xi^$f zgx$#a7Uc#_d&b!FaTY{(rM$bd=7Rp{K&}u2oM0lsLyzM#d>*$cd2lA2i42RY6CXZX zpeB2GVpAh>#~%{!;jY8$ACp+hbZx2qT?^D&rCXs|xLkK*CClYakY3p3fqF8uEu!AL%uZ zv|iXNT4edLl zrFyBCOaNuSW-U9ts=7-N<*i&7s|&f0TqcQ^7!Ust&$v!G)W@0Rr!JD1(&!P_bc=HQ z8-So|O6buhpO4(^7+lcdJneXjt23_l+g_%Qq=+^dPTV3DkhQ>FItXvOjTQODM!6!kgyEBi4-y9aH2q&b5eb@T8_B>Dks}!NWXooCMkOl6?{J4BAQvOs)6`}(bn)6>jQBjK=|6d>?A~fZ)7L}?C}RDXI=K!JY5{xbP8~Q6B+ql#fjaTp zN?z%eV&NcG+L{WQ-N#2nle4N(A2Ke&MO}N%Am!`pznrHBe3g6wgsDNDIo%zX0kIpcL=oEdw_Z+cuoGRU5QRSRN-u99=cyZK=CL?`Ym zncXIc6@euySDHGx)(#sTQ!!rdj$4aiW-!u$)c7v=EV7HYWkfZ)fh;!5M*S=(?R=eC zo6(N1V-*Cn08=S&@NfT49>zy)RzoPtmmtsG7SN$b?)x^Q6h_&wl$#~<-0n%w(T`{p zAOzbC=QQ+>aIs!UDOFOl2bV$MSO?!mop}_)1J%$piGyt}rbUH_|9_;8z_4`qm7Tv*+74B`v@G+RGF4@Zeh&DbuV_(#Ez`;QAZzvIF&mEs+xAIRx?*@|3JQw6szsxJ{B zv=h&<@junL^(Rl4>RK8RI`T12xzT&o)b0Dno^j5=#V}0KEq4~JdurDi=_!H%nRJ(u@QO{h)AU>eenTdlZAm*@nJx^z0bvly z;Vu~CNM8cLO*4RsstO)^Mfk)8%4V;wPC_A>Nmx*Z%ct#&2JY9j2oI#S|D4mY2bWbjie06J@vm#01 z@R9Xe-?pJ;%0>)I2zm_7hRF#Kx?d<|9c^=w#0?i9Y^7kUENH8e{N)hl&!dJL!=c7) z{GZn_Y8)pI=Bd}N?G7_VeS%)OVg3#>0Tq{z3{rf?;ScUyc|xAR3$|5A_kb9PHM$0&Iji^pAQ9(@BtEJgSEV{Ehn z7EhCZ)Ib>-$YHRpxXl4}80%mhPxa|6zH@%)1e9UdE%38npcA!W|L zmY>s#h6FMafWl%H?0m;&46P^XN{;_K))7H#=d z@%ay(9NXYyow)hZPK%|1Mg=$ZEeWcvMldS_A&7d-cl0T=zLdmd6R^n1>Hz+jIn^f> zNFEq^cFvFer5RDuxNGSRTh5q=eNI}e*w%2v?B-Cc#Zp@5vLF2+-2btCW9Pp4|6`r? zKZkRH*YxiUI-smNIo_ooMwdw`p=z4|tKpXmdu;FLzsJt+{&et4ah7Y5HZS)Z-V!Ue zy|UGEqPWZny1p#sM@v<=qS_|Nx|8&$u%>lL+T;>i<(^ZsSC6Z3R1YXCYMmPbApwS9 zW`OPeDgp9=i$fz5dFX#5;i~xpr%qh1J7-s4wRHqPJ)D<8Ulwxr%m*X`Ex>>$g`fz? zUOpZASw9WcsSz$Ez#Ah1%WF~J(9Dbu?V2V3z+V8XLZ}M&w*izrYm}MxT=BA8XSRze zjj%+?eS-E&BD)nD4YAbjSM3i#58a~$E1>1snWd_$KfA%|cBKIof8dKlz`h|y|M}yJ zA-lYScqHf}$i>c)w<(j3ncZ~ssZC1J*|FWH^~+@I+BstX{0Qgn21J=wGJb;!D2 z22N^!f$evA{_k79BH!;&zhFcZjv{O*`U}VlVu-o?H~{&|HJuj9p`_Uc2DPjAyKb;U zk$2T;c;(cM7OgKuhNpw*o#`xLUpN+8kV{4M}$ndG+w@K%e_dPl3^~ETuzTnJDP^a`l=}FtVdz?@GMk!flnMw5FFdV54fBo2 z$oJO$cjREFhx-}(bOz4t38m&R7>$}#tL%dyv6>`Jsq7wXBt!*+x9WPr3Ov~QS(XSrL^?Dm>x_< zwzC%I)$ZR-Z=g<;CP7-~a@+l$t+dHW@#MO1Cw27$uUG|NU2gik9ai6Emp7uZ6Y>*2 z;Qe3udbLTc4BMCt!>x;wmmxJ^N?LleFYJm{0m*OD=hlFWqEB|7Btz?!*TVoX$yk0@ zAR|Q_(Y+DC|4lAjqs;!)z+YUw_w#jS5B2+@)k~_0J7~-^2ZtIC2C9n(Q9U+{mp5$; z8ka51E45chhqAD>WYB&q+~v4ONXX`y>6jJj44tg87!Yq>w?HxVjo{-On8d*_VTY=uCN$J@VC9|=~M80g81{@T3wjQ7RSz^I9coNx9 zkFH6+bNa2&J&}L21>0pV`ztmazqn^6r>mLU>moqdUGNO~q~%4a zc@+CsS1?~$e*ij~`%&SXxCH)!;db8e?MjV!TR|HQG;wG4Nq;gRW_|-tCGW|WVY9K; zid6t8K5~ifX&02D4K0S|`FRL6%}ldCuz12dc#Xbk3g#r0B-spTHrXlguDb4x*ny3Rz6+BplNH53R!yb-z-S!NIe= z)QDNZw5fW(N4G$xM#*JMQJCp7b_I%z#efzvuF{Prb-!pCmyN9*2LzE2`!!ttHe#iKw0&1Nz6I38>e*boJUu zr>4|+-s0h=N(^!N75lzBnFvC8Gv9(rV&#!V;@OTyB0y5M6xNDLeXvIVtoS|?G1dGY zxQ~zGXF*5m)BL^cg=Oi&%Kt*Q8V_)q(bARSn_*mwJ;j5M7yIn^?Vec-S}fAwRG+07 zS_~q=CIQ^Ud!7NavWqH$I6?@-sa#>s&Ch?1DRv!iO~mx|_gAmC%D1)}Ek#uh*0p)T zk`X-7BwaxZ;ouhWp4gz+T}CJZByqw4fC_A_?R;QDn{X_ zvX{3hnMQ+?#v@L2mO~0o)O>#UGh(3)u7F-qsoWoDU$uFgT?M1kH;`@Xlo^_pCH277 z*)||R0HcDji5bWedVn3cG>h0oc4$xTUGEI6&WeNa#K!!#yf0uLNCOblG&6PGl{-kp zjndc$+lJy?;w&wSo91kt^xWO=3bS;vNzI}ApFf$eFcp5F4GawYSkH1EEGvATHSest zHJ!4#h$VmWbmswgM#nLR$6ay)_D4aM+nl7@9Z3)YQ-=Z|9UQK>ZoPG_p48?XZ$5H= zT&jzK;k@X(mx`=1*^K9(R9h`lVW1XdY7+9SM}wJJvkp#D+-}&hecMr=sC`-f)i^ZE{X8zA`4+&j0}Ofj2U^3 zrX-B!NPrIhFq%KKp#G4(SY)U^v0SADIKwX3q53Qp6{<-FUpdUidW^iviy#wXmg3Ym z`8u`JeYwrE;{tQ#_Ng+TBjB-l@)GUnj^6>NeA9y{P;nf@hYa4un@|6xKn;R;LFjS+ z@fv}>g*&0mV?WtLFVmMxC8)fiH-sC%zZnuX1t}MQUU4Q!d&Va>Qe1R$TbOUfEfNQxU zI)|EH&Jm}#6P)VXDgVfgA3II1{XY$jJ;12+D?3SM=9A;b%5p>VhLZU=AIIP;{JQ`p z4)hAbWDEd|dN-H<7m#8Pz^EHTjs({(PEJnp^Wp5Q6IiPI`EeP1icr)lQvn-JF~B#v zGnPFe$$G??I^l#L>$yW+&%(yCujpu8r!IBw?gVk(9#_qff@7M34R#-*xy-t2pq<>i zxx>(a=Uh|guJUVYwzJbScjsqIlP6o->Pr*_ z#^+Xf?ZJbqEHM>yhT(>1A8jauCx9Rk)MKSxvJTzHUL~%?Any{G!Kd_wb*!kfasznr z+BJ^TB6hnO%h|o(8=R>G6spG`?R9oMz@#<`rp?x=Jk%0A&L;18lx(Z8%@}!t$(|eH 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 Zrm@?iy73f9A~P`PX&Y%}U%VCa{{Vq%P^JI? literal 0 HcmV?d00001 diff --git a/1001_MastermindTdd/logic.py b/1001_MastermindTdd/logic.py new file mode 100644 index 0000000..b6fe0d6 --- /dev/null +++ b/1001_MastermindTdd/logic.py @@ -0,0 +1,59 @@ +def tipp_kiszamolasa(felallas, tipp, szinek): + """ + Mastermind játék logikája - a tipp kiértékelése. + + Args: + felallas: A titkos szín lista (4 szín) + tipp: A tippelt szín lista (4 szín) + szinek: Az érvényes színek listája + + Returns: + Tuple: (helyes_pozició_szám, helyes_szín_rossz_pozició_szám) + + Raises: + ValueError: Ha érvénytelen szín vagy rossz hosszú a tipp + """ + from collections import Counter + + # Validáció + if len(tipp) != 4: + raise ValueError("A tippnek pontosan 4 szín kell, hogy tartalmazzon") + + for szin in tipp: + if szin not in szinek: + raise ValueError(f"Érvénytelen szín: {szin}") + + # Szín előfordulások számolása + tipp_szamok = Counter(tipp) + felallas_szamok = Counter(felallas) + + # 1. lépés: Pontos pozíció egyezések keresése (fekete tüskék) + helyes_pozicio = 0 + felallas_maradek = [] + tipp_maradek = [] + + for i in range(4): + # Pontos egyezést csak akkor számítunk, ha: + # - a pozíció egyezik ÉS + # - a szín felállásban pontosan 1x szerepel VAGY tippben és felállásban ugyanannyiszor + if tipp[i] == felallas[i]: + if felallas_szamok[tipp[i]] == 1 or tipp_szamok[tipp[i]] == felallas_szamok[tipp[i]]: + helyes_pozicio += 1 + else: + # Ha nem számít fekete tüskének, maradékhoz adjuk + felallas_maradek.append(felallas[i]) + tipp_maradek.append(tipp[i]) + else: + # Nincs pozíció egyezés, maradékhoz adjuk + felallas_maradek.append(felallas[i]) + tipp_maradek.append(tipp[i]) + + # 2. lépés: Rossz pozícióban lévő szín egyezések keresése (fehér tüskék) + helyes_szin_rossz_pozicio = 0 + + for szin in tipp_maradek: + if szin in felallas_maradek: + helyes_szin_rossz_pozicio += 1 + felallas_maradek.remove(szin) + + return (helyes_pozicio, helyes_szin_rossz_pozicio) diff --git a/1001_MastermindTdd/mastermind_esettanulmany.md b/1001_MastermindTdd/mastermind_esettanulmany.md new file mode 100644 index 0000000..6559eb7 --- /dev/null +++ b/1001_MastermindTdd/mastermind_esettanulmany.md @@ -0,0 +1,43 @@ +--- +layout: post +title: Mastermind fejlesztés TDD módszerrel és AI segítségével +tags: ai python tdd mastermind logic +author: Szakszon Ádám +--- + +# Mastermind Esettanulmány + +## Bevezetés +Ebben a projektben egy klasszikus Mastermind játék motorját készítettem el. A célom az volt, hogy megtanuljam a **TDD (Test-Driven Development)** folyamatát AI (GitHub Copilot) támogatással. + +## Fejlesztési módszertan +A fejlesztés során nem a kódot írtam meg először, hanem a teszteseteket a `pytest` keretrendszerben. + +### Tesztek típusai: +* **Hibaágak:** Érvénytelen színek és rossz tipp-hossz kezelése. +* **Logikai ágak:** Fekete és fehér tüskék számolása, különös tekintettel a duplikált színekre. + + +## Algoritmus leírása +A `tipp_kiszamolasa` függvény két lépésben dolgozik: +1. Megkeresi a pontos egyezéseket (fekete tüskék). +2. A maradék színekből kiszámolja a benne lévő, de rossz helyen lévő színeket (fehér tüskék). + + + +## Érdekes Promptok + +A fejlesztés során az AI-t két lépcsőben irányítottam. Először megadtam neki a teljes tesztkészletet, hogy az alapján generálja le a logikát: + +> "Szia! Kérlek, írd meg a `logic.py` tartalmát a `test_logic.py`-ban található tesztjeim alapján. A feladat a `tipp_kiszamolasa(felallas, tipp, szinek)` függvény megírása. Fontos, hogy a kód minden tesztesetnek megfeleljen." + +Később, amikor az AI túl bonyolult algoritmust (felesleges feltételeket) próbált bevezetni, szükség volt egy pontosító, visszaterelő utasításra: + +> "Térjünk vissza az alapokhoz: először egy ciklussal számoljuk össze az összes pontos egyezést, majd a maradékból határozzuk meg a rossz helyen lévő színeket. Ne bonyolítsd túl a logikát!" + +## Eredmények +A tesztek lefuttatása után az alábbi eredményt kaptam: +![Passed Tests](teszt.png) + +Aztán kértem egy konzolon tesztelhető felületett is az AI-tól: +![Konzol](jatekfelulet.png) \ No newline at end of file diff --git a/1001_MastermindTdd/test_logic.py b/1001_MastermindTdd/test_logic.py new file mode 100644 index 0000000..78fd4c2 --- /dev/null +++ b/1001_MastermindTdd/test_logic.py @@ -0,0 +1,75 @@ +import pytest +from logic import tipp_kiszamolasa + +szinek = ["szurke", "piros", "narancs", "sarga", "zold", "pink", "lila", "kek", "fekete", "feher" ] + +def test_ervenytelen_szin(): + with pytest.raises(ValueError): + tipp = ["sotetkek", "kek", "kek", "kek"] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + +def test_tulsok_szin(): + with pytest.raises(ValueError): + tipp = ["zold", "kek", "kek", "kek", "piros"] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + + +def test_tulkeves_szin(): + with pytest.raises(ValueError): + tipp = ["zold", "kek", "kek",] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + + + +def test_nincs_talalat(): + tipp = ["szurke", "piros", "narancs", "sarga"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,0) + +def test_johely(): + tipp = ["zold", "kek", "szurke", "piros"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) + +def test_benne(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) + +def test_benne_johely(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["szurke", "lila", "piros", "kek"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) + +def test_duplikaltszin_johely(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) + +def test_duplikaltszin_benne(): + tipp = ["kek", "szurke", "piros", "kek"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) + +def test_duplikaltszin_benne_tobb(): + tipp = ["kek", "szurke", "kek", "kek"] + felalas = ["lila", "kek", "kek", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,2) + +def test_duplikaltszin_johely_tobb(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["kek", "kek", "fekete", "piros"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (3,0) + +def test_duplikaltszin_vegyes(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["kek", "kek", "piros", "piros"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) + +def test_siker(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["zold", "szurke", "piros", "kek"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (4,0) \ No newline at end of file diff --git a/1001_MastermindTdd/teszt.png b/1001_MastermindTdd/teszt.png new file mode 100644 index 0000000000000000000000000000000000000000..0d246c256141a876d177d6ff500e72ae73226092 GIT binary patch literal 23964 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 Kxk|}0 Date: Thu, 5 Mar 2026 00:09:08 +0100 Subject: [PATCH 6/7] Delete 1001_MastermindTdd directory --- .../__pycache__/logic.cpython-314.pyc | Bin 1846 -> 0 bytes .../test_logic.cpython-314-pytest-9.0.2.pyc | Bin 15471 -> 0 bytes 1001_MastermindTdd/game.py | 136 ------------------ 1001_MastermindTdd/jatekfelulet.png | Bin 39581 -> 0 bytes 1001_MastermindTdd/logic.py | 59 -------- .../mastermind_esettanulmany.md | 43 ------ 1001_MastermindTdd/test_logic.py | 75 ---------- 1001_MastermindTdd/teszt.png | Bin 23964 -> 0 bytes 8 files changed, 313 deletions(-) delete mode 100644 1001_MastermindTdd/__pycache__/logic.cpython-314.pyc delete mode 100644 1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc delete mode 100644 1001_MastermindTdd/game.py delete mode 100644 1001_MastermindTdd/jatekfelulet.png delete mode 100644 1001_MastermindTdd/logic.py delete mode 100644 1001_MastermindTdd/mastermind_esettanulmany.md delete mode 100644 1001_MastermindTdd/test_logic.py delete mode 100644 1001_MastermindTdd/teszt.png diff --git a/1001_MastermindTdd/__pycache__/logic.cpython-314.pyc b/1001_MastermindTdd/__pycache__/logic.cpython-314.pyc deleted file mode 100644 index 12cd8c9e42e88abb384ada69b4564945af4a0111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1846 zcmcIl&rjQS6n_Sj1luHr7APzshLj)KD54#rZH6YXvX&_;+fZeYmW6uY1vifE*$x$% zG$C!8*kKdeG^v+KaA1N%CA3XFOqw()mmPy3kXgO4KL7;1@7akVpslxkB`1DTZjGkCKElh6t#OcD`@*38zrApEbx3uE$lrN+i3 z5%Ug=6IyK;5_Zm6JTX+^OOm%91I!_55E5QDKUw4E=Lw!*;chE{MoztT8+WCUJqU3c zs`0fv$-s@OUG>lbd~GM3out({F}Tc{CkdK&05l(7^@)1->?G+T@Z4YVTxzPlzunCO zOi|U*t!Y&MsjX;A;Ll~MQAxtarMev42mg(G8HaO{;}h>q68#NliZpMW2jG40qbC>F zd9`k3Vc_fk6@9MKGj#l`|C#?8fZZ|d2+h}{@7+$n$8TdfXZ_~s3w6_2bCnNn?fhv6 z!w~N+Gf#c?dJWDhnf(w)h`KKrrl@BmWsZB4Uo-QYX--yCQaZo(NZ_t<0%uB^#-*kF zrfw%iIlpO$0~9r?r;HfI;rc|B1z8r17&nSwGp!n&k;^|-I9W1Gf$JM8hfxP?vz39G zCd%eZkVZ~Y#57`a9G<<9-&7XG3bTkBk=vF?QIn#X)s>2t2U$%PV_e_7C?k4CQ*+X+ zl>cQ01+8WJxyoZl-i)pqM(zS6ihP1(h!r|skh9|3x~}RmZd^FkVT!V-RHQEmsYTAA z;^u9_{BIS{s3>81@2FV??aki6hS=_C8rH;Vs$!~!pl}syIJ8wpbt+Psf^G_OM#$w< zCEJYK@?V#WuR1iwMZFe1tID!CYf7qO==dT4s}@yR)R|_hP8XDvXn6$mTA8yvx|mTH z#3*C=+@4vat;zC~%`VfBc3{zV0(}!QYT638c=v(-oWZKao&qw0F3gE(i*fe55g}P^ zr{+t_Iqy}&evkI_^w`7XtdkHvxD!j{pDD8NaUyd%q6vF6X9u)Ji*@MJk|Pj@PtaR% zkNqY!hVgd^UUWd+)e{f+=;fg=7FR~U{QSB9N}=ukj(?)yn>b)EFOwxYut$fUHw6pf zp{)m7cMG96cA7>C%*at4G&UbmaH;*t)$gw@#s6vvJ(=HW>0Ns7&;u>4OB1EmwgP#% zbg6mi-M<@}R<3_Ly-XbXfMLJ6xibGldYA4j1v*woe|%gF^ln_=4fJo(e>DDnuQ)jN zXQ1#=vN%0c9Dlew_^`xwtacXJ$aj7uZtUD=d$-x%4c}9GmmMmx!F@Ke%|=$o*6;1H z{fKA??K6>WCbBxd9^YjKOU#vhCcMprSIKqn9@BRe0)NY47j$+N$j|{BtW+2&G2I)D zMdsB4(_LbM6^gMvCVJ$B#?T=J4X+gF;Q~2)jP}7qlyJP<1RXy$pxZNO`9?D8Tvis} X)Y~w0Y_`9ThqVMjoYcgKn-2CLHYmju diff --git a/1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc b/1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc deleted file mode 100644 index a16ce47c78c479eade40da3659ee3880b196f0b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15471 zcmeHO&2Jk;6rWwM*I)T?(vS3m5GSEf(>7_7w6vH&zo6l(L<^)GES60&Nf&QycXnM! z5K<&KR9v`l=n;vNr5-pS?iK$49|fdQ5fZoFP*Vx1C*GU!t{umvPAh~+cM`vynVp%P zc{}@iZ{Ey1(AAkF5a^z->?;tP!-OByT4e1rh^&%#iJ`nqJVjj9sYpc~AXAzb9guf) zPlr3|%dx4r7at%a#7MuPcnKrYN4%t=0ZkcEpdE$|w9|+I?K0v(yNv|Uw2=hbW2Aug z8XZ8l8J$448(lzm7~Md38p<%q_T0jbozE&f?b+qBS+Ly|YpLW|uC=cJF(?&*-`Y1o zR!JVH4AcI|{0z7blDy_8ClndWDW+0UD-n}S)NYA!sc$G{9A5;kN*!!hO}{lr$X8jrgrk9q}KIG@!Rc92IP z!J-foq^j{~*=8kIq`0`~X_I>@2xRjwf`d2E3?7BJGqyP3?LA-J4*HviqXMaP=WFIlcf*^*tH&ttQuQ(Cm=M#{^4 zhe%R(nHJ%J4lSD4F53pRb@;i+zEyHF(fxVHS{F)g0IWff3N3LkRcl=81W_;Jx zzH9o8_~>6Tk{pKH@c(0C=Cz#5#;_hRl-n`bV*QUOpmfvzH?bk(4xTR=+wd`ZP z9`sE!qK5u2^o=}V--3G3H{FOC@lExuy?0!nowYf;$#=Y=KJ+ziBpPOMYrd;KPmJV! z%SQaNqx!*yZ=xJEQbxy2bW~ZFtLJ7ifWclt&lnMar@&!#5;IRk^E9PF9tb)7bRU ztegC(7RgMCr@_Pai>GGYgCb+hkBn#CZ1UsGq%3zl>sFIuP_pmIlTz<6EyjDyIm>ZO zM$2rjv{bejbYyjeoBpf zujRg`g8Y!m{i@aeZ)myiQ)59gh}=l+4dOp)xyEFW4~<&0+O0NW@WL*a%qiIDmB1aBzZ zfL9=b{!`&5HEYB_DFhzF7)mw zURAvnNG!G=3q6hG01{m1Yy{|((B9uKU8K%3djX1M;J4-@^Pxu!nOP1-ziv$zB6En$ zFeetsXlGXHOu9S@Jp)fzI_L0Q-yB{Ivk#Pcwj+C%1~K;~ImEK+tBYVE_C zCy|681zdm-d}JU^*I98w^-=I=y0zUV1S!FtIsujN5dtZ88bJ#~;WYf2=TSc%X&PhwLcRsk0vgjm&N4-XZpEpNw_D^w8954_X`g(}#+ty^%# zQkP9)yKSv;cMFi3uaq6TU^yOcxB6i9Dl{?*zhK3CFkJBhJHm}N4Y(k}bf`>9K7`67 z*=ieY4-e3wM+$&$vEpTCVBWL`(7Rdyv|RX}hc?h~$zDSeDwDtk2%$0=DwA?1ND2o( zLS+*0;lBGOb*u{1N;D|yYD>xNzZZs?UTJogO+!O?4k+04ei{|c zLyyj;cL?6NGY26A?-0D@Opr7L?{+r5*(<;;U)vPm{Ul_F16^757Oq$2{z_X|{dfzk zmexxN)^9>{XafzvT37`}L$C%zNqGDgCI$(u0>}m6LueHUtpXcPC~XAm7|ay`*6byW zwT05H%(j>5;xcvF+t3J_7uEyxNC?oa02=)ylzdJ5yr+Le_e1zcq=kP(Pv{>3Q?eFd zPdW6DfWww(yu+{wAD9iMj7_eXHq_r@X4~F}Kd2|&w8&?1y~e6QI)9{1fF*a&3s-KKPi7?GX`;G{6Z z=m*ROw~R!P#bdQRb`YO|u8%w_TrBIZ6~d*Gp`RZ^e>CBDAda|-<5Wy^9{2wk8kvQG zhN0pwgo_wnRgOz~GQ^)-D$Q3M`aF9N3L%=hD24uvD2nnsA)k^@I)5WWe 0: - print(f"🔴 {fekete} fekete", end="") - - # Fehér tüskék - if feher > 0: - if fekete > 0: - print(", ", end="") - print(f"⚪ {feher} fehér", end="") - - # Ha egyik sincs - if fekete == 0 and feher == 0: - print("❌ Nincs találat", end="") - - print() - -def jatek(): - """Fő játék logika""" - welcome() - - # Titkos felállás generálása - felallas = generalt_felallas() - # print(f"[DEBUG] Titkos kód: {' '.join(felallas)}") # Debug célra - - # Játék ciklus - for kor in range(1, MAX_KOROK + 1): - tipp = beker_tippet(kor) - - try: - fekete, feher = tipp_kiszamolasa(felallas, tipp, SZINEK) - eredmeny_kiiras(fekete, feher) - - # Győzelem ellenőrzése - if fekete == 4: - print("\n" + "=" * 60) - print(f"🎉 GRATULÁLOK! Kitaláltad {kor} körből!") - print(f"A titkos kód: {' '.join(felallas).upper()}") - print("=" * 60) - return True - - print() # Üres sor a következő kör előtt - - except ValueError as e: - print(f"❌ Hiba: {e}") - continue - - # Ha elfogytak a körök - print("\n" + "=" * 60) - print("😞 Sajnos elfogytak a köreid!") - print(f"A titkos kód: {' '.join(felallas).upper()}") - print("=" * 60) - return False - -def main(): - """Főprogram - újrajátszás kezelése""" - while True: - jatek() - - print("\nSzeretnél újra játszani? (i/n): ", end="") - try: - valasz = input().strip().lower() - if valasz not in ['i', 'igen', 'y', 'yes']: - print("\n👋 Köszönöm a játékot! Viszlát!") - break - print("\n" + "=" * 60 + "\n") - except KeyboardInterrupt: - print("\n\n👋 Viszlát!") - break - -if __name__ == "__main__": - main() diff --git a/1001_MastermindTdd/jatekfelulet.png b/1001_MastermindTdd/jatekfelulet.png deleted file mode 100644 index 515feaecec5fd157995b7e93485c9f856a884b3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39581 zcmdSBby!q!yYD?T(jh4&EnSkrfOI1v(jbDMlz`FP#T*?fy)^Ek!@%eu56{V-6N=!gc00M!C)zy^rK_E;=;Aa*e z7kH)R4cBep9}EwD)rX+U-wa#8FWAo&v=u<0ns`El4G!@8EjKk24-kmL^ZEy4-k#YT z1j-aqS5h$aw%kPqB#M$yqNre1vx_Y6F7I}ZagX7& zrR0$9jNDF%EV^I#>(Bm|rf-ve8((w5ho}+a)18mczvq_Ew~pd%EG~lPF3zOz*Pjcp<>rB6Ff~&QBqPeR3I7w-i_pm zRG`297>=+S8}N2H3$7#Zt`b$(fBf*!SJDx&&bL#}3OZbG#b}FfjSjUyi71O5+u#-0 z13`|NOMQaH>~x=9>h>S}ID^uyKBg&l%%3r><7g4LYRNvkxEy>Cx_~ZB2+WF%bP2)< z6$Af@#JT6gHL{3(r?okKk0HZS_Y%Q48qO;=#MgxAmzFj(3M)5t8*$XEKE6uJqpQWK z6wAu>r3^%$FTBmwfa)qKNlb?*WDeFKKl`4)RR;`6E*8plUvY@Aq}&Qq=JsMl8~{ zv>4Ns(qi(b-1Iw&vk9W~nh!~{(6wnn3$W|^(zqkLPJ@X8XSTe8gv8PN^9M{EvS{^|1H3?ri%r3$(F4e>T>pJK|3%q&tSWzjql5T>!T2T0 zU+a)H59ZEu#3Wb#F{dvzGkPF?F=In6T(@7x0zl#VKA+$4Ra~bKoMEZIc`- z>*ALm*`M6V((=@WB+dpmmRoLkvQ^zL7ecVedt*I%K%isUv8AVCYFz#0@$+qAll>&` zUxeQ(a_Pj6(C3%TPfYI@RFlqRW7D8vXGoqS8)(BIq3mq0EM;HcyOl_S)9&VCd6~3B zsu1#J=A@U3o%Oj)u=B!1aPRtMIha(-@fhA=7Bl1z@8Z$1czha!1QKUCN1cU?xWs~z*G!+a-(_o5V1#5oM$`4M6nmMcOk#iUbF{; z)N_xvdlFlko+bGyTdd6=WwNlo(~D;>#C0 zSw4V=YsZ5fzmd@oD9NXqLE3gwL_%8xb~_D8tuoFOyXMVhltOuKxqb2$bhJbwb3~!^ zAK387-W1e1o(bA6qk1Y9ZZpbe8c6j~eXYsi1zmJK*FEa`#?%=B^1rZZ!F+)9_I%V9 zVHxiwdqjXzet^$={G*CJq@KnSH^;w^e^Ifj+sd2%Vi~Fiiw;;cHrVO!vHBzG>doMd zI>DF84?I5cW{O`S9>j*A<-bhqQ08`cR4G9)s}?<=)T@Cwxp0%Jb0SdSE+z91yoD3V z9P}!w(%K5w(aT&voOtj_U^2;QNRA9k3Yrr5a>-5S6Vc_7nt}L8A=VF;R@?D_7=50a$yGSO`Y`d9Ua-i#*!PZj^kzbda z-;QouwrdWCxh|&3Aszjt{R6O%-Vci8T**H`mn12cocJP$y>SoyMsqsg$egD5z(ZN@ z2TYz6XI#L%)Eo%Vr-D>0)BzS>CA_2`#8F9^L0kOkwh_b@)drIoW=|D(XIA<7SK|DYsx}A$u^2PhqaqGMJn-P<|lEYw@$g8$HwjND6Ke{0&Sl-*0)}==Q z-V1QK@IemWk!V?T4~y&W+MsdP46k5&3>!FDSC;1VQ^4(mK%V(pRV72`9nulRT@|k( z-d7X{1#=!POJho7ECqJ#5d|$-L)6$bNG9CMNPD4;(uK~pvvpNvJ4d106bU?e!v%GEi-y)MAnfR0^>Tm+z2j_JJfunYf<_9 z=xE_Iq^qOp#b6)<7?IO`geb{pIiLi??z!enyMAZZl|`48opG_2CywJfx)aWI>1EwA zNE6B~YUs%2TK&1vnt>OTLD_ZtIOMy-cSGjA04#C#O`9o#?J{0;@vRWWQK-8x!M|Wdxyd$KH8m!aG;!c|m*d{a5MV-~Y9rUScPP+%QrsV+LZv#JuU1hfX zcV8CyCB=tV&Fq}QwX4u)6tk>sflKl^q)5cf;mU!pPqCSmdDC-n+ydg4-{I43YHA>J z7KO`JMSBs(owv|J-B=cYi=yqnnz7L_6G%qx95N0oG)nY3v)SL{6YnUVK;vGONi20Q z5cxuKOHK^z+!N^WuGXi&wYp80vJvcBdhb&inF*ClgSp zvYOU>J`!Ds>RVrk#T4^yeX(*i<93;b5%m- z{rYqfBi=7Q!nW~epr}`ENEK-g|H+2*z&jxGJKHGX(Tv}xp7iOzJ&Q#HYCLVB?*gv^ zn%}%QNBssf#fMFlERc@ppwTuvRw#qTW04Qn8&%@{Vg#Q>(=@iIK}kWStkWjoS@(--;FYepYx;huUfssiDq+6!m91eRk z#kJNZ{-Bj{e(H{(sR2@JGx(oDj3gw5VJ4e0nQpor|^EK0j-U zf_y;JC9gs=$k`ey+Z`}OGoY*FN&N2(LtPVMo~FI# zSEQzg4YNvE0<&EY>0wGV^?ULTV&u8|g>;-iPoQa(7cK~n+}a%WOT}u7;-?|?Tt4ut z5-J9Px;2v7)TCoScHo>HY+mlf<7HNwsd_B43((Y)kM~t$s7n-_(QG!HQ_k2;_N1O^ zIV{+HwTiU|E>wP2r~K%Efe-RkCFznS4vMw6jVxdSjgfaLOy}Tx4Jk4+GDsb!;RIo*2(YNV7)$#4)V<;s zxd3i!;MNt5v`c{mA2Y-2I0ku#k0$j9%%mBws8wnb_BQc+8w=p9#Q_Wd{+pcP6=~+I zlC5{Lbd;astI(W@^O2)`d@%P;L91(fFuq-$85sLA)VQ4C(XG*zyz#N@>asJz5=vZO z4k8t|yVecwb<(@*VEh#yk=1yLX+m|qgGFqt%_Ovi!}o{U-?QcW47DAWVgWgnD6vj9 z5~vU)n@CmM$cY6p88^!bjJ__)2Nh-sY1{r}VUsQ4q0++k7~$iB+0Q0lrHu>QOk{cB zW)N~aEr<|I>)saLI>rK49t*6T@6u8h;kEHAn1$%o?Kg@(vdX|Yk*t|73nayoa8(mv z`V^(t`}@pdy4ACO#GyPs7V7{ODCJQ1jU(?gS)9M zt)VX_lOk4EsWVv-QHQ)kN0mVj@SEQjk3;O|s~v4MNVC1bqBJm@CSLZn$Gp_HFO55K zE!NmVJyojGwG>uTt~O=W%jX&1hXiAu6R99#mllf-5{JY3Xu-vO4AfS|nOeXz*AP4`8aPu$N;Uf-nb!EE{ zRpeF!M%&lCeP$r^Y3Y^(Z)rW39;MNgfX!@{ER?)_-hP86A|D5L-b7KVI%{3}2$>8Z zMs8S3k7j%y@g(t@CnEftcTSeCOM@x?MzrdQ< z5JV=%s90wj^hqIiE69&}Leb^5%}-y?4T+s2I<|(PcZ@GhP&Ja>uU323a|8W-W<;9g zG*=-ye`_9j40%3rjrm*gq=rmW!-qoVvW;Lnp_ z=SJ_%HZuv7x>9Qo6+Q)Ymy)mJsnE0^xgEubEN zE}7F*HqzjL+$o70-I6q&TLS%0> zq=Zh0iadzY#p=E1<>lF69-UAY8*Qt_rk|?b8HT9^Rd)oNm@WKsDMG8+>Re$Rsa8x( zFtb5hUe-3FE#PF!yccc^c{vosdMoH97s`3JVVHDgH0eR=Gazr$V_~&g$V%gew6yC> z&5&2Eh-KIka!e2E4z@5SITm!l`k1WBU;J)B+93PBG6(f6;3z4HHKd#uDr2N=5AKOr z8c+x5nWYd$yl5)kt5 z4ZfJ@ue}br>^EzN*l|=dKQUC6U~A*9JsMvR*nQ6W9HIFuyu-C=y;jA6lr!;>k&hjV z6zEs|N@*;P#-#v~q>WB%D%K#&w%k<`y$4}DUk0zQQIizj{d6j%HH9D~OWCAmEOxYy zs5ZY-kHxZy%ux57!8s^mvp}#PxB6ZjT*E}#W$p(vgpJukuLqlwR?<}Se#zs!g|Ez}PGbGl=`%C<<^X(v+ z%=DbwXuB!^US@MArn3e<9J1a7@QI19QmWU(SD#iB(#p#-{C=EyLTGgb8^<4p#6Fg2 z-U~U;be0rY#gjXN4a;!!kw)BZ&69eR!LP?VDrcNOcGMJ^xM%iJ3qIiQ-^AvbY6xa& zyz)#PWF{x4GT~EG#8V|<5nquQJq>r5RS;yLk6O?6p?p6I9fR*NG2{i?za-6n$;L3Z zeJz6QF~Ho9$AFQ@Uc4TEHawsEIM7p{ zoLyF!ebs_iFMGicGx+>FEwib{gFI_@UsYopDc0nRX0G|mc~{a%y<->5Z1Vmo!s)@c z-)DgP!~fmf)^jsOUIDP=rHWt`l7c1;1|a0Qu4?mYWbN0%-DudLr(OJ@4^=}|!{nD~ z!2tiWR}Yk)B8%tS+VCrb_)UQOznLOtE+jPaDI%xQrpK%h0Q=fCZo2ft14ZqT=aY^+ z?0LJ{8UW1S0#b5aWSPV$2PVGH16rL#nle{tV}p z^B9hYB=u&oGz{IRij2cCGRmtuc~AxH5bLtUomfS$3dxjdK?zji`bN7A@U1Z84W5}2 zqNcD)){Yw3`w71GSBW%}#qoJ%!s9%ip0wgDTS;*kz_mCtlT`WpBR505odN`W27ltxeV6I3KJXCE41XItLs(GjEj9Eyt@9*u;(V*OE|kb>O^ zvl)Z`8McuMnlv9Fb8=)%uP0Q{pUMJiwG_R-`EZ@DB`4wTr;d3J*GaO+^=SjViumX^ z&TI@C$v{^8r$#VrhFM<||HewCqC%10wECm`5e3FXcnvcSQBtoil$oX~)IR;u6ln2@ z=$V7v#LC;f6z!8V{AqPj>z|LAzLR<@=ozcpT7PV)7;Hh>nA(!@Ggk_h+uj`rYIs?~ zf3S!4b(%{s+uR1C&m`Fv!;Y>ibBD818SK{DcsC6LRu7EpI_`6v6-Mb%c#QPwcEp9W zSeK3gIV#B`4f|H}RM#(NidqJY5d~fi8Y(eW6|r;egpXHqcSm~<8qPcK)}JOgv&vV@ z2tB=Id~`28mZ^Xa;7JjhozfRT*29byBI6b=(M>q*hcRF5NjSrSBIs?|7&5Qh9fJaN z6DvDdKIj$J5Mn4Yz%kwfYQ+}@(CgX0$HHvi0&txqnqqJA)S704?n5-KBL1XvA>}nl za8*|@_0=)0=VHy3m|c5v6x7E2=7pGTr-i~`2DIxv7XCLI9tK|VC`izI!m)!M(PXf~ zzK|tAra{Z|M4eArVH$jV4b6Jn;v{|dE!m&LWjPwG098Oi$n?#EGEn2^v}IhJ{ArP| z^><5$21rrJ=1R@vE;GugGtSA>PsIS2dFM+Zi?eWkVvC5FtY_F0S3QECWLr=SSVrAr*?p=XF;(sM11PX6jH6fvYL;8wP%op}dtdYlk}F|%-0f30 z7JMOeii@kF5I>aN>jcp~k9fb)NUV(Zmb|~2Q3{E@3)CW%GoSaOf;SSD?D6`!+sXXcgErPB z9O^Qr=9br3J-mEL&O$T31y{Zdnm>kfB%sdFxj_?j;c@LAb$11T!yM+QNk$?;RT1SC znzSwsWTMD!5U{2ziz7EKi#teh*k|GZT>HcRVXA>!KogUR7b<3&vq+cTuDvY|Bx#Rh zQB{DcRTBI~Ydn#%|3lsOUt;YO4E{G^* zKvGpL3aML+ndOs9(pP>9=R3+gs?o2wEhjOqAse@2ufAVG+>*vfK1^)*0cZr4#Rbd3s$z33 z>5-0r=x2m>T7W#<-ER6f4P?lt80j%H;YTLpp2MHn5VweNn&o_@xI#mdvM@7V5U}_& z^gJ`$%2G&+x`nTs@FN9= zsjS@Wi+1vqkrVm?W_*P}EZA2%cUNm;PO&geKsRhbI z{BI5*hh2gokJ}%Fq*dKmtQ*J?7R88x6q03=88)b1^iK21rK?DTcxQ+MrzUO!Wv2$zh@rIq%*&&f{;gM)2nGjwr(pi2~A6Kzr`6!tMh%8T0J8X1sVZ-|=#7}7! z(UB$u|A(upvFE;)GL}__vQ(dY&$pwX z#vP0{8LINS=OuKTRL!k~BL~xufPCU{KQL6wHJKVM{!fn;Cx>o`qwD#?tSc5hQBea+>=?3HJ_?^gvFWhi-ehx z9w}E2o+8+C@PlLKke8q3$0yMe=zDU>^ert(bNOq=x%TW0GgCmfW#TSK;vQr8iEgcXWgvAE|G-9T9n0QwhbF-y+#3PX`*jTJD+vx2lcz+Tn&Iz z#9r0%VHQ<;d`_dp-Evoud=8Y-h|~Qu5lGS$;afA(4k`eu+LS)_V~X%;cyO0BU)chl zQ&+J#@Re7XD;mgs4w$e)e(nR6(x@yS3JWtp9bh%(_@{wnNe4hL|5Lk(1)2~~46B$m z93s8tmw6ddAvSmVPEK>Zl z^N}i&kHz1m-q(N)294mG>)T)sW!Qr?~dPkkv)6(@%k1^?}M&@oQFL3eC1ot+b*o1IE5*AHiGk) zsyyMiuX|FG(9LwQ=J?;35KO9@kGL@=+szU@-+b+Gg zX<=Tw@KYG%HDopuc0Z;bVuQlGmN2FbQ*Moj8HFs844F-2JiiB^7Jy1c>*TkOmrXpx z`i3d=AnqVp&X;$SXLpN-5754!ZzM`R=2MHp;XN|d?t^^3prIuCbD>~ThwNL;wI4<( zDP@(@13g8E#E8^ZjIm0^4l=s(%KUcIYqxj4Be=9pL6foPnLdhoJ-l*hwGioMVBvXh zlYY1Isw;E&Ee|FQKn4J7((7B*qy~!3eU9i)$}`YssCIk-rCmE}o($mfW|p^6;$1@_ z_DO?%(|tiU@1(5fO=%`q0^4^1qUJ@dqYHiyio+o!$Sj!JHnDg#gZBk)jY1~1+P30$ z8nSeRIeVXE9m5o=b3`sBG9+HfIUv+$#2|3L7Q{P+zX;-{;z+jBY-mSzcY^=$vFydW!X!o5(I1)C?T^VNsxDDD6Y#pbvxgY z)yH1Tw$4CZVfSf~P8g7bls&C~v#g;EU&+3*C}NrAQ-8yt*HRnIqa>8dRRy$RL} z$^eo^n^j?N!@bqhoUFIslI zUn>p;poqL7QNLGryzZ1?+d)VRhZWSVpXUVvQj9WD8va6VR_x>JCfFJ}r^{8jpf%GF3(IhZuiemN zKo@q@1S&~S^`Mt&yyw2XQ(yxh_(OVAy%K@lw4G@o*o*@$=WTLJGv*4>eYB(dww0$p zRT0-}GL-#<31Sz2U}Um)1wi1F2CESSykYigLl7*f^Zd7};VaE;^`znLOre3rabiD=Z-*2;(wa%8089ik7^ji7_ot=5M4C@}uUqa)Z> z!+9QVaHmlMP#c0Kw7EX@^ul!Ue4n@gTnS7uAXz5rmJ3@?4p+c1304i^|>;S`v}FE;AX%@sB6!!{!~&Z~*C4;B!F3qXHw&m7HaxE< zRh)i(-pwvlr=FFQzwx(S>PGj#)JeE-JB8Z&+*>H+y;<+oAVUfZq(t)9uy5hj>`}5a z5`=7ldQS6K{A>st(4H}4U?+ILVaR0ltW*8B0nz$x(gz4ow=qg+ z4$5}q8yMtgv-ASL$K_ldKS_aF3rU*oO>I}2C7c_RB5 z!IT3{f$@YhL~)FO=K8zz$J>>PL->86y$gQHz~ho{$%fU)7%{2g*EN6!*XD9sAdptd zUKQJa$1>ANU)Q45P(EV+RH0F{Vc^Q`usRNI_dTu@;87N}=J{ngp3>}l3n;`i z8c`j4W@3<@y<8=iqJv1LQreazr3WP&B9S}q*^p)?<` zvICKkd>C*t&jS4nfb#zLDm)7xAiy^ZeLIrT5!6trkm+O#ef-HAj(EOu+0YBii52Q& zL_Z(Mb;&h3vC?g4?3)Ojbx_%Diac2mM)qz4l>l$8bprJRe+eIbK@zR<=f~>5318$> zI?`k)mrjeZdBi?exiD9Ix!+9;Eb^?*I${0QoOEUuebcpvpAwIDHHZCvC&Vcly{p#w zlZaGZpa9UjJG;Ml4_0KaDYP4ZK>GqNoec<+1CEm~&@6Jlyr(ejCIq4%c(*Ne^2>oy zOi0LZw;_HsN}jB)iwSq)fS7<8rU{&gx>B6nxh+{fT9jhzd0b1xOffUhgT1B3ExQ7| zE9s@q{*pD)z9)-!e=)h5Z7W|QB5sjt%Kd8ShuJYbWbpI$Oh#W5s)no>uSa6y3K_^HmhzUM<&IHA$_wN|?xc$xI)nibKz^Y-RyOIUx~ zN=#FA5oc*@A7|#j z<2w#^lv}re2w|6+#xdW< zo1wi!%_q#ImEg&ZAKp^Clbf33jPB`1vl}!(m4H+3Aj;3Lrr7<~!j+SA{5%hkCL|yG z#~I)i?>&qpjVGY+6vd~`XJWm*I;d*}r~(2%Fk`=PI_LgXHd>5JvF6-CuLQ*p_@_Mn zNV$V-XpkX@uswtHg^edQIk^}rMWKsw)2(CmzqG}$X+kY;vvc^ST*(rRtPQrJIMh$I ze#S%dPg`JvQm7d7GZ-cLaLN-)ATIf0eH`x3@m1mod|jBq7~=jnK4U9bF87#YjU;SjCgR+RyqMH8d0{UsjQcu&1;qHgqE zR?45}$5S##;g9?Y&gmLJZ^^Qbl#;Pw^Os8$EA3P1PSB3D;PIo zkscne-CCOLbyvOFM^fBE*c(Bh#_`i69ti>}baG-acfxS{d#p%}rnbU@JJlBC8s54U z`H1-;U9pXxEQi*yxM&V+hv0tLnICQAFhT_2W8{6rWz?&JPPrY3zG2t%MSNm0Ge0tm zJL}2BNoII`a}baaE&oBZ`9ET8iNS*?ApLt;V+|wpoVuy z#F+GFrCXmlax?AT&vhH^K4$)dR|sD1tO9ohBg?5E38k|A^J46P;qi>o+pbpP)&1s3 z`fn5>FMUzVu#D6N-8(-w%$1E9QXLoMhkj>NkQx|sb<|iZ9PLCDeTIxsrBa?lZ577x zGV0ZTllIqJ_@Y=i8Ei#ALx7@jFt?xW)|PE3;4gIo>_MB-eT4eY)d4Xnb0P6B9Cx7m z=Lpn)8kPfb;lFEg|4Ta%`@29nt(|U9!!Pwg?K(<5_zFKih#z&;Cjq2L0gU=!sGJMa95qTV&Uiaa!ZAv;&vhJ^ze10T{@s=&RhKe0Ka`hm^&i`)vQH{+P3cp^Ii{W zIsf=_Hp7=?iQcjQvmzK_-*$R_@0^#Me`X!eu}rY%G_7cM+kT|OvnkBw_fSzPY+k+uonw0#4DJ7Q-lPUR}`bN4X`GHOmsxJMmA2RR>^!L%`-hAiUJ_ zE34FbULOiR4MF{c1@KXMIl;I)i`o?hOs-;)CJ~!L+dbEc1z1Pos^7jv&U*s;v4Ia^T+Y=yTk>@tv+JX^r4%W;Z9OIPpobn zr)`t21@RwSyLLrt5cAEpb~LN!^Wu4tLAC=Unp@5>Vs+LE!K_!V-`>=H&%SEEHO=-S zX1+3K;9%muMTrTF{P+*JXs?4K{716li zBGnS-w78`B!=)?PjH{x!&yHJD*L_9zl7F`q;)HzI+S^KL*tcXqck?349JLIOh!me8 z-cqN`V_$#wVL3kBO>?8K6G>yU73 z7m>_Frbg*(Dp(RKstOc98v8|1#Be>GxcMXXF+dvCLWQOh zd1_4xuD79?75kUW?%jR2oJ@HWklYy7X z?e$-1GL1)hqT15rZs#lL4#Z1tM(fp|;W0A4BG!B7Lcex%oC0;3_i_N`V_2CE@RYSH z2)eRy@;F%i!#0#%whN5&h&aN{iF^Zn2)|mH{8M7t?Bf?xZrl3d7a$GTj6M*~G;q(= z_QTHOpozKhQJj0Zix*jzf!rm5N}i&IENUlQKfA3&z1C>3AMK0?+k9iq+(D$w+^8iS z1p1;h{EgyHctJz*q9remTAE~|a4wB`8M}7Wj9tsecAditq&yrmVA?%}RbP6oF#;J$+Z~vH|LdX=9tT05D|5ieDBG~+T$tJ&6b=~ z^}8Mgj0U?_6;xDb@50t}V}Gw(eYV!o-R+2-vwRBgJ35aF(h^j8pARDrVNw`L>bt~K z^Q^T!=tTfXu?(-Dc+HE8`m8}I#p!Mp$5)&C7}_fLHG0&x7i7Q@Ab%^(f+ z2`wx_7N6*y>4?137_v?$Py)pjJw3@3GK2gxGPAv|yFffZ2^Y|D-W~>U?vuXtm)Fn@ zZSMO`@GHUzF3^A=IB7VUc3~#B(A3;f2TI}V3FO34b%}7mG%E(A#Z(XzEi|#4IG6&{*M@H9=z1K)>%A^x&k;)@ySou;$ zH%Y}K`Y)`SR)IPTSHeg&^@ujhV2<$JCszh4la_ZRFJ z-f-MM=IXDFW{z)yvz(u#7<{kdhH$p7q9hL1O71#@+P?Og;ku#g$p|el2V^(_y$>{my|=`7-8@RkEcgg6~D%u?*1Z zkex3(a}-RGElw9Vkcwg9NygR>Uu*tN$B$Uim~iOfg;_TY_&QB4D`Wy{wju-G#_6>% z=&*T>Ke(kO4 zm(suutl#kJiFgnJkf1i{t?N#GJUsqbx#Zo$)Da9^v&U;rAv(RQHZ;IO8-p`wcLEpL z(d{XwVFt&T)FE#AonCFRx0|Yz(!L^#`v3v6L#OqEH&B9g;d{WXSsiw*lWXBhq0$N) zOE7>DW?nbtlu~cw9NemlpKAt{qn$o& zZKIEUG6e|Bsmp{Xf-Pu5zSr=lU`}Axp)EuqGaTScrO%-3KV&~bVwZ?o^(&U29OcoX zQzT6y^+K+A&qfqKWHuZ&UxgKX$2!iIZ z@%I_0bOVME^y+)2`RFPcLB_~R>%N(K?f|kG(xdqZU?zBE=iWEumVbH;$|u;56S5qI z)oyVT8Y82zdh=DshI@7#C8gnNHFmg#w20XAgP#Zla6DVTc*FNZFVWammlw(cv4jtd zpn^}`w^m%|_Xx4qo&!3e(IlY#9{&jacHckgDn5_C7}~hfZuKhr;dLA08AI$PpcP8a z3>h+1d+7hWXZ&zI^HriSken<&R2-;h`HKD-*Cee4&5yrLV&1$St*i4jX1>8vkA6~- z-lVZdO#kB?Gn6UFfbXJ2|1H{My+Y>1_2+iaJ?O9g9jkYXJfo-D52{RI_FrmE#Lyk~ z^U%>a!D~OJNi~fDzXq0b?gMT6 zv>q@t^8ErUju=q0(zha3fxF0fd|X!DdVHdoA%BM44_{s=(jICw=-NQjrF|D2rx*1 zWO_~od&^KcL!Td`2Fz4Z!kL0u;3nsc(gglZhs1UIs=s{ZVI|G-7g zb=NLSLU%XJD!@&-w-c!$Hv5UL3}%p*iXV6E5WWTWmg8aj2H`wdXhA54*en9J8B0(K z{!pkr7k5KBx07Zq^%JpjOty;M)?*l=soqB-O3sGN5u_27hElPw^_RL6Y(3yl!HJtUre z>ckQ;le{#wtCZ}U_GCoLXTKJ}QZo|5XeXfi)tLKfqbI+$m&;y-I!Pb-UKBToK+b@M zCaFLh+~rmq_$0v8dkC~I`TG1hNGX^iI)by4ssYH4(jw*8W?xWb1PX4?huOGnuU?nM zefeQ^56y1=o2>gtd=D6XnM2#^!^d9f!qUEGcgb;2_1u2-5B{(7%mk3Ej?-9yCruFB z*tx7dsz#0`OMfT0UGJK)A__sj0THQ`U48(9v(kru-#tcmG%3zyRez7TDw?*_yGkMa z#*iO=p82YAyS$N&kK)elm=717ca2;dwG2msm1=VKNjtYxiX+PVQ6EyF>Hlti@;|=K zWW}NFv|z`W%bLuBZ}8V91steR-7?GPP~dq6DLy*=Afcd%_hhRuLG1Jq1C|Dor&|FG zq!?odmx``GF1dzdTPzc$E<9j~ik=?VhW&y|O(wvU+3|G%5mf9U=Cf}W9Ou&ZMw#2b z8vJ|)I)$+F4py6!>pva({S|qumf0$dU|Pb*pZZp~?FxoleTlS7{W0MB>wWD0`nl=+ zxMTachmWJYKa=t4ZHxow8^q3r-u?!JIX560<)0b`PQWVbh(=;24op_Jf3K?7_NVv_ zUll~{CHcPpvh&N_B18J+p#R#_!XcwIOu+I>AqR1Q3fCbQCPA?_4>Q&1wU4aOE_J^wE({X_5c4Y_dwYF&yuYd=LZYSB@2AIp*B2Zqpny% zFBRv&_Q053jt&+u^6XhGnCb#dFzG^dCw_IBk>XeruYWiug9W` zwixzX=zuAV>yp=j>aPg#pIyj5@!kK)6O8@~TAYt-*p4^Db;b=GC23FSfYNWu+2)x3 z{(pR4644ETE1vrCLSoQtVO5+@1DXL?WcIo(zpw4*F0c4WuP^K(lss$sxzw;glGTQQ z9{%*&Q1Ez@UAjVU8b1G~ESy;4gLxtigUd3^ILN-A_6d-OoWBF!yPIbo0eVTBddX*H zyyo(U<1+JB&A{xz67s9Szx6Pe6}~uEd&np-8E`ekhoeLPWvW2>XnhFA(u{RFt?Gt- zi|5;0;7>~10Q(!TXZVws8!D1u0eU9FaQeiVZdUm8xH66sFV|%5=2}lvQ1= z&yuN$aQp-r6BE<~v~tx%t>2gpg&@ixcvWu-M=0G4w?$wJvgFpuJysC8h9#rH z$=xJn)ss$&88R2YN6l6m3h?A9u)-yWM8KEqm2ahix1=tgCnn|YSgl+|ZK{~ON~pK| zXPK{NAgaav`c635O2_E>Nj*fj|IP~>rq%$Nto;io+*k2KXwLsr-FpBv-L_l56akec zSU{;ZP!Iy5bchHDNL48cNJLaXq)BfHqEZ!9R8&fosv=E#NdRdA0@6!>&_igULr6P! z!1sNhXScKWcfOf3d&U`NoMBS_3IBUtYpvhK_r<&7l++SSj(&}sI`Zq0T)X|)$PV^B zyr8(IfHZpX@f@oRhd}o43)fmDvA}Ps+5a5W%Xm_Vpy+;lzo6u^ z6s;-tP#Kh0{med*p1J9ExFO#N-7EhF?jk=l9#A?vnhV-4lI&Ui8hpGdjavsNk=i!! zY(&tkcyc_>f0rW|oN`th3*M0+2l=0k zTzt~|KArBV^rS-Ol2^}K_uYGe0ja}6?Q*0A9GEPj9=IdrOe2EYc=~BQ*Q&@}+5chE z^~$j7$dGptf|3cb{8;qZDt z5)AHR*JkeG{8O3o-~0v!$i6pyaU~+D;Q<%GjnENwRU5BAcD>rfaIR2<5cI5t?b^&_ znDWtWi=^5lxvXQf>U~Mds)}CTs@{BlHsx{1c)(T4Sh<5G^=$eiZp)$)eyr@h1aGRg z!n2n6<}2npz&<IhKy*PIo_Az*0Dr*v80vFS69IYGTJePv znte9zbqh590l4&u^h<9)sbT5aoxsF1e8Rc&myJfTU{Jw^l;XZm?*MiIe8*TH_m$ViW=Bx`i>qU4g6H#glR9$h~%!cvRtxf5#FiUyb zgYU#rs#i8L+~vang|yLtSFi^KtbGjEb(`_K8-*z87E?Z~HjBp?8xRd<+$MZ3J3^zl4t>J2wJamt?QOK^Rd_f{rUIi@-p4)^m>=6e2HO)yw2D!GOxqH|J}obg`NTRh zkruba%|`RT9DGPsRgL&gptSpD`~H*WT5@MGCLq-)5_i}3swCsJ=$P-s3@{V}$AlYi zxI0w)aWHeK-4`pL2bpE9Ce9)@R$0iuS1O||V1b8mIci#2=9-ii*IHK;g|xUoCP+nn zIhs(P*bC)iP!vLOjF)1oAqlETX|WowS%*V|0y)^>u&-ZxGx?kk3AhFBMTF%+>cVyk^7%Vr8b72hy-rpb5I4hu?Nmxx|Bm=p5zidxqzc>d@Pg?&K$*TI&_ zy|vAH#g)A)9}pF_cUQE>8g%a|i4$%huUMtVn!f>{E`u$8;BvL(A60W~Kb}!x!57hf z{*Mg%WI~6+`FbQLi$eG%3c;XkvE8iSliB-RjPSk_r^?knhjLo{^`_N~JcE_IsN-=* z%OeIvx1o7M&hguABc#`#YxHyW&z1(0VLn=eF7n7QsQ!{!mNsP{dnoF05FVB)28zePC?8N zKs#R-;7v`#rE04gB;9Gdf&0n$;J>5ltTMH!PTqc{n1H#jShABS3KfYUvqhYMMX77$<~W=2d}UX zQm2%uEg0HW|E1eP`@K=`Ig*+`^r;7LM*{1+IQd@kiAZbf7_+K^O2(2X`llHVyur^4 zk7`)HJQ_VNYe;udMv-{7Ct;deJH)^6@2z&XiFbkVmCbKd(Mz{u&Yg6y9z<+xsw{rW zIQgJ*VNcin^VaCq3`NSatn^Ual}zVPaDqAe*YTT(Re{YJB%H-=<1WMb3j8o;5r3Fo z7!CWBdaNg`M0oVYSA|t^iRQgsz~I4u>gjUZG_^>iEARgE+#Sk_4;ik!_vAk9>LB$& zf70*{1aqzZRa6rs1H0h2l3QjNZUpg>{&4Tiuzo6Z{Q!Jo9>HZ*US4I+Io=-Sz^(oi z=DR7*5KLRtr}4r9Mw^34XM?2zS5U>Ha)iw!PuXiA_Z9ANhJUr*tAbS;8kXsC&V2!+ z1-ja=G}9l>eq3F8X@8Pv|Cz45qB-|;bntP#<~CObso}<{4Wq5?8(}gp*U5QspOZ_N z%!q@%g~k|GHTk!zlc$SEbdYfF`#BhG=St8Bx0FlDMgpaT4%|Q2>nF?V}!!Oym~}=Oa)`{ zAloJ$T$IJaoHRc6p!F{s8BGZrI{)UwViv%&(PJ>n;suVhxnwt zC#S!w`D{tps1R9ObzpVSGrNB?jG)>Odm$Bz4T?UnDkpAqH3PUKI<)k~dOuB$e<|jA z^t%LNGC~=>JYp8OFjwf=p@k*+3RMOyOQ1b1)w#i+LMedt0Y9#=xR=Dz&+PwKz_0%+ zWK(88w7Z{5%%xg5bS{K#KQuiEJ|SDm#wFW~B7!dhFJWpHw$WSW&<7Z*Ma-Yt6FO#fR%VJf zJm8{(g7Ij|H(K|=>el|77Lwo#=6^tx@j|6SFgs7cY*a^fQW0Cb(8pf&kmI^0t{p|- zq||QxM^-1ir;|xC4Y=P7UbF!8B-7g4#ifn(@)JWnTp(zd7Y}9BB1ip$?L{8D_kxlf zf+^$%6GN8a+jNY`dyzNWh!YK)fdh2!=xi=_A;3$c0KUuX#S<;z-u1VTSoN3x#x;`H zk3&kUbi%79toiXmGM3>&ucsZm|XaP#5Vw_*wc`$k3_Sdb=va>nOU zzZ@2OUB+1>;$mjT9{u?VA1~l5Z@0MrsIr16o_nL5UR?ge3YOrOQHydb=_N4_LTL*LmMJUJ`1-dg6#UK+vl(*g$cjnR!!;m zrO=w8ufSG%bJb%dU6J{At9M>fCDV@=TA8ldx zQj3fe{mK|-+qNKA5y|lnP@w5>A#PVmQRyJ}7tjWM42k-OQsY~TWDuG*KWlQCO=uem z+P=G!@8i5i?Y;&L7S@zLw;Wb8-jVCE=z_?OX3!VYZ~=x<*P(g14G{#L1zHoGw%eO& zKG7o=s$BZ(@zagMm2mFIC)s45@>b5J%u5;}ht-LAVnykT{MF<-gU>MccLG15Xi^$f zgx$#a7Uc#_d&b!FaTY{(rM$bd=7Rp{K&}u2oM0lsLyzM#d>*$cd2lA2i42RY6CXZX zpeB2GVpAh>#~%{!;jY8$ACp+hbZx2qT?^D&rCXs|xLkK*CClYakY3p3fqF8uEu!AL%uZ zv|iXNT4edLl zrFyBCOaNuSW-U9ts=7-N<*i&7s|&f0TqcQ^7!Ust&$v!G)W@0Rr!JD1(&!P_bc=HQ z8-So|O6buhpO4(^7+lcdJneXjt23_l+g_%Qq=+^dPTV3DkhQ>FItXvOjTQODM!6!kgyEBi4-y9aH2q&b5eb@T8_B>Dks}!NWXooCMkOl6?{J4BAQvOs)6`}(bn)6>jQBjK=|6d>?A~fZ)7L}?C}RDXI=K!JY5{xbP8~Q6B+ql#fjaTp zN?z%eV&NcG+L{WQ-N#2nle4N(A2Ke&MO}N%Am!`pznrHBe3g6wgsDNDIo%zX0kIpcL=oEdw_Z+cuoGRU5QRSRN-u99=cyZK=CL?`Ym zncXIc6@euySDHGx)(#sTQ!!rdj$4aiW-!u$)c7v=EV7HYWkfZ)fh;!5M*S=(?R=eC zo6(N1V-*Cn08=S&@NfT49>zy)RzoPtmmtsG7SN$b?)x^Q6h_&wl$#~<-0n%w(T`{p zAOzbC=QQ+>aIs!UDOFOl2bV$MSO?!mop}_)1J%$piGyt}rbUH_|9_;8z_4`qm7Tv*+74B`v@G+RGF4@Zeh&DbuV_(#Ez`;QAZzvIF&mEs+xAIRx?*@|3JQw6szsxJ{B zv=h&<@junL^(Rl4>RK8RI`T12xzT&o)b0Dno^j5=#V}0KEq4~JdurDi=_!H%nRJ(u@QO{h)AU>eenTdlZAm*@nJx^z0bvly z;Vu~CNM8cLO*4RsstO)^Mfk)8%4V;wPC_A>Nmx*Z%ct#&2JY9j2oI#S|D4mY2bWbjie06J@vm#01 z@R9Xe-?pJ;%0>)I2zm_7hRF#Kx?d<|9c^=w#0?i9Y^7kUENH8e{N)hl&!dJL!=c7) z{GZn_Y8)pI=Bd}N?G7_VeS%)OVg3#>0Tq{z3{rf?;ScUyc|xAR3$|5A_kb9PHM$0&Iji^pAQ9(@BtEJgSEV{Ehn z7EhCZ)Ib>-$YHRpxXl4}80%mhPxa|6zH@%)1e9UdE%38npcA!W|L zmY>s#h6FMafWl%H?0m;&46P^XN{;_K))7H#=d z@%ay(9NXYyow)hZPK%|1Mg=$ZEeWcvMldS_A&7d-cl0T=zLdmd6R^n1>Hz+jIn^f> zNFEq^cFvFer5RDuxNGSRTh5q=eNI}e*w%2v?B-Cc#Zp@5vLF2+-2btCW9Pp4|6`r? zKZkRH*YxiUI-smNIo_ooMwdw`p=z4|tKpXmdu;FLzsJt+{&et4ah7Y5HZS)Z-V!Ue zy|UGEqPWZny1p#sM@v<=qS_|Nx|8&$u%>lL+T;>i<(^ZsSC6Z3R1YXCYMmPbApwS9 zW`OPeDgp9=i$fz5dFX#5;i~xpr%qh1J7-s4wRHqPJ)D<8Ulwxr%m*X`Ex>>$g`fz? zUOpZASw9WcsSz$Ez#Ah1%WF~J(9Dbu?V2V3z+V8XLZ}M&w*izrYm}MxT=BA8XSRze zjj%+?eS-E&BD)nD4YAbjSM3i#58a~$E1>1snWd_$KfA%|cBKIof8dKlz`h|y|M}yJ zA-lYScqHf}$i>c)w<(j3ncZ~ssZC1J*|FWH^~+@I+BstX{0Qgn21J=wGJb;!D2 z22N^!f$evA{_k79BH!;&zhFcZjv{O*`U}VlVu-o?H~{&|HJuj9p`_Uc2DPjAyKb;U zk$2T;c;(cM7OgKuhNpw*o#`xLUpN+8kV{4M}$ndG+w@K%e_dPl3^~ETuzTnJDP^a`l=}FtVdz?@GMk!flnMw5FFdV54fBo2 z$oJO$cjREFhx-}(bOz4t38m&R7>$}#tL%dyv6>`Jsq7wXBt!*+x9WPr3Ov~QS(XSrL^?Dm>x_< zwzC%I)$ZR-Z=g<;CP7-~a@+l$t+dHW@#MO1Cw27$uUG|NU2gik9ai6Emp7uZ6Y>*2 z;Qe3udbLTc4BMCt!>x;wmmxJ^N?LleFYJm{0m*OD=hlFWqEB|7Btz?!*TVoX$yk0@ zAR|Q_(Y+DC|4lAjqs;!)z+YUw_w#jS5B2+@)k~_0J7~-^2ZtIC2C9n(Q9U+{mp5$; z8ka51E45chhqAD>WYB&q+~v4ONXX`y>6jJj44tg87!Yq>w?HxVjo{-On8d*_VTY=uCN$J@VC9|=~M80g81{@T3wjQ7RSz^I9coNx9 zkFH6+bNa2&J&}L21>0pV`ztmazqn^6r>mLU>moqdUGNO~q~%4a zc@+CsS1?~$e*ij~`%&SXxCH)!;db8e?MjV!TR|HQG;wG4Nq;gRW_|-tCGW|WVY9K; zid6t8K5~ifX&02D4K0S|`FRL6%}ldCuz12dc#Xbk3g#r0B-spTHrXlguDb4x*ny3Rz6+BplNH53R!yb-z-S!NIe= z)QDNZw5fW(N4G$xM#*JMQJCp7b_I%z#efzvuF{Prb-!pCmyN9*2LzE2`!!ttHe#iKw0&1Nz6I38>e*boJUu zr>4|+-s0h=N(^!N75lzBnFvC8Gv9(rV&#!V;@OTyB0y5M6xNDLeXvIVtoS|?G1dGY zxQ~zGXF*5m)BL^cg=Oi&%Kt*Q8V_)q(bARSn_*mwJ;j5M7yIn^?Vec-S}fAwRG+07 zS_~q=CIQ^Ud!7NavWqH$I6?@-sa#>s&Ch?1DRv!iO~mx|_gAmC%D1)}Ek#uh*0p)T zk`X-7BwaxZ;ouhWp4gz+T}CJZByqw4fC_A_?R;QDn{X_ zvX{3hnMQ+?#v@L2mO~0o)O>#UGh(3)u7F-qsoWoDU$uFgT?M1kH;`@Xlo^_pCH277 z*)||R0HcDji5bWedVn3cG>h0oc4$xTUGEI6&WeNa#K!!#yf0uLNCOblG&6PGl{-kp zjndc$+lJy?;w&wSo91kt^xWO=3bS;vNzI}ApFf$eFcp5F4GawYSkH1EEGvATHSest zHJ!4#h$VmWbmswgM#nLR$6ay)_D4aM+nl7@9Z3)YQ-=Z|9UQK>ZoPG_p48?XZ$5H= zT&jzK;k@X(mx`=1*^K9(R9h`lVW1XdY7+9SM}wJJvkp#D+-}&hecMr=sC`-f)i^ZE{X8zA`4+&j0}Ofj2U^3 zrX-B!NPrIhFq%KKp#G4(SY)U^v0SADIKwX3q53Qp6{<-FUpdUidW^iviy#wXmg3Ym z`8u`JeYwrE;{tQ#_Ng+TBjB-l@)GUnj^6>NeA9y{P;nf@hYa4un@|6xKn;R;LFjS+ z@fv}>g*&0mV?WtLFVmMxC8)fiH-sC%zZnuX1t}MQUU4Q!d&Va>Qe1R$TbOUfEfNQxU zI)|EH&Jm}#6P)VXDgVfgA3II1{XY$jJ;12+D?3SM=9A;b%5p>VhLZU=AIIP;{JQ`p z4)hAbWDEd|dN-H<7m#8Pz^EHTjs({(PEJnp^Wp5Q6IiPI`EeP1icr)lQvn-JF~B#v zGnPFe$$G??I^l#L>$yW+&%(yCujpu8r!IBw?gVk(9#_qff@7M34R#-*xy-t2pq<>i zxx>(a=Uh|guJUVYwzJbScjsqIlP6o->Pr*_ z#^+Xf?ZJbqEHM>yhT(>1A8jauCx9Rk)MKSxvJTzHUL~%?Any{G!Kd_wb*!kfasznr z+BJ^TB6hnO%h|o(8=R>G6spG`?R9oMz@#<`rp?x=Jk%0A&L;18lx(Z8%@}!t$(|eH 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 Zrm@?iy73f9A~P`PX&Y%}U%VCa{{Vq%P^JI? diff --git a/1001_MastermindTdd/logic.py b/1001_MastermindTdd/logic.py deleted file mode 100644 index b6fe0d6..0000000 --- a/1001_MastermindTdd/logic.py +++ /dev/null @@ -1,59 +0,0 @@ -def tipp_kiszamolasa(felallas, tipp, szinek): - """ - Mastermind játék logikája - a tipp kiértékelése. - - Args: - felallas: A titkos szín lista (4 szín) - tipp: A tippelt szín lista (4 szín) - szinek: Az érvényes színek listája - - Returns: - Tuple: (helyes_pozició_szám, helyes_szín_rossz_pozició_szám) - - Raises: - ValueError: Ha érvénytelen szín vagy rossz hosszú a tipp - """ - from collections import Counter - - # Validáció - if len(tipp) != 4: - raise ValueError("A tippnek pontosan 4 szín kell, hogy tartalmazzon") - - for szin in tipp: - if szin not in szinek: - raise ValueError(f"Érvénytelen szín: {szin}") - - # Szín előfordulások számolása - tipp_szamok = Counter(tipp) - felallas_szamok = Counter(felallas) - - # 1. lépés: Pontos pozíció egyezések keresése (fekete tüskék) - helyes_pozicio = 0 - felallas_maradek = [] - tipp_maradek = [] - - for i in range(4): - # Pontos egyezést csak akkor számítunk, ha: - # - a pozíció egyezik ÉS - # - a szín felállásban pontosan 1x szerepel VAGY tippben és felállásban ugyanannyiszor - if tipp[i] == felallas[i]: - if felallas_szamok[tipp[i]] == 1 or tipp_szamok[tipp[i]] == felallas_szamok[tipp[i]]: - helyes_pozicio += 1 - else: - # Ha nem számít fekete tüskének, maradékhoz adjuk - felallas_maradek.append(felallas[i]) - tipp_maradek.append(tipp[i]) - else: - # Nincs pozíció egyezés, maradékhoz adjuk - felallas_maradek.append(felallas[i]) - tipp_maradek.append(tipp[i]) - - # 2. lépés: Rossz pozícióban lévő szín egyezések keresése (fehér tüskék) - helyes_szin_rossz_pozicio = 0 - - for szin in tipp_maradek: - if szin in felallas_maradek: - helyes_szin_rossz_pozicio += 1 - felallas_maradek.remove(szin) - - return (helyes_pozicio, helyes_szin_rossz_pozicio) diff --git a/1001_MastermindTdd/mastermind_esettanulmany.md b/1001_MastermindTdd/mastermind_esettanulmany.md deleted file mode 100644 index 6559eb7..0000000 --- a/1001_MastermindTdd/mastermind_esettanulmany.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: post -title: Mastermind fejlesztés TDD módszerrel és AI segítségével -tags: ai python tdd mastermind logic -author: Szakszon Ádám ---- - -# Mastermind Esettanulmány - -## Bevezetés -Ebben a projektben egy klasszikus Mastermind játék motorját készítettem el. A célom az volt, hogy megtanuljam a **TDD (Test-Driven Development)** folyamatát AI (GitHub Copilot) támogatással. - -## Fejlesztési módszertan -A fejlesztés során nem a kódot írtam meg először, hanem a teszteseteket a `pytest` keretrendszerben. - -### Tesztek típusai: -* **Hibaágak:** Érvénytelen színek és rossz tipp-hossz kezelése. -* **Logikai ágak:** Fekete és fehér tüskék számolása, különös tekintettel a duplikált színekre. - - -## Algoritmus leírása -A `tipp_kiszamolasa` függvény két lépésben dolgozik: -1. Megkeresi a pontos egyezéseket (fekete tüskék). -2. A maradék színekből kiszámolja a benne lévő, de rossz helyen lévő színeket (fehér tüskék). - - - -## Érdekes Promptok - -A fejlesztés során az AI-t két lépcsőben irányítottam. Először megadtam neki a teljes tesztkészletet, hogy az alapján generálja le a logikát: - -> "Szia! Kérlek, írd meg a `logic.py` tartalmát a `test_logic.py`-ban található tesztjeim alapján. A feladat a `tipp_kiszamolasa(felallas, tipp, szinek)` függvény megírása. Fontos, hogy a kód minden tesztesetnek megfeleljen." - -Később, amikor az AI túl bonyolult algoritmust (felesleges feltételeket) próbált bevezetni, szükség volt egy pontosító, visszaterelő utasításra: - -> "Térjünk vissza az alapokhoz: először egy ciklussal számoljuk össze az összes pontos egyezést, majd a maradékból határozzuk meg a rossz helyen lévő színeket. Ne bonyolítsd túl a logikát!" - -## Eredmények -A tesztek lefuttatása után az alábbi eredményt kaptam: -![Passed Tests](teszt.png) - -Aztán kértem egy konzolon tesztelhető felületett is az AI-tól: -![Konzol](jatekfelulet.png) \ No newline at end of file diff --git a/1001_MastermindTdd/test_logic.py b/1001_MastermindTdd/test_logic.py deleted file mode 100644 index 78fd4c2..0000000 --- a/1001_MastermindTdd/test_logic.py +++ /dev/null @@ -1,75 +0,0 @@ -import pytest -from logic import tipp_kiszamolasa - -szinek = ["szurke", "piros", "narancs", "sarga", "zold", "pink", "lila", "kek", "fekete", "feher" ] - -def test_ervenytelen_szin(): - with pytest.raises(ValueError): - tipp = ["sotetkek", "kek", "kek", "kek"] - felalas = ["piros", "kek", "zold", "sarga"] - tipp_kiszamolasa(felalas, tipp, szinek) - -def test_tulsok_szin(): - with pytest.raises(ValueError): - tipp = ["zold", "kek", "kek", "kek", "piros"] - felalas = ["piros", "kek", "zold", "sarga"] - tipp_kiszamolasa(felalas, tipp, szinek) - - -def test_tulkeves_szin(): - with pytest.raises(ValueError): - tipp = ["zold", "kek", "kek",] - felalas = ["piros", "kek", "zold", "sarga"] - tipp_kiszamolasa(felalas, tipp, szinek) - - - -def test_nincs_talalat(): - tipp = ["szurke", "piros", "narancs", "sarga"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,0) - -def test_johely(): - tipp = ["zold", "kek", "szurke", "piros"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) - -def test_benne(): - tipp = ["zold", "szurke", "piros", "kek"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) - -def test_benne_johely(): - tipp = ["zold", "szurke", "piros", "kek"] - felalas = ["szurke", "lila", "piros", "kek"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) - -def test_duplikaltszin_johely(): - tipp = ["kek", "kek", "szurke", "piros"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) - -def test_duplikaltszin_benne(): - tipp = ["kek", "szurke", "piros", "kek"] - felalas = ["lila", "kek", "fekete", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) - -def test_duplikaltszin_benne_tobb(): - tipp = ["kek", "szurke", "kek", "kek"] - felalas = ["lila", "kek", "kek", "feher"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,2) - -def test_duplikaltszin_johely_tobb(): - tipp = ["kek", "kek", "szurke", "piros"] - felalas = ["kek", "kek", "fekete", "piros"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (3,0) - -def test_duplikaltszin_vegyes(): - tipp = ["kek", "kek", "szurke", "piros"] - felalas = ["kek", "kek", "piros", "piros"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) - -def test_siker(): - tipp = ["zold", "szurke", "piros", "kek"] - felalas = ["zold", "szurke", "piros", "kek"] - assert tipp_kiszamolasa(felalas, tipp, szinek) == (4,0) \ No newline at end of file diff --git a/1001_MastermindTdd/teszt.png b/1001_MastermindTdd/teszt.png deleted file mode 100644 index 0d246c256141a876d177d6ff500e72ae73226092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23964 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 Kxk|}0 Date: Thu, 5 Mar 2026 00:09:31 +0100 Subject: [PATCH 7/7] Add files via upload --- .../__pycache__/logic.cpython-314.pyc | Bin 0 -> 1846 bytes .../test_logic.cpython-314-pytest-9.0.2.pyc | Bin 0 -> 15471 bytes snippets/1001_MastermindTdd/game.py | 136 ++++++++++++++++++ snippets/1001_MastermindTdd/jatekfelulet.png | Bin 0 -> 39581 bytes snippets/1001_MastermindTdd/logic.py | 59 ++++++++ .../mastermind_esettanulmany.md | 43 ++++++ snippets/1001_MastermindTdd/test_logic.py | 75 ++++++++++ snippets/1001_MastermindTdd/teszt.png | Bin 0 -> 23964 bytes 8 files changed, 313 insertions(+) create mode 100644 snippets/1001_MastermindTdd/__pycache__/logic.cpython-314.pyc create mode 100644 snippets/1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc create mode 100644 snippets/1001_MastermindTdd/game.py create mode 100644 snippets/1001_MastermindTdd/jatekfelulet.png create mode 100644 snippets/1001_MastermindTdd/logic.py create mode 100644 snippets/1001_MastermindTdd/mastermind_esettanulmany.md create mode 100644 snippets/1001_MastermindTdd/test_logic.py create mode 100644 snippets/1001_MastermindTdd/teszt.png diff --git a/snippets/1001_MastermindTdd/__pycache__/logic.cpython-314.pyc b/snippets/1001_MastermindTdd/__pycache__/logic.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12cd8c9e42e88abb384ada69b4564945af4a0111 GIT binary patch literal 1846 zcmcIl&rjQS6n_Sj1luHr7APzshLj)KD54#rZH6YXvX&_;+fZeYmW6uY1vifE*$x$% zG$C!8*kKdeG^v+KaA1N%CA3XFOqw()mmPy3kXgO4KL7;1@7akVpslxkB`1DTZjGkCKElh6t#OcD`@*38zrApEbx3uE$lrN+i3 z5%Ug=6IyK;5_Zm6JTX+^OOm%91I!_55E5QDKUw4E=Lw!*;chE{MoztT8+WCUJqU3c zs`0fv$-s@OUG>lbd~GM3out({F}Tc{CkdK&05l(7^@)1->?G+T@Z4YVTxzPlzunCO zOi|U*t!Y&MsjX;A;Ll~MQAxtarMev42mg(G8HaO{;}h>q68#NliZpMW2jG40qbC>F zd9`k3Vc_fk6@9MKGj#l`|C#?8fZZ|d2+h}{@7+$n$8TdfXZ_~s3w6_2bCnNn?fhv6 z!w~N+Gf#c?dJWDhnf(w)h`KKrrl@BmWsZB4Uo-QYX--yCQaZo(NZ_t<0%uB^#-*kF zrfw%iIlpO$0~9r?r;HfI;rc|B1z8r17&nSwGp!n&k;^|-I9W1Gf$JM8hfxP?vz39G zCd%eZkVZ~Y#57`a9G<<9-&7XG3bTkBk=vF?QIn#X)s>2t2U$%PV_e_7C?k4CQ*+X+ zl>cQ01+8WJxyoZl-i)pqM(zS6ihP1(h!r|skh9|3x~}RmZd^FkVT!V-RHQEmsYTAA z;^u9_{BIS{s3>81@2FV??aki6hS=_C8rH;Vs$!~!pl}syIJ8wpbt+Psf^G_OM#$w< zCEJYK@?V#WuR1iwMZFe1tID!CYf7qO==dT4s}@yR)R|_hP8XDvXn6$mTA8yvx|mTH z#3*C=+@4vat;zC~%`VfBc3{zV0(}!QYT638c=v(-oWZKao&qw0F3gE(i*fe55g}P^ zr{+t_Iqy}&evkI_^w`7XtdkHvxD!j{pDD8NaUyd%q6vF6X9u)Ji*@MJk|Pj@PtaR% zkNqY!hVgd^UUWd+)e{f+=;fg=7FR~U{QSB9N}=ukj(?)yn>b)EFOwxYut$fUHw6pf zp{)m7cMG96cA7>C%*at4G&UbmaH;*t)$gw@#s6vvJ(=HW>0Ns7&;u>4OB1EmwgP#% zbg6mi-M<@}R<3_Ly-XbXfMLJ6xibGldYA4j1v*woe|%gF^ln_=4fJo(e>DDnuQ)jN zXQ1#=vN%0c9Dlew_^`xwtacXJ$aj7uZtUD=d$-x%4c}9GmmMmx!F@Ke%|=$o*6;1H z{fKA??K6>WCbBxd9^YjKOU#vhCcMprSIKqn9@BRe0)NY47j$+N$j|{BtW+2&G2I)D zMdsB4(_LbM6^gMvCVJ$B#?T=J4X+gF;Q~2)jP}7qlyJP<1RXy$pxZNO`9?D8Tvis} X)Y~w0Y_`9ThqVMjoYcgKn-2CLHYmju literal 0 HcmV?d00001 diff --git a/snippets/1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc b/snippets/1001_MastermindTdd/__pycache__/test_logic.cpython-314-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a16ce47c78c479eade40da3659ee3880b196f0b2 GIT binary patch literal 15471 zcmeHO&2Jk;6rWwM*I)T?(vS3m5GSEf(>7_7w6vH&zo6l(L<^)GES60&Nf&QycXnM! z5K<&KR9v`l=n;vNr5-pS?iK$49|fdQ5fZoFP*Vx1C*GU!t{umvPAh~+cM`vynVp%P zc{}@iZ{Ey1(AAkF5a^z->?;tP!-OByT4e1rh^&%#iJ`nqJVjj9sYpc~AXAzb9guf) zPlr3|%dx4r7at%a#7MuPcnKrYN4%t=0ZkcEpdE$|w9|+I?K0v(yNv|Uw2=hbW2Aug z8XZ8l8J$448(lzm7~Md38p<%q_T0jbozE&f?b+qBS+Ly|YpLW|uC=cJF(?&*-`Y1o zR!JVH4AcI|{0z7blDy_8ClndWDW+0UD-n}S)NYA!sc$G{9A5;kN*!!hO}{lr$X8jrgrk9q}KIG@!Rc92IP z!J-foq^j{~*=8kIq`0`~X_I>@2xRjwf`d2E3?7BJGqyP3?LA-J4*HviqXMaP=WFIlcf*^*tH&ttQuQ(Cm=M#{^4 zhe%R(nHJ%J4lSD4F53pRb@;i+zEyHF(fxVHS{F)g0IWff3N3LkRcl=81W_;Jx zzH9o8_~>6Tk{pKH@c(0C=Cz#5#;_hRl-n`bV*QUOpmfvzH?bk(4xTR=+wd`ZP z9`sE!qK5u2^o=}V--3G3H{FOC@lExuy?0!nowYf;$#=Y=KJ+ziBpPOMYrd;KPmJV! z%SQaNqx!*yZ=xJEQbxy2bW~ZFtLJ7ifWclt&lnMar@&!#5;IRk^E9PF9tb)7bRU ztegC(7RgMCr@_Pai>GGYgCb+hkBn#CZ1UsGq%3zl>sFIuP_pmIlTz<6EyjDyIm>ZO zM$2rjv{bejbYyjeoBpf zujRg`g8Y!m{i@aeZ)myiQ)59gh}=l+4dOp)xyEFW4~<&0+O0NW@WL*a%qiIDmB1aBzZ zfL9=b{!`&5HEYB_DFhzF7)mw zURAvnNG!G=3q6hG01{m1Yy{|((B9uKU8K%3djX1M;J4-@^Pxu!nOP1-ziv$zB6En$ zFeetsXlGXHOu9S@Jp)fzI_L0Q-yB{Ivk#Pcwj+C%1~K;~ImEK+tBYVE_C zCy|681zdm-d}JU^*I98w^-=I=y0zUV1S!FtIsujN5dtZ88bJ#~;WYf2=TSc%X&PhwLcRsk0vgjm&N4-XZpEpNw_D^w8954_X`g(}#+ty^%# zQkP9)yKSv;cMFi3uaq6TU^yOcxB6i9Dl{?*zhK3CFkJBhJHm}N4Y(k}bf`>9K7`67 z*=ieY4-e3wM+$&$vEpTCVBWL`(7Rdyv|RX}hc?h~$zDSeDwDtk2%$0=DwA?1ND2o( zLS+*0;lBGOb*u{1N;D|yYD>xNzZZs?UTJogO+!O?4k+04ei{|c zLyyj;cL?6NGY26A?-0D@Opr7L?{+r5*(<;;U)vPm{Ul_F16^757Oq$2{z_X|{dfzk zmexxN)^9>{XafzvT37`}L$C%zNqGDgCI$(u0>}m6LueHUtpXcPC~XAm7|ay`*6byW zwT05H%(j>5;xcvF+t3J_7uEyxNC?oa02=)ylzdJ5yr+Le_e1zcq=kP(Pv{>3Q?eFd zPdW6DfWww(yu+{wAD9iMj7_eXHq_r@X4~F}Kd2|&w8&?1y~e6QI)9{1fF*a&3s-KKPi7?GX`;G{6Z z=m*ROw~R!P#bdQRb`YO|u8%w_TrBIZ6~d*Gp`RZ^e>CBDAda|-<5Wy^9{2wk8kvQG zhN0pwgo_wnRgOz~GQ^)-D$Q3M`aF9N3L%=hD24uvD2nnsA)k^@I)5WWe 0: + print(f"🔴 {fekete} fekete", end="") + + # Fehér tüskék + if feher > 0: + if fekete > 0: + print(", ", end="") + print(f"⚪ {feher} fehér", end="") + + # Ha egyik sincs + if fekete == 0 and feher == 0: + print("❌ Nincs találat", end="") + + print() + +def jatek(): + """Fő játék logika""" + welcome() + + # Titkos felállás generálása + felallas = generalt_felallas() + # print(f"[DEBUG] Titkos kód: {' '.join(felallas)}") # Debug célra + + # Játék ciklus + for kor in range(1, MAX_KOROK + 1): + tipp = beker_tippet(kor) + + try: + fekete, feher = tipp_kiszamolasa(felallas, tipp, SZINEK) + eredmeny_kiiras(fekete, feher) + + # Győzelem ellenőrzése + if fekete == 4: + print("\n" + "=" * 60) + print(f"🎉 GRATULÁLOK! Kitaláltad {kor} körből!") + print(f"A titkos kód: {' '.join(felallas).upper()}") + print("=" * 60) + return True + + print() # Üres sor a következő kör előtt + + except ValueError as e: + print(f"❌ Hiba: {e}") + continue + + # Ha elfogytak a körök + print("\n" + "=" * 60) + print("😞 Sajnos elfogytak a köreid!") + print(f"A titkos kód: {' '.join(felallas).upper()}") + print("=" * 60) + return False + +def main(): + """Főprogram - újrajátszás kezelése""" + while True: + jatek() + + print("\nSzeretnél újra játszani? (i/n): ", end="") + try: + valasz = input().strip().lower() + if valasz not in ['i', 'igen', 'y', 'yes']: + print("\n👋 Köszönöm a játékot! Viszlát!") + break + print("\n" + "=" * 60 + "\n") + except KeyboardInterrupt: + print("\n\n👋 Viszlát!") + break + +if __name__ == "__main__": + main() diff --git a/snippets/1001_MastermindTdd/jatekfelulet.png b/snippets/1001_MastermindTdd/jatekfelulet.png new file mode 100644 index 0000000000000000000000000000000000000000..515feaecec5fd157995b7e93485c9f856a884b3e GIT binary patch literal 39581 zcmdSBby!q!yYD?T(jh4&EnSkrfOI1v(jbDMlz`FP#T*?fy)^Ek!@%eu56{V-6N=!gc00M!C)zy^rK_E;=;Aa*e z7kH)R4cBep9}EwD)rX+U-wa#8FWAo&v=u<0ns`El4G!@8EjKk24-kmL^ZEy4-k#YT z1j-aqS5h$aw%kPqB#M$yqNre1vx_Y6F7I}ZagX7& zrR0$9jNDF%EV^I#>(Bm|rf-ve8((w5ho}+a)18mczvq_Ew~pd%EG~lPF3zOz*Pjcp<>rB6Ff~&QBqPeR3I7w-i_pm zRG`297>=+S8}N2H3$7#Zt`b$(fBf*!SJDx&&bL#}3OZbG#b}FfjSjUyi71O5+u#-0 z13`|NOMQaH>~x=9>h>S}ID^uyKBg&l%%3r><7g4LYRNvkxEy>Cx_~ZB2+WF%bP2)< z6$Af@#JT6gHL{3(r?okKk0HZS_Y%Q48qO;=#MgxAmzFj(3M)5t8*$XEKE6uJqpQWK z6wAu>r3^%$FTBmwfa)qKNlb?*WDeFKKl`4)RR;`6E*8plUvY@Aq}&Qq=JsMl8~{ zv>4Ns(qi(b-1Iw&vk9W~nh!~{(6wnn3$W|^(zqkLPJ@X8XSTe8gv8PN^9M{EvS{^|1H3?ri%r3$(F4e>T>pJK|3%q&tSWzjql5T>!T2T0 zU+a)H59ZEu#3Wb#F{dvzGkPF?F=In6T(@7x0zl#VKA+$4Ra~bKoMEZIc`- z>*ALm*`M6V((=@WB+dpmmRoLkvQ^zL7ecVedt*I%K%isUv8AVCYFz#0@$+qAll>&` zUxeQ(a_Pj6(C3%TPfYI@RFlqRW7D8vXGoqS8)(BIq3mq0EM;HcyOl_S)9&VCd6~3B zsu1#J=A@U3o%Oj)u=B!1aPRtMIha(-@fhA=7Bl1z@8Z$1czha!1QKUCN1cU?xWs~z*G!+a-(_o5V1#5oM$`4M6nmMcOk#iUbF{; z)N_xvdlFlko+bGyTdd6=WwNlo(~D;>#C0 zSw4V=YsZ5fzmd@oD9NXqLE3gwL_%8xb~_D8tuoFOyXMVhltOuKxqb2$bhJbwb3~!^ zAK387-W1e1o(bA6qk1Y9ZZpbe8c6j~eXYsi1zmJK*FEa`#?%=B^1rZZ!F+)9_I%V9 zVHxiwdqjXzet^$={G*CJq@KnSH^;w^e^Ifj+sd2%Vi~Fiiw;;cHrVO!vHBzG>doMd zI>DF84?I5cW{O`S9>j*A<-bhqQ08`cR4G9)s}?<=)T@Cwxp0%Jb0SdSE+z91yoD3V z9P}!w(%K5w(aT&voOtj_U^2;QNRA9k3Yrr5a>-5S6Vc_7nt}L8A=VF;R@?D_7=50a$yGSO`Y`d9Ua-i#*!PZj^kzbda z-;QouwrdWCxh|&3Aszjt{R6O%-Vci8T**H`mn12cocJP$y>SoyMsqsg$egD5z(ZN@ z2TYz6XI#L%)Eo%Vr-D>0)BzS>CA_2`#8F9^L0kOkwh_b@)drIoW=|D(XIA<7SK|DYsx}A$u^2PhqaqGMJn-P<|lEYw@$g8$HwjND6Ke{0&Sl-*0)}==Q z-V1QK@IemWk!V?T4~y&W+MsdP46k5&3>!FDSC;1VQ^4(mK%V(pRV72`9nulRT@|k( z-d7X{1#=!POJho7ECqJ#5d|$-L)6$bNG9CMNPD4;(uK~pvvpNvJ4d106bU?e!v%GEi-y)MAnfR0^>Tm+z2j_JJfunYf<_9 z=xE_Iq^qOp#b6)<7?IO`geb{pIiLi??z!enyMAZZl|`48opG_2CywJfx)aWI>1EwA zNE6B~YUs%2TK&1vnt>OTLD_ZtIOMy-cSGjA04#C#O`9o#?J{0;@vRWWQK-8x!M|Wdxyd$KH8m!aG;!c|m*d{a5MV-~Y9rUScPP+%QrsV+LZv#JuU1hfX zcV8CyCB=tV&Fq}QwX4u)6tk>sflKl^q)5cf;mU!pPqCSmdDC-n+ydg4-{I43YHA>J z7KO`JMSBs(owv|J-B=cYi=yqnnz7L_6G%qx95N0oG)nY3v)SL{6YnUVK;vGONi20Q z5cxuKOHK^z+!N^WuGXi&wYp80vJvcBdhb&inF*ClgSp zvYOU>J`!Ds>RVrk#T4^yeX(*i<93;b5%m- z{rYqfBi=7Q!nW~epr}`ENEK-g|H+2*z&jxGJKHGX(Tv}xp7iOzJ&Q#HYCLVB?*gv^ zn%}%QNBssf#fMFlERc@ppwTuvRw#qTW04Qn8&%@{Vg#Q>(=@iIK}kWStkWjoS@(--;FYepYx;huUfssiDq+6!m91eRk z#kJNZ{-Bj{e(H{(sR2@JGx(oDj3gw5VJ4e0nQpor|^EK0j-U zf_y;JC9gs=$k`ey+Z`}OGoY*FN&N2(LtPVMo~FI# zSEQzg4YNvE0<&EY>0wGV^?ULTV&u8|g>;-iPoQa(7cK~n+}a%WOT}u7;-?|?Tt4ut z5-J9Px;2v7)TCoScHo>HY+mlf<7HNwsd_B43((Y)kM~t$s7n-_(QG!HQ_k2;_N1O^ zIV{+HwTiU|E>wP2r~K%Efe-RkCFznS4vMw6jVxdSjgfaLOy}Tx4Jk4+GDsb!;RIo*2(YNV7)$#4)V<;s zxd3i!;MNt5v`c{mA2Y-2I0ku#k0$j9%%mBws8wnb_BQc+8w=p9#Q_Wd{+pcP6=~+I zlC5{Lbd;astI(W@^O2)`d@%P;L91(fFuq-$85sLA)VQ4C(XG*zyz#N@>asJz5=vZO z4k8t|yVecwb<(@*VEh#yk=1yLX+m|qgGFqt%_Ovi!}o{U-?QcW47DAWVgWgnD6vj9 z5~vU)n@CmM$cY6p88^!bjJ__)2Nh-sY1{r}VUsQ4q0++k7~$iB+0Q0lrHu>QOk{cB zW)N~aEr<|I>)saLI>rK49t*6T@6u8h;kEHAn1$%o?Kg@(vdX|Yk*t|73nayoa8(mv z`V^(t`}@pdy4ACO#GyPs7V7{ODCJQ1jU(?gS)9M zt)VX_lOk4EsWVv-QHQ)kN0mVj@SEQjk3;O|s~v4MNVC1bqBJm@CSLZn$Gp_HFO55K zE!NmVJyojGwG>uTt~O=W%jX&1hXiAu6R99#mllf-5{JY3Xu-vO4AfS|nOeXz*AP4`8aPu$N;Uf-nb!EE{ zRpeF!M%&lCeP$r^Y3Y^(Z)rW39;MNgfX!@{ER?)_-hP86A|D5L-b7KVI%{3}2$>8Z zMs8S3k7j%y@g(t@CnEftcTSeCOM@x?MzrdQ< z5JV=%s90wj^hqIiE69&}Leb^5%}-y?4T+s2I<|(PcZ@GhP&Ja>uU323a|8W-W<;9g zG*=-ye`_9j40%3rjrm*gq=rmW!-qoVvW;Lnp_ z=SJ_%HZuv7x>9Qo6+Q)Ymy)mJsnE0^xgEubEN zE}7F*HqzjL+$o70-I6q&TLS%0> zq=Zh0iadzY#p=E1<>lF69-UAY8*Qt_rk|?b8HT9^Rd)oNm@WKsDMG8+>Re$Rsa8x( zFtb5hUe-3FE#PF!yccc^c{vosdMoH97s`3JVVHDgH0eR=Gazr$V_~&g$V%gew6yC> z&5&2Eh-KIka!e2E4z@5SITm!l`k1WBU;J)B+93PBG6(f6;3z4HHKd#uDr2N=5AKOr z8c+x5nWYd$yl5)kt5 z4ZfJ@ue}br>^EzN*l|=dKQUC6U~A*9JsMvR*nQ6W9HIFuyu-C=y;jA6lr!;>k&hjV z6zEs|N@*;P#-#v~q>WB%D%K#&w%k<`y$4}DUk0zQQIizj{d6j%HH9D~OWCAmEOxYy zs5ZY-kHxZy%ux57!8s^mvp}#PxB6ZjT*E}#W$p(vgpJukuLqlwR?<}Se#zs!g|Ez}PGbGl=`%C<<^X(v+ z%=DbwXuB!^US@MArn3e<9J1a7@QI19QmWU(SD#iB(#p#-{C=EyLTGgb8^<4p#6Fg2 z-U~U;be0rY#gjXN4a;!!kw)BZ&69eR!LP?VDrcNOcGMJ^xM%iJ3qIiQ-^AvbY6xa& zyz)#PWF{x4GT~EG#8V|<5nquQJq>r5RS;yLk6O?6p?p6I9fR*NG2{i?za-6n$;L3Z zeJz6QF~Ho9$AFQ@Uc4TEHawsEIM7p{ zoLyF!ebs_iFMGicGx+>FEwib{gFI_@UsYopDc0nRX0G|mc~{a%y<->5Z1Vmo!s)@c z-)DgP!~fmf)^jsOUIDP=rHWt`l7c1;1|a0Qu4?mYWbN0%-DudLr(OJ@4^=}|!{nD~ z!2tiWR}Yk)B8%tS+VCrb_)UQOznLOtE+jPaDI%xQrpK%h0Q=fCZo2ft14ZqT=aY^+ z?0LJ{8UW1S0#b5aWSPV$2PVGH16rL#nle{tV}p z^B9hYB=u&oGz{IRij2cCGRmtuc~AxH5bLtUomfS$3dxjdK?zji`bN7A@U1Z84W5}2 zqNcD)){Yw3`w71GSBW%}#qoJ%!s9%ip0wgDTS;*kz_mCtlT`WpBR505odN`W27ltxeV6I3KJXCE41XItLs(GjEj9Eyt@9*u;(V*OE|kb>O^ zvl)Z`8McuMnlv9Fb8=)%uP0Q{pUMJiwG_R-`EZ@DB`4wTr;d3J*GaO+^=SjViumX^ z&TI@C$v{^8r$#VrhFM<||HewCqC%10wECm`5e3FXcnvcSQBtoil$oX~)IR;u6ln2@ z=$V7v#LC;f6z!8V{AqPj>z|LAzLR<@=ozcpT7PV)7;Hh>nA(!@Ggk_h+uj`rYIs?~ zf3S!4b(%{s+uR1C&m`Fv!;Y>ibBD818SK{DcsC6LRu7EpI_`6v6-Mb%c#QPwcEp9W zSeK3gIV#B`4f|H}RM#(NidqJY5d~fi8Y(eW6|r;egpXHqcSm~<8qPcK)}JOgv&vV@ z2tB=Id~`28mZ^Xa;7JjhozfRT*29byBI6b=(M>q*hcRF5NjSrSBIs?|7&5Qh9fJaN z6DvDdKIj$J5Mn4Yz%kwfYQ+}@(CgX0$HHvi0&txqnqqJA)S704?n5-KBL1XvA>}nl za8*|@_0=)0=VHy3m|c5v6x7E2=7pGTr-i~`2DIxv7XCLI9tK|VC`izI!m)!M(PXf~ zzK|tAra{Z|M4eArVH$jV4b6Jn;v{|dE!m&LWjPwG098Oi$n?#EGEn2^v}IhJ{ArP| z^><5$21rrJ=1R@vE;GugGtSA>PsIS2dFM+Zi?eWkVvC5FtY_F0S3QECWLr=SSVrAr*?p=XF;(sM11PX6jH6fvYL;8wP%op}dtdYlk}F|%-0f30 z7JMOeii@kF5I>aN>jcp~k9fb)NUV(Zmb|~2Q3{E@3)CW%GoSaOf;SSD?D6`!+sXXcgErPB z9O^Qr=9br3J-mEL&O$T31y{Zdnm>kfB%sdFxj_?j;c@LAb$11T!yM+QNk$?;RT1SC znzSwsWTMD!5U{2ziz7EKi#teh*k|GZT>HcRVXA>!KogUR7b<3&vq+cTuDvY|Bx#Rh zQB{DcRTBI~Ydn#%|3lsOUt;YO4E{G^* zKvGpL3aML+ndOs9(pP>9=R3+gs?o2wEhjOqAse@2ufAVG+>*vfK1^)*0cZr4#Rbd3s$z33 z>5-0r=x2m>T7W#<-ER6f4P?lt80j%H;YTLpp2MHn5VweNn&o_@xI#mdvM@7V5U}_& z^gJ`$%2G&+x`nTs@FN9= zsjS@Wi+1vqkrVm?W_*P}EZA2%cUNm;PO&geKsRhbI z{BI5*hh2gokJ}%Fq*dKmtQ*J?7R88x6q03=88)b1^iK21rK?DTcxQ+MrzUO!Wv2$zh@rIq%*&&f{;gM)2nGjwr(pi2~A6Kzr`6!tMh%8T0J8X1sVZ-|=#7}7! z(UB$u|A(upvFE;)GL}__vQ(dY&$pwX z#vP0{8LINS=OuKTRL!k~BL~xufPCU{KQL6wHJKVM{!fn;Cx>o`qwD#?tSc5hQBea+>=?3HJ_?^gvFWhi-ehx z9w}E2o+8+C@PlLKke8q3$0yMe=zDU>^ert(bNOq=x%TW0GgCmfW#TSK;vQr8iEgcXWgvAE|G-9T9n0QwhbF-y+#3PX`*jTJD+vx2lcz+Tn&Iz z#9r0%VHQ<;d`_dp-Evoud=8Y-h|~Qu5lGS$;afA(4k`eu+LS)_V~X%;cyO0BU)chl zQ&+J#@Re7XD;mgs4w$e)e(nR6(x@yS3JWtp9bh%(_@{wnNe4hL|5Lk(1)2~~46B$m z93s8tmw6ddAvSmVPEK>Zl z^N}i&kHz1m-q(N)294mG>)T)sW!Qr?~dPkkv)6(@%k1^?}M&@oQFL3eC1ot+b*o1IE5*AHiGk) zsyyMiuX|FG(9LwQ=J?;35KO9@kGL@=+szU@-+b+Gg zX<=Tw@KYG%HDopuc0Z;bVuQlGmN2FbQ*Moj8HFs844F-2JiiB^7Jy1c>*TkOmrXpx z`i3d=AnqVp&X;$SXLpN-5754!ZzM`R=2MHp;XN|d?t^^3prIuCbD>~ThwNL;wI4<( zDP@(@13g8E#E8^ZjIm0^4l=s(%KUcIYqxj4Be=9pL6foPnLdhoJ-l*hwGioMVBvXh zlYY1Isw;E&Ee|FQKn4J7((7B*qy~!3eU9i)$}`YssCIk-rCmE}o($mfW|p^6;$1@_ z_DO?%(|tiU@1(5fO=%`q0^4^1qUJ@dqYHiyio+o!$Sj!JHnDg#gZBk)jY1~1+P30$ z8nSeRIeVXE9m5o=b3`sBG9+HfIUv+$#2|3L7Q{P+zX;-{;z+jBY-mSzcY^=$vFydW!X!o5(I1)C?T^VNsxDDD6Y#pbvxgY z)yH1Tw$4CZVfSf~P8g7bls&C~v#g;EU&+3*C}NrAQ-8yt*HRnIqa>8dRRy$RL} z$^eo^n^j?N!@bqhoUFIslI zUn>p;poqL7QNLGryzZ1?+d)VRhZWSVpXUVvQj9WD8va6VR_x>JCfFJ}r^{8jpf%GF3(IhZuiemN zKo@q@1S&~S^`Mt&yyw2XQ(yxh_(OVAy%K@lw4G@o*o*@$=WTLJGv*4>eYB(dww0$p zRT0-}GL-#<31Sz2U}Um)1wi1F2CESSykYigLl7*f^Zd7};VaE;^`znLOre3rabiD=Z-*2;(wa%8089ik7^ji7_ot=5M4C@}uUqa)Z> z!+9QVaHmlMP#c0Kw7EX@^ul!Ue4n@gTnS7uAXz5rmJ3@?4p+c1304i^|>;S`v}FE;AX%@sB6!!{!~&Z~*C4;B!F3qXHw&m7HaxE< zRh)i(-pwvlr=FFQzwx(S>PGj#)JeE-JB8Z&+*>H+y;<+oAVUfZq(t)9uy5hj>`}5a z5`=7ldQS6K{A>st(4H}4U?+ILVaR0ltW*8B0nz$x(gz4ow=qg+ z4$5}q8yMtgv-ASL$K_ldKS_aF3rU*oO>I}2C7c_RB5 z!IT3{f$@YhL~)FO=K8zz$J>>PL->86y$gQHz~ho{$%fU)7%{2g*EN6!*XD9sAdptd zUKQJa$1>ANU)Q45P(EV+RH0F{Vc^Q`usRNI_dTu@;87N}=J{ngp3>}l3n;`i z8c`j4W@3<@y<8=iqJv1LQreazr3WP&B9S}q*^p)?<` zvICKkd>C*t&jS4nfb#zLDm)7xAiy^ZeLIrT5!6trkm+O#ef-HAj(EOu+0YBii52Q& zL_Z(Mb;&h3vC?g4?3)Ojbx_%Diac2mM)qz4l>l$8bprJRe+eIbK@zR<=f~>5318$> zI?`k)mrjeZdBi?exiD9Ix!+9;Eb^?*I${0QoOEUuebcpvpAwIDHHZCvC&Vcly{p#w zlZaGZpa9UjJG;Ml4_0KaDYP4ZK>GqNoec<+1CEm~&@6Jlyr(ejCIq4%c(*Ne^2>oy zOi0LZw;_HsN}jB)iwSq)fS7<8rU{&gx>B6nxh+{fT9jhzd0b1xOffUhgT1B3ExQ7| zE9s@q{*pD)z9)-!e=)h5Z7W|QB5sjt%Kd8ShuJYbWbpI$Oh#W5s)no>uSa6y3K_^HmhzUM<&IHA$_wN|?xc$xI)nibKz^Y-RyOIUx~ zN=#FA5oc*@A7|#j z<2w#^lv}re2w|6+#xdW< zo1wi!%_q#ImEg&ZAKp^Clbf33jPB`1vl}!(m4H+3Aj;3Lrr7<~!j+SA{5%hkCL|yG z#~I)i?>&qpjVGY+6vd~`XJWm*I;d*}r~(2%Fk`=PI_LgXHd>5JvF6-CuLQ*p_@_Mn zNV$V-XpkX@uswtHg^edQIk^}rMWKsw)2(CmzqG}$X+kY;vvc^ST*(rRtPQrJIMh$I ze#S%dPg`JvQm7d7GZ-cLaLN-)ATIf0eH`x3@m1mod|jBq7~=jnK4U9bF87#YjU;SjCgR+RyqMH8d0{UsjQcu&1;qHgqE zR?45}$5S##;g9?Y&gmLJZ^^Qbl#;Pw^Os8$EA3P1PSB3D;PIo zkscne-CCOLbyvOFM^fBE*c(Bh#_`i69ti>}baG-acfxS{d#p%}rnbU@JJlBC8s54U z`H1-;U9pXxEQi*yxM&V+hv0tLnICQAFhT_2W8{6rWz?&JPPrY3zG2t%MSNm0Ge0tm zJL}2BNoII`a}baaE&oBZ`9ET8iNS*?ApLt;V+|wpoVuy z#F+GFrCXmlax?AT&vhH^K4$)dR|sD1tO9ohBg?5E38k|A^J46P;qi>o+pbpP)&1s3 z`fn5>FMUzVu#D6N-8(-w%$1E9QXLoMhkj>NkQx|sb<|iZ9PLCDeTIxsrBa?lZ577x zGV0ZTllIqJ_@Y=i8Ei#ALx7@jFt?xW)|PE3;4gIo>_MB-eT4eY)d4Xnb0P6B9Cx7m z=Lpn)8kPfb;lFEg|4Ta%`@29nt(|U9!!Pwg?K(<5_zFKih#z&;Cjq2L0gU=!sGJMa95qTV&Uiaa!ZAv;&vhJ^ze10T{@s=&RhKe0Ka`hm^&i`)vQH{+P3cp^Ii{W zIsf=_Hp7=?iQcjQvmzK_-*$R_@0^#Me`X!eu}rY%G_7cM+kT|OvnkBw_fSzPY+k+uonw0#4DJ7Q-lPUR}`bN4X`GHOmsxJMmA2RR>^!L%`-hAiUJ_ zE34FbULOiR4MF{c1@KXMIl;I)i`o?hOs-;)CJ~!L+dbEc1z1Pos^7jv&U*s;v4Ia^T+Y=yTk>@tv+JX^r4%W;Z9OIPpobn zr)`t21@RwSyLLrt5cAEpb~LN!^Wu4tLAC=Unp@5>Vs+LE!K_!V-`>=H&%SEEHO=-S zX1+3K;9%muMTrTF{P+*JXs?4K{716li zBGnS-w78`B!=)?PjH{x!&yHJD*L_9zl7F`q;)HzI+S^KL*tcXqck?349JLIOh!me8 z-cqN`V_$#wVL3kBO>?8K6G>yU73 z7m>_Frbg*(Dp(RKstOc98v8|1#Be>GxcMXXF+dvCLWQOh zd1_4xuD79?75kUW?%jR2oJ@HWklYy7X z?e$-1GL1)hqT15rZs#lL4#Z1tM(fp|;W0A4BG!B7Lcex%oC0;3_i_N`V_2CE@RYSH z2)eRy@;F%i!#0#%whN5&h&aN{iF^Zn2)|mH{8M7t?Bf?xZrl3d7a$GTj6M*~G;q(= z_QTHOpozKhQJj0Zix*jzf!rm5N}i&IENUlQKfA3&z1C>3AMK0?+k9iq+(D$w+^8iS z1p1;h{EgyHctJz*q9remTAE~|a4wB`8M}7Wj9tsecAditq&yrmVA?%}RbP6oF#;J$+Z~vH|LdX=9tT05D|5ieDBG~+T$tJ&6b=~ z^}8Mgj0U?_6;xDb@50t}V}Gw(eYV!o-R+2-vwRBgJ35aF(h^j8pARDrVNw`L>bt~K z^Q^T!=tTfXu?(-Dc+HE8`m8}I#p!Mp$5)&C7}_fLHG0&x7i7Q@Ab%^(f+ z2`wx_7N6*y>4?137_v?$Py)pjJw3@3GK2gxGPAv|yFffZ2^Y|D-W~>U?vuXtm)Fn@ zZSMO`@GHUzF3^A=IB7VUc3~#B(A3;f2TI}V3FO34b%}7mG%E(A#Z(XzEi|#4IG6&{*M@H9=z1K)>%A^x&k;)@ySou;$ zH%Y}K`Y)`SR)IPTSHeg&^@ujhV2<$JCszh4la_ZRFJ z-f-MM=IXDFW{z)yvz(u#7<{kdhH$p7q9hL1O71#@+P?Og;ku#g$p|el2V^(_y$>{my|=`7-8@RkEcgg6~D%u?*1Z zkex3(a}-RGElw9Vkcwg9NygR>Uu*tN$B$Uim~iOfg;_TY_&QB4D`Wy{wju-G#_6>% z=&*T>Ke(kO4 zm(suutl#kJiFgnJkf1i{t?N#GJUsqbx#Zo$)Da9^v&U;rAv(RQHZ;IO8-p`wcLEpL z(d{XwVFt&T)FE#AonCFRx0|Yz(!L^#`v3v6L#OqEH&B9g;d{WXSsiw*lWXBhq0$N) zOE7>DW?nbtlu~cw9NemlpKAt{qn$o& zZKIEUG6e|Bsmp{Xf-Pu5zSr=lU`}Axp)EuqGaTScrO%-3KV&~bVwZ?o^(&U29OcoX zQzT6y^+K+A&qfqKWHuZ&UxgKX$2!iIZ z@%I_0bOVME^y+)2`RFPcLB_~R>%N(K?f|kG(xdqZU?zBE=iWEumVbH;$|u;56S5qI z)oyVT8Y82zdh=DshI@7#C8gnNHFmg#w20XAgP#Zla6DVTc*FNZFVWammlw(cv4jtd zpn^}`w^m%|_Xx4qo&!3e(IlY#9{&jacHckgDn5_C7}~hfZuKhr;dLA08AI$PpcP8a z3>h+1d+7hWXZ&zI^HriSken<&R2-;h`HKD-*Cee4&5yrLV&1$St*i4jX1>8vkA6~- z-lVZdO#kB?Gn6UFfbXJ2|1H{My+Y>1_2+iaJ?O9g9jkYXJfo-D52{RI_FrmE#Lyk~ z^U%>a!D~OJNi~fDzXq0b?gMT6 zv>q@t^8ErUju=q0(zha3fxF0fd|X!DdVHdoA%BM44_{s=(jICw=-NQjrF|D2rx*1 zWO_~od&^KcL!Td`2Fz4Z!kL0u;3nsc(gglZhs1UIs=s{ZVI|G-7g zb=NLSLU%XJD!@&-w-c!$Hv5UL3}%p*iXV6E5WWTWmg8aj2H`wdXhA54*en9J8B0(K z{!pkr7k5KBx07Zq^%JpjOty;M)?*l=soqB-O3sGN5u_27hElPw^_RL6Y(3yl!HJtUre z>ckQ;le{#wtCZ}U_GCoLXTKJ}QZo|5XeXfi)tLKfqbI+$m&;y-I!Pb-UKBToK+b@M zCaFLh+~rmq_$0v8dkC~I`TG1hNGX^iI)by4ssYH4(jw*8W?xWb1PX4?huOGnuU?nM zefeQ^56y1=o2>gtd=D6XnM2#^!^d9f!qUEGcgb;2_1u2-5B{(7%mk3Ej?-9yCruFB z*tx7dsz#0`OMfT0UGJK)A__sj0THQ`U48(9v(kru-#tcmG%3zyRez7TDw?*_yGkMa z#*iO=p82YAyS$N&kK)elm=717ca2;dwG2msm1=VKNjtYxiX+PVQ6EyF>Hlti@;|=K zWW}NFv|z`W%bLuBZ}8V91steR-7?GPP~dq6DLy*=Afcd%_hhRuLG1Jq1C|Dor&|FG zq!?odmx``GF1dzdTPzc$E<9j~ik=?VhW&y|O(wvU+3|G%5mf9U=Cf}W9Ou&ZMw#2b z8vJ|)I)$+F4py6!>pva({S|qumf0$dU|Pb*pZZp~?FxoleTlS7{W0MB>wWD0`nl=+ zxMTachmWJYKa=t4ZHxow8^q3r-u?!JIX560<)0b`PQWVbh(=;24op_Jf3K?7_NVv_ zUll~{CHcPpvh&N_B18J+p#R#_!XcwIOu+I>AqR1Q3fCbQCPA?_4>Q&1wU4aOE_J^wE({X_5c4Y_dwYF&yuYd=LZYSB@2AIp*B2Zqpny% zFBRv&_Q053jt&+u^6XhGnCb#dFzG^dCw_IBk>XeruYWiug9W` zwixzX=zuAV>yp=j>aPg#pIyj5@!kK)6O8@~TAYt-*p4^Db;b=GC23FSfYNWu+2)x3 z{(pR4644ETE1vrCLSoQtVO5+@1DXL?WcIo(zpw4*F0c4WuP^K(lss$sxzw;glGTQQ z9{%*&Q1Ez@UAjVU8b1G~ESy;4gLxtigUd3^ILN-A_6d-OoWBF!yPIbo0eVTBddX*H zyyo(U<1+JB&A{xz67s9Szx6Pe6}~uEd&np-8E`ekhoeLPWvW2>XnhFA(u{RFt?Gt- zi|5;0;7>~10Q(!TXZVws8!D1u0eU9FaQeiVZdUm8xH66sFV|%5=2}lvQ1= z&yuN$aQp-r6BE<~v~tx%t>2gpg&@ixcvWu-M=0G4w?$wJvgFpuJysC8h9#rH z$=xJn)ss$&88R2YN6l6m3h?A9u)-yWM8KEqm2ahix1=tgCnn|YSgl+|ZK{~ON~pK| zXPK{NAgaav`c635O2_E>Nj*fj|IP~>rq%$Nto;io+*k2KXwLsr-FpBv-L_l56akec zSU{;ZP!Iy5bchHDNL48cNJLaXq)BfHqEZ!9R8&fosv=E#NdRdA0@6!>&_igULr6P! z!1sNhXScKWcfOf3d&U`NoMBS_3IBUtYpvhK_r<&7l++SSj(&}sI`Zq0T)X|)$PV^B zyr8(IfHZpX@f@oRhd}o43)fmDvA}Ps+5a5W%Xm_Vpy+;lzo6u^ z6s;-tP#Kh0{med*p1J9ExFO#N-7EhF?jk=l9#A?vnhV-4lI&Ui8hpGdjavsNk=i!! zY(&tkcyc_>f0rW|oN`th3*M0+2l=0k zTzt~|KArBV^rS-Ol2^}K_uYGe0ja}6?Q*0A9GEPj9=IdrOe2EYc=~BQ*Q&@}+5chE z^~$j7$dGptf|3cb{8;qZDt z5)AHR*JkeG{8O3o-~0v!$i6pyaU~+D;Q<%GjnENwRU5BAcD>rfaIR2<5cI5t?b^&_ znDWtWi=^5lxvXQf>U~Mds)}CTs@{BlHsx{1c)(T4Sh<5G^=$eiZp)$)eyr@h1aGRg z!n2n6<}2npz&<IhKy*PIo_Az*0Dr*v80vFS69IYGTJePv znte9zbqh590l4&u^h<9)sbT5aoxsF1e8Rc&myJfTU{Jw^l;XZm?*MiIe8*TH_m$ViW=Bx`i>qU4g6H#glR9$h~%!cvRtxf5#FiUyb zgYU#rs#i8L+~vang|yLtSFi^KtbGjEb(`_K8-*z87E?Z~HjBp?8xRd<+$MZ3J3^zl4t>J2wJamt?QOK^Rd_f{rUIi@-p4)^m>=6e2HO)yw2D!GOxqH|J}obg`NTRh zkruba%|`RT9DGPsRgL&gptSpD`~H*WT5@MGCLq-)5_i}3swCsJ=$P-s3@{V}$AlYi zxI0w)aWHeK-4`pL2bpE9Ce9)@R$0iuS1O||V1b8mIci#2=9-ii*IHK;g|xUoCP+nn zIhs(P*bC)iP!vLOjF)1oAqlETX|WowS%*V|0y)^>u&-ZxGx?kk3AhFBMTF%+>cVyk^7%Vr8b72hy-rpb5I4hu?Nmxx|Bm=p5zidxqzc>d@Pg?&K$*TI&_ zy|vAH#g)A)9}pF_cUQE>8g%a|i4$%huUMtVn!f>{E`u$8;BvL(A60W~Kb}!x!57hf z{*Mg%WI~6+`FbQLi$eG%3c;XkvE8iSliB-RjPSk_r^?knhjLo{^`_N~JcE_IsN-=* z%OeIvx1o7M&hguABc#`#YxHyW&z1(0VLn=eF7n7QsQ!{!mNsP{dnoF05FVB)28zePC?8N zKs#R-;7v`#rE04gB;9Gdf&0n$;J>5ltTMH!PTqc{n1H#jShABS3KfYUvqhYMMX77$<~W=2d}UX zQm2%uEg0HW|E1eP`@K=`Ig*+`^r;7LM*{1+IQd@kiAZbf7_+K^O2(2X`llHVyur^4 zk7`)HJQ_VNYe;udMv-{7Ct;deJH)^6@2z&XiFbkVmCbKd(Mz{u&Yg6y9z<+xsw{rW zIQgJ*VNcin^VaCq3`NSatn^Ual}zVPaDqAe*YTT(Re{YJB%H-=<1WMb3j8o;5r3Fo z7!CWBdaNg`M0oVYSA|t^iRQgsz~I4u>gjUZG_^>iEARgE+#Sk_4;ik!_vAk9>LB$& zf70*{1aqzZRa6rs1H0h2l3QjNZUpg>{&4Tiuzo6Z{Q!Jo9>HZ*US4I+Io=-Sz^(oi z=DR7*5KLRtr}4r9Mw^34XM?2zS5U>Ha)iw!PuXiA_Z9ANhJUr*tAbS;8kXsC&V2!+ z1-ja=G}9l>eq3F8X@8Pv|Cz45qB-|;bntP#<~CObso}<{4Wq5?8(}gp*U5QspOZ_N z%!q@%g~k|GHTk!zlc$SEbdYfF`#BhG=St8Bx0FlDMgpaT4%|Q2>nF?V}!!Oym~}=Oa)`{ zAloJ$T$IJaoHRc6p!F{s8BGZrI{)UwViv%&(PJ>n;suVhxnwt zC#S!w`D{tps1R9ObzpVSGrNB?jG)>Odm$Bz4T?UnDkpAqH3PUKI<)k~dOuB$e<|jA z^t%LNGC~=>JYp8OFjwf=p@k*+3RMOyOQ1b1)w#i+LMedt0Y9#=xR=Dz&+PwKz_0%+ zWK(88w7Z{5%%xg5bS{K#KQuiEJ|SDm#wFW~B7!dhFJWpHw$WSW&<7Z*Ma-Yt6FO#fR%VJf zJm8{(g7Ij|H(K|=>el|77Lwo#=6^tx@j|6SFgs7cY*a^fQW0Cb(8pf&kmI^0t{p|- zq||QxM^-1ir;|xC4Y=P7UbF!8B-7g4#ifn(@)JWnTp(zd7Y}9BB1ip$?L{8D_kxlf zf+^$%6GN8a+jNY`dyzNWh!YK)fdh2!=xi=_A;3$c0KUuX#S<;z-u1VTSoN3x#x;`H zk3&kUbi%79toiXmGM3>&ucsZm|XaP#5Vw_*wc`$k3_Sdb=va>nOU zzZ@2OUB+1>;$mjT9{u?VA1~l5Z@0MrsIr16o_nL5UR?ge3YOrOQHydb=_N4_LTL*LmMJUJ`1-dg6#UK+vl(*g$cjnR!!;m zrO=w8ufSG%bJb%dU6J{At9M>fCDV@=TA8ldx zQj3fe{mK|-+qNKA5y|lnP@w5>A#PVmQRyJ}7tjWM42k-OQsY~TWDuG*KWlQCO=uem z+P=G!@8i5i?Y;&L7S@zLw;Wb8-jVCE=z_?OX3!VYZ~=x<*P(g14G{#L1zHoGw%eO& zKG7o=s$BZ(@zagMm2mFIC)s45@>b5J%u5;}ht-LAVnykT{MF<-gU>MccLG15Xi^$f zgx$#a7Uc#_d&b!FaTY{(rM$bd=7Rp{K&}u2oM0lsLyzM#d>*$cd2lA2i42RY6CXZX zpeB2GVpAh>#~%{!;jY8$ACp+hbZx2qT?^D&rCXs|xLkK*CClYakY3p3fqF8uEu!AL%uZ zv|iXNT4edLl zrFyBCOaNuSW-U9ts=7-N<*i&7s|&f0TqcQ^7!Ust&$v!G)W@0Rr!JD1(&!P_bc=HQ z8-So|O6buhpO4(^7+lcdJneXjt23_l+g_%Qq=+^dPTV3DkhQ>FItXvOjTQODM!6!kgyEBi4-y9aH2q&b5eb@T8_B>Dks}!NWXooCMkOl6?{J4BAQvOs)6`}(bn)6>jQBjK=|6d>?A~fZ)7L}?C}RDXI=K!JY5{xbP8~Q6B+ql#fjaTp zN?z%eV&NcG+L{WQ-N#2nle4N(A2Ke&MO}N%Am!`pznrHBe3g6wgsDNDIo%zX0kIpcL=oEdw_Z+cuoGRU5QRSRN-u99=cyZK=CL?`Ym zncXIc6@euySDHGx)(#sTQ!!rdj$4aiW-!u$)c7v=EV7HYWkfZ)fh;!5M*S=(?R=eC zo6(N1V-*Cn08=S&@NfT49>zy)RzoPtmmtsG7SN$b?)x^Q6h_&wl$#~<-0n%w(T`{p zAOzbC=QQ+>aIs!UDOFOl2bV$MSO?!mop}_)1J%$piGyt}rbUH_|9_;8z_4`qm7Tv*+74B`v@G+RGF4@Zeh&DbuV_(#Ez`;QAZzvIF&mEs+xAIRx?*@|3JQw6szsxJ{B zv=h&<@junL^(Rl4>RK8RI`T12xzT&o)b0Dno^j5=#V}0KEq4~JdurDi=_!H%nRJ(u@QO{h)AU>eenTdlZAm*@nJx^z0bvly z;Vu~CNM8cLO*4RsstO)^Mfk)8%4V;wPC_A>Nmx*Z%ct#&2JY9j2oI#S|D4mY2bWbjie06J@vm#01 z@R9Xe-?pJ;%0>)I2zm_7hRF#Kx?d<|9c^=w#0?i9Y^7kUENH8e{N)hl&!dJL!=c7) z{GZn_Y8)pI=Bd}N?G7_VeS%)OVg3#>0Tq{z3{rf?;ScUyc|xAR3$|5A_kb9PHM$0&Iji^pAQ9(@BtEJgSEV{Ehn z7EhCZ)Ib>-$YHRpxXl4}80%mhPxa|6zH@%)1e9UdE%38npcA!W|L zmY>s#h6FMafWl%H?0m;&46P^XN{;_K))7H#=d z@%ay(9NXYyow)hZPK%|1Mg=$ZEeWcvMldS_A&7d-cl0T=zLdmd6R^n1>Hz+jIn^f> zNFEq^cFvFer5RDuxNGSRTh5q=eNI}e*w%2v?B-Cc#Zp@5vLF2+-2btCW9Pp4|6`r? zKZkRH*YxiUI-smNIo_ooMwdw`p=z4|tKpXmdu;FLzsJt+{&et4ah7Y5HZS)Z-V!Ue zy|UGEqPWZny1p#sM@v<=qS_|Nx|8&$u%>lL+T;>i<(^ZsSC6Z3R1YXCYMmPbApwS9 zW`OPeDgp9=i$fz5dFX#5;i~xpr%qh1J7-s4wRHqPJ)D<8Ulwxr%m*X`Ex>>$g`fz? zUOpZASw9WcsSz$Ez#Ah1%WF~J(9Dbu?V2V3z+V8XLZ}M&w*izrYm}MxT=BA8XSRze zjj%+?eS-E&BD)nD4YAbjSM3i#58a~$E1>1snWd_$KfA%|cBKIof8dKlz`h|y|M}yJ zA-lYScqHf}$i>c)w<(j3ncZ~ssZC1J*|FWH^~+@I+BstX{0Qgn21J=wGJb;!D2 z22N^!f$evA{_k79BH!;&zhFcZjv{O*`U}VlVu-o?H~{&|HJuj9p`_Uc2DPjAyKb;U zk$2T;c;(cM7OgKuhNpw*o#`xLUpN+8kV{4M}$ndG+w@K%e_dPl3^~ETuzTnJDP^a`l=}FtVdz?@GMk!flnMw5FFdV54fBo2 z$oJO$cjREFhx-}(bOz4t38m&R7>$}#tL%dyv6>`Jsq7wXBt!*+x9WPr3Ov~QS(XSrL^?Dm>x_< zwzC%I)$ZR-Z=g<;CP7-~a@+l$t+dHW@#MO1Cw27$uUG|NU2gik9ai6Emp7uZ6Y>*2 z;Qe3udbLTc4BMCt!>x;wmmxJ^N?LleFYJm{0m*OD=hlFWqEB|7Btz?!*TVoX$yk0@ zAR|Q_(Y+DC|4lAjqs;!)z+YUw_w#jS5B2+@)k~_0J7~-^2ZtIC2C9n(Q9U+{mp5$; z8ka51E45chhqAD>WYB&q+~v4ONXX`y>6jJj44tg87!Yq>w?HxVjo{-On8d*_VTY=uCN$J@VC9|=~M80g81{@T3wjQ7RSz^I9coNx9 zkFH6+bNa2&J&}L21>0pV`ztmazqn^6r>mLU>moqdUGNO~q~%4a zc@+CsS1?~$e*ij~`%&SXxCH)!;db8e?MjV!TR|HQG;wG4Nq;gRW_|-tCGW|WVY9K; zid6t8K5~ifX&02D4K0S|`FRL6%}ldCuz12dc#Xbk3g#r0B-spTHrXlguDb4x*ny3Rz6+BplNH53R!yb-z-S!NIe= z)QDNZw5fW(N4G$xM#*JMQJCp7b_I%z#efzvuF{Prb-!pCmyN9*2LzE2`!!ttHe#iKw0&1Nz6I38>e*boJUu zr>4|+-s0h=N(^!N75lzBnFvC8Gv9(rV&#!V;@OTyB0y5M6xNDLeXvIVtoS|?G1dGY zxQ~zGXF*5m)BL^cg=Oi&%Kt*Q8V_)q(bARSn_*mwJ;j5M7yIn^?Vec-S}fAwRG+07 zS_~q=CIQ^Ud!7NavWqH$I6?@-sa#>s&Ch?1DRv!iO~mx|_gAmC%D1)}Ek#uh*0p)T zk`X-7BwaxZ;ouhWp4gz+T}CJZByqw4fC_A_?R;QDn{X_ zvX{3hnMQ+?#v@L2mO~0o)O>#UGh(3)u7F-qsoWoDU$uFgT?M1kH;`@Xlo^_pCH277 z*)||R0HcDji5bWedVn3cG>h0oc4$xTUGEI6&WeNa#K!!#yf0uLNCOblG&6PGl{-kp zjndc$+lJy?;w&wSo91kt^xWO=3bS;vNzI}ApFf$eFcp5F4GawYSkH1EEGvATHSest zHJ!4#h$VmWbmswgM#nLR$6ay)_D4aM+nl7@9Z3)YQ-=Z|9UQK>ZoPG_p48?XZ$5H= zT&jzK;k@X(mx`=1*^K9(R9h`lVW1XdY7+9SM}wJJvkp#D+-}&hecMr=sC`-f)i^ZE{X8zA`4+&j0}Ofj2U^3 zrX-B!NPrIhFq%KKp#G4(SY)U^v0SADIKwX3q53Qp6{<-FUpdUidW^iviy#wXmg3Ym z`8u`JeYwrE;{tQ#_Ng+TBjB-l@)GUnj^6>NeA9y{P;nf@hYa4un@|6xKn;R;LFjS+ z@fv}>g*&0mV?WtLFVmMxC8)fiH-sC%zZnuX1t}MQUU4Q!d&Va>Qe1R$TbOUfEfNQxU zI)|EH&Jm}#6P)VXDgVfgA3II1{XY$jJ;12+D?3SM=9A;b%5p>VhLZU=AIIP;{JQ`p z4)hAbWDEd|dN-H<7m#8Pz^EHTjs({(PEJnp^Wp5Q6IiPI`EeP1icr)lQvn-JF~B#v zGnPFe$$G??I^l#L>$yW+&%(yCujpu8r!IBw?gVk(9#_qff@7M34R#-*xy-t2pq<>i zxx>(a=Uh|guJUVYwzJbScjsqIlP6o->Pr*_ z#^+Xf?ZJbqEHM>yhT(>1A8jauCx9Rk)MKSxvJTzHUL~%?Any{G!Kd_wb*!kfasznr z+BJ^TB6hnO%h|o(8=R>G6spG`?R9oMz@#<`rp?x=Jk%0A&L;18lx(Z8%@}!t$(|eH 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 Zrm@?iy73f9A~P`PX&Y%}U%VCa{{Vq%P^JI? literal 0 HcmV?d00001 diff --git a/snippets/1001_MastermindTdd/logic.py b/snippets/1001_MastermindTdd/logic.py new file mode 100644 index 0000000..b6fe0d6 --- /dev/null +++ b/snippets/1001_MastermindTdd/logic.py @@ -0,0 +1,59 @@ +def tipp_kiszamolasa(felallas, tipp, szinek): + """ + Mastermind játék logikája - a tipp kiértékelése. + + Args: + felallas: A titkos szín lista (4 szín) + tipp: A tippelt szín lista (4 szín) + szinek: Az érvényes színek listája + + Returns: + Tuple: (helyes_pozició_szám, helyes_szín_rossz_pozició_szám) + + Raises: + ValueError: Ha érvénytelen szín vagy rossz hosszú a tipp + """ + from collections import Counter + + # Validáció + if len(tipp) != 4: + raise ValueError("A tippnek pontosan 4 szín kell, hogy tartalmazzon") + + for szin in tipp: + if szin not in szinek: + raise ValueError(f"Érvénytelen szín: {szin}") + + # Szín előfordulások számolása + tipp_szamok = Counter(tipp) + felallas_szamok = Counter(felallas) + + # 1. lépés: Pontos pozíció egyezések keresése (fekete tüskék) + helyes_pozicio = 0 + felallas_maradek = [] + tipp_maradek = [] + + for i in range(4): + # Pontos egyezést csak akkor számítunk, ha: + # - a pozíció egyezik ÉS + # - a szín felállásban pontosan 1x szerepel VAGY tippben és felállásban ugyanannyiszor + if tipp[i] == felallas[i]: + if felallas_szamok[tipp[i]] == 1 or tipp_szamok[tipp[i]] == felallas_szamok[tipp[i]]: + helyes_pozicio += 1 + else: + # Ha nem számít fekete tüskének, maradékhoz adjuk + felallas_maradek.append(felallas[i]) + tipp_maradek.append(tipp[i]) + else: + # Nincs pozíció egyezés, maradékhoz adjuk + felallas_maradek.append(felallas[i]) + tipp_maradek.append(tipp[i]) + + # 2. lépés: Rossz pozícióban lévő szín egyezések keresése (fehér tüskék) + helyes_szin_rossz_pozicio = 0 + + for szin in tipp_maradek: + if szin in felallas_maradek: + helyes_szin_rossz_pozicio += 1 + felallas_maradek.remove(szin) + + return (helyes_pozicio, helyes_szin_rossz_pozicio) diff --git a/snippets/1001_MastermindTdd/mastermind_esettanulmany.md b/snippets/1001_MastermindTdd/mastermind_esettanulmany.md new file mode 100644 index 0000000..6559eb7 --- /dev/null +++ b/snippets/1001_MastermindTdd/mastermind_esettanulmany.md @@ -0,0 +1,43 @@ +--- +layout: post +title: Mastermind fejlesztés TDD módszerrel és AI segítségével +tags: ai python tdd mastermind logic +author: Szakszon Ádám +--- + +# Mastermind Esettanulmány + +## Bevezetés +Ebben a projektben egy klasszikus Mastermind játék motorját készítettem el. A célom az volt, hogy megtanuljam a **TDD (Test-Driven Development)** folyamatát AI (GitHub Copilot) támogatással. + +## Fejlesztési módszertan +A fejlesztés során nem a kódot írtam meg először, hanem a teszteseteket a `pytest` keretrendszerben. + +### Tesztek típusai: +* **Hibaágak:** Érvénytelen színek és rossz tipp-hossz kezelése. +* **Logikai ágak:** Fekete és fehér tüskék számolása, különös tekintettel a duplikált színekre. + + +## Algoritmus leírása +A `tipp_kiszamolasa` függvény két lépésben dolgozik: +1. Megkeresi a pontos egyezéseket (fekete tüskék). +2. A maradék színekből kiszámolja a benne lévő, de rossz helyen lévő színeket (fehér tüskék). + + + +## Érdekes Promptok + +A fejlesztés során az AI-t két lépcsőben irányítottam. Először megadtam neki a teljes tesztkészletet, hogy az alapján generálja le a logikát: + +> "Szia! Kérlek, írd meg a `logic.py` tartalmát a `test_logic.py`-ban található tesztjeim alapján. A feladat a `tipp_kiszamolasa(felallas, tipp, szinek)` függvény megírása. Fontos, hogy a kód minden tesztesetnek megfeleljen." + +Később, amikor az AI túl bonyolult algoritmust (felesleges feltételeket) próbált bevezetni, szükség volt egy pontosító, visszaterelő utasításra: + +> "Térjünk vissza az alapokhoz: először egy ciklussal számoljuk össze az összes pontos egyezést, majd a maradékból határozzuk meg a rossz helyen lévő színeket. Ne bonyolítsd túl a logikát!" + +## Eredmények +A tesztek lefuttatása után az alábbi eredményt kaptam: +![Passed Tests](teszt.png) + +Aztán kértem egy konzolon tesztelhető felületett is az AI-tól: +![Konzol](jatekfelulet.png) \ No newline at end of file diff --git a/snippets/1001_MastermindTdd/test_logic.py b/snippets/1001_MastermindTdd/test_logic.py new file mode 100644 index 0000000..78fd4c2 --- /dev/null +++ b/snippets/1001_MastermindTdd/test_logic.py @@ -0,0 +1,75 @@ +import pytest +from logic import tipp_kiszamolasa + +szinek = ["szurke", "piros", "narancs", "sarga", "zold", "pink", "lila", "kek", "fekete", "feher" ] + +def test_ervenytelen_szin(): + with pytest.raises(ValueError): + tipp = ["sotetkek", "kek", "kek", "kek"] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + +def test_tulsok_szin(): + with pytest.raises(ValueError): + tipp = ["zold", "kek", "kek", "kek", "piros"] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + + +def test_tulkeves_szin(): + with pytest.raises(ValueError): + tipp = ["zold", "kek", "kek",] + felalas = ["piros", "kek", "zold", "sarga"] + tipp_kiszamolasa(felalas, tipp, szinek) + + + +def test_nincs_talalat(): + tipp = ["szurke", "piros", "narancs", "sarga"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,0) + +def test_johely(): + tipp = ["zold", "kek", "szurke", "piros"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) + +def test_benne(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) + +def test_benne_johely(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["szurke", "lila", "piros", "kek"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) + +def test_duplikaltszin_johely(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (1,0) + +def test_duplikaltszin_benne(): + tipp = ["kek", "szurke", "piros", "kek"] + felalas = ["lila", "kek", "fekete", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,1) + +def test_duplikaltszin_benne_tobb(): + tipp = ["kek", "szurke", "kek", "kek"] + felalas = ["lila", "kek", "kek", "feher"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (0,2) + +def test_duplikaltszin_johely_tobb(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["kek", "kek", "fekete", "piros"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (3,0) + +def test_duplikaltszin_vegyes(): + tipp = ["kek", "kek", "szurke", "piros"] + felalas = ["kek", "kek", "piros", "piros"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (2,1) + +def test_siker(): + tipp = ["zold", "szurke", "piros", "kek"] + felalas = ["zold", "szurke", "piros", "kek"] + assert tipp_kiszamolasa(felalas, tipp, szinek) == (4,0) \ No newline at end of file diff --git a/snippets/1001_MastermindTdd/teszt.png b/snippets/1001_MastermindTdd/teszt.png new file mode 100644 index 0000000000000000000000000000000000000000..0d246c256141a876d177d6ff500e72ae73226092 GIT binary patch literal 23964 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 Kxk|}0