Kezdőoldal » Számítástechnika » Programozás » Hogy kell ezt leprogramozni...

Mr Papp kérdése:

Hogy kell ezt leprogramozni pascal nyelven h a dev pas is lefutasa?

Figyelt kérdés
Két fél a következő játékot játssza, melynek a szabályai a következők. A két játékos előtt egy N x M méretű csokoládészelet van. Egy lépés során a csokoládét ketté lehet törni két „nem üres” részre, mindamellett az 1 x K méretnél nem nagyobb részeket már nem lehet kettétörni. A csokoládédarabokat el lehet forgatni. Továbbá feltételezzük azt is, hogy az egyik csokoládédarab „nem nagyobb”, mint a másik, ha az egyenlő a másik darabbal, vagy annak egy részével. Az veszít, aki már nem tudja elvégezni a következő lépést. A bemeneti adatként három számot kell megadni egy állományban: 0 < N, M, K  100. A kimeneti állományban a győztes játékos sorszámát kell kiíratni, azaz azt, hogy 1 vagy 2. Példa. Bemenet: 1 100 99; Kimenet: 1.

#játék #programozás #Pascal #dev pas #csokis játék
2017. aug. 3. 22:33
 1/8 anonim ***** válasza:
0%
Ügyesen, ügyesen.
2017. aug. 3. 23:14
Hasznos számodra ez a válasz?
 2/8 tabaki ***** válasza:
100%

Úgy, hogy megtervezed, milyen részletekből álljon a program, azokat még kisebb részekre bontod, amíg olyan elemi feladatokig nem jutsz, amelyeket már le tudsz kódolni a pascal szabályai szerint. Ha valamelyik részfeladatban elakadsz, itt bemutatod a próbálkozásodat, és megpróbáljuk megkeresni a hibát. Ha már az egész készen van, a teljes kódot is feltöltheted valahová, általában tanulságos, hogy hogyan fésülgetik ki a tapasztaltabbak.

Ha rosszul értettem, és már készen van egy másik pascal-változatban, csak annyi a probléma, hogy a Dev-Pascallal nem tudod lefordítani, akkor megint csak mutasd be a kódot. A Dev-Pascal, tapintatosan szólva, nem éppen naprakész, de bizonyára megtaláljuk a módját, hogy a te modernebb megoldásaidat hozzábutítsuk.

A leírásod alapján én egyelőre egy kukkot sem értek a játék céljából, de a kód majd megvilágítja az értelmét.

2017. aug. 4. 02:18
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:

Honnan van ez a feladat?

Nekem kicsit információhiányosbak tűnik a kiírás... az nincs benne hogy csak az egyik darabot (amelyik nem kisebb a másiknál) osztják tovább?

Amúgy tipikus versenyfeladat algoritmikus tudás felmérésére. Ez egy kezdő szintű feladat.

2017. aug. 4. 19:55
Hasznos számodra ez a válasz?
 4/8 anonim ***** válasza:

Mr Papp (a kérdező) már többször is megkérdezte (privátban), hogy ezt a problémát meg tudnám-e oldani.


Igazán megtisztelő a feltételezése, de a probléma egyáltalán nem olyan egszerű, mint ahogyan itt a válaszadók egyike-másika próbálta felvázolni.


Pár napja már gondolkozom rajta, tehát van egy csokoládétábla (NxM mátrix), amelyből egészen addig lehet törni, amíg van egy legalább 1xK méretű darab.


Tehát a csodoládéból nem csak 1xK méretű darabokat lehet letörni (vagyis nem NIM jellegű, pl. "mérgezett-csokoládé"), hanem már kezdetben is széttörhetem 2 olyan darabra, amelyekből a következő lépéskor szintén le tudok törni 1xK méretű darabokat.


Ezen a ponton megfordult a fejemben a dinamikus-megvalósítás, tehát minden csokoládédarabra létrehozni egy dinamikus-mátrix-ot, amelyre megint el lehet játszani a törést. ...vagyis már ott tartunk, hogy rekurzívan kellene megoldani (vagy mélységi gráffal)


Tehát mi alapján döntjük el, hogy a csokoládé melyik oldalából törünk? (esetleg véletlenül?)


Egyáltalán hogyan döntjük el, hogy egy már igy-úgy tört csodokádédarabot hogyan törünk tovább???


Meg egyáltalán hogyan tároljuk el a csodikarabok alakját?

(fontos ez?)


Lehet, hogy csak én bonyolítom túl a dolgot... :-)


Tehát nem maga a beolvasás és a kiiírás a nehéz. ...ráadásul egy algoritmust akármilyen programozási nyelvre át lehet ültetni.


NIM:

[link]


Mérgezett csokoládé:

[link]

2017. aug. 10. 11:28
Hasznos számodra ez a válasz?
 5/8 tabaki ***** válasza:

@#4:

Két dologban szinte bizonyos vagyok:


1. Valószínű, hogy te bonyolítod túl a dolgot. Én úgy értem a feladatot, hogy játékot nem lejátszatni kell a géppel, hanem csak levezetni. Vagyis két emberi játékos játszik egymás ellen, a program pedig a megadott értékekről elindulva pusztán könyveli a tábla méretének változásait, illetve ellenőrzi, hogy az adott törés után maradt darab törhető-e tovább. Ha nem, az utolsó lehetséges törést végrehajtó játékos nyert. A törést a játékosok mindig ugyanúgy végzik (például a tábla egy oszlopának megadásával), szerintem így kap értelmet, hogy a darabok elforgathatók. Ha mindig csak a megmaradt darabbal foglalkozunk (szerintem ez a feladat), nincs szükség a darabok számontartására, csak a két oldal méretéére -- ezek forgatáskor megcserélődnek. A másik lehetőség, hogy az összes letört darabot még tovább kell tördelni, és végül az így kapott részeredményeket összesítve határozható meg a győztes. Itt valóban szerepet kaphatna a rekurzió és a darabok méretének külön-külön való tárolása, de a pongyola leírásban én nem látok erre való utalást. A „nem nagyobb” vizsgálat inkább arra mutat, hogy csak az egyik darab érdekes a továbbiakban, a másik kikerül a játékból.


2. A scriba-feltételnek tényleg benne kéne lennie a programban. Anélkül ugyanis egyrészt bonyodalmasabb a bekérés (külön tisztázni kell, hogy melyik darab maradjon meg), másrészt -- ami lényegesebb -- már az első lépésekben a minimális méretű darab mellé töréssel lehetne kényszerítőzni, a tábla méretétől gyakorlatilag függetlenül, ez kevesebb stratégiát enged meg.


Kérdező meg a privát levelezés helyett inkább itt mutathatná be a kísérleteit. Ha megelégszünk az én feltételezésemmel, a program nem túlságosan bonyolult, és jól szétbontható külön-külön is megoldható eljárásokra/függvényekre.

2017. aug. 10. 20:18
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:

#5-ösnek (tabaki)

A te elgondolásod is csak feltételezés, köszönhetően annak, hogy a játékleírás hiányosnak tűnik.


De legyen igazad és tényleg "csak" levezetni kell a játékot, nézzük mi van ebben az esetben.


1.: a játékosoktól be kell kérni, hogy melyik csokidarabból akar törni,


2.: meg azt is, hogy mekkora darabot akar letörni,


3.: esetleg honnan.


Ez így akkor egy könnyű játék?


(a sok feltételezésből végül tényleg összehozunk egy játékot, ha így haladunk)

2017. aug. 12. 22:35
Hasznos számodra ez a válasz?
 7/8 tabaki ***** válasza:
Kétségtelen, hogy csak feltételezésekre alapoztam, és az is, hogy azokból a legegyszerűbbeket és a számomra legkényelmesebbeket válogattam ki. Így mindig csak teljes oszlopokat lehet letörni, és mindig csak a nagyobb darab marad a játékban, tehát csak ezt lehet tovább törni. Ennek a változatnak a szabályai már mindenesetre megvannak, csinos rajzos bemutatót is készítettem hozzá, de mi tagadás, egy kissé már álmos vagyok, holnap esténél előbb már nem hozakodom vele elő.
2017. aug. 13. 02:08
Hasznos számodra ez a válasz?
 8/8 tabaki ***** válasza:

Az én változatom szabályai a következők:

1. A játék egy megállapodás szerinti oszlop- és sorszámú táblával indul.

2. Ezen kívül meg kell határozni egy tetszés szerinti hosszúságú, 1 kocka szélességű szeletet, amelynél a tábla nem törhető kisebb méretűre. A szelet értelemszerűen nem lehet hosszabb a tábla nagyobb méreténél.

3. A játékot két játékos játssza egymás ellen, oly módon, hogy felváltva a táblát felváltva tetszés kétfelé törik, míg el nem érik az előzőleg meghatározott legkisebb méretet. A játékos célja, hogy az utolsó lehetséges törést ő hajtsa végre, és az ellenfélnek maradjon a tovább már nem törhető darab.

4. A törést a tábla tetszés szerinti oszlopának számával lehet megadni, és a tábla a teljes magasságában elhasad. Ha a játékos a másik méretből akar törni, akkor előbb elfordítja a táblát. Ilyenkor a vezérlés nem kerül vissza a másik játékoshoz, így a törést -- megint csak az oszlopszám megadásával -- végre tudja hajtani.

5. törés után csak a nagyobb darab marad a játékban, a leesővel a program nem foglalkozik. A darabok sorrendje közömbös, tehát mindegy, melyik oldalról törünk ugyanannyi oszlopot. Ennek megfelelően a középen eltört tábla esetén sincs szerepe annak, hogy a maradék fél táblát a jobb- vagy a baloldali félnek tekintjük.

6. A tábla csak akkor osztható a minimumhossznál kisebbre, ha a másik irányban megvan ez a méret.


Illusztrációk -- nem megfontolt játék, csak néhány lépés. Nem teszteltem, hogy valójában mennyi lehetőség van a taktikázásra. Az átláthatóság kedvéért csak kis táblát rajzoltam, de ez elméletileg lehet akármekkora, nem követelmény, hogy a program meg is jelenítse.

Egy kiindulóhelyzet, 12 X 9 kocka méretű tábla:

[link]

A tovább nem törhető darab 1 X 4 kocka:

[link]

Az első játékos eltöri a táblát a fehér vonallal jelzett 5. oszlopnál. A kék vonal az ezzel ekvivalens 7. oszlopot mutatja.

[link]

A nagyobb darab mindkét esetben 7 X 9 kocka méretű lesz, tehát ez marad a táblából (a pirossal kiemelt kockák jelzik, hogy a törés problémátlan volt, a minimum mindkét irányban kényelmesen benne van a darabban):

[link]

A második játékos közvetlenül a minimumhossznál töri el a táblát:

[link]

[link]

Az első játékos úgy dönt, hogy még tovább osztja. Ezt megteheti, mert függőlegesen még elfér a minimumszelet:

[link]

[link]

A második elforgatja a táblát...

[link]

...utána eltöri:

[link]

A darabból az első már nem tud úgy törni, hogy a másik oldalon ne maradjon meg a győzelmet jelentő sor, lemondóan letöri az utolsó oszlopot:

[link]

[link]

A második játékos elforgatás után kettéosztja a táblát, ezzel megnyerte a menetet, mert az elsőnek már nincs lehetősége további törésre:

[link]


Egyébként meg igazad van, az egész merő ábrándozás. Minél többet nézem a hiányos leírást és a bornírt input-output példát, annál inkább el tudom képzelni, hogy valami primitívebb dologról van szó, nagyon egyszerű stratégiával, aminek az alapján a bevitt adatokból játék nélkül is meghatározható a győztes, és voltaképpen ezt az algoritmust kéne megtalálni.

2017. aug. 14. 00:49
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!