Az I. 511. feladat (2020. május) |
I. 511. Andi és Bandi a szorzás gyakorlására kitaláltak egy játékot. A játékban először választottak egy pozitív egész számot 1 és 1000 között. Ezután felváltva mondtak pozitív egész számokat, de csak olyat, amit korábban még nem mondott egyikük sem és nem nagyobb a választott számnál. A játék addig tartott, amíg valaki olyan számot nem mondott, amivel megszorozva bármelyik korábban elhangzott számot a szorzat a játék elején választott szám lett. Az veszített, aki az utolsó számot mondta.
Sokat játszottak, majd elkezdtek gondolkodni azon, hogy vajon mi lehet a kezdő vagy a másodiknak számot mondó játékos számára a nyerő stratégia. Rájöttek a módszerre, és arra is, hogy a választott számtól függ, hogy kinek kedvez a játék, de ezt nem nézték meg mind az 1000 esetre.
Találjuk ki, hogy mi lehet a nyerő stratégia, majd készítsünk programot, amely megadja, hogy adott választott szám esetén a kezdő vagy a második játékos tud-e nyerni, ha a stratégiát a játék során végig alkalmazza. A program bemenete a választott szám. A kimenetre írjunk 1-est, ha az első, és 2-est, ha a második játékosnak van nyerő stratégiája.
Bemenet | Kimenet |
10 | 2 |
Beküldendő egy tömörített i511.zip állományban a program forráskódja és rövid dokumentációja, amely megadja, hogy a forrásállomány melyik fejlesztői környezetben fordítható.
(10 pont)
A beküldési határidő 2020. június 10-én LEJÁRT.
A program megoldása alapvetően jól sikerült, bár néhány rutinos versenyzőt becsapott. Alapos átolvasás és a szöveg pontos megértése kellett a hibátlan megoldáshoz.
Azok a számok, amelyek nem oszthatók a választott számmal bátran mondahtók bármikor a játék folyamán. Ezenkívül a választott szám oszópárjainak egyike is kimondható. Négyzetszámok esetén a négyzetgyök is mondható, hiszen egyik elhangzott számmal megszorozva sem adja a választott számot. A megoldáshoz tehát a szám osztóit kellett meghatározni, majd ezután a nála nem nagyobb nem osztókat, az osztópárok számát, illetve azt, hogy a szám négyzetszám-e. Egy lehetséges megoldás Python nyelven:
def hanyjo(szam) : jo = 0 for i in range(1,szam+1) : # a számok 1-től szam-ig if szam % i != 0 : jo += 1 # a nem osztók száma, vagyis amik bátran mondhatók nem = szam - jo # a többi szám # a többi szám if nem % 2 == 1 : # ha a szám négyzetszám, akkor a négyzetgyöke szintén jó jo += 1 nem -= 1 return jo + nem // 2 # ennyi számot lehet a játékban mondani szam = int(input()) if hanyjo(szam) % 2 == 0 : print(2) else : print(1)
Statisztika:
12 dolgozat érkezett. 10 pontot kapott: Kaltenecker Balázs Bence, Mócsy Mátyás, Szabó Barbara Noémi, Tóth Lilla Eszter , Ürmössy Dorottya, Vadász Levente, Vörös 314 László. 9 pontot kapott: Horcsin Bálint. 8 pontot kapott: 2 versenyző. 6 pontot kapott: 1 versenyző. 5 pontot kapott: 1 versenyző.
A KöMaL 2020. májusi informatika feladatai