2018. február 8., csütörtök

KÁRTYALAPOK AZ UNIVERZUMBAN

QUBIT
Szerző: KÁLMÁN LÁSZLÓ
2018.02.07. 


A programozásról szóló sorozatomban az elejétől fogva azt a szemléletet választottam, hogy programozáskor egy képzeletbeli univerzumot építünk és működtetünk. Kezdjünk bele egy ilyen univerzum megteremtésébe. Persze nagyon egyszerű, már-már bugyuta példával érdemes kezdeni. Ha már egyszer a fejembe vettem, hogy megtanítom a teljesen tájékozatlan olvasót, akkor neki kis segítséggel szinte magának kell mindent kitalálnia. Aki tudja ezeket, az nem tartozik a célközönséghez, aki meg nem, annak jobb teljesen elemi dolgokkal kezdenie. 

Szóval megint a sima 52 lapos francia kártya lesz a példa. Ebben az a jó, hogy mindegyik lap önálló lény a virtuális világunkban, amit a színével (treff, káró, kőr vagy pikk) és az értékével (2–10, bubi, dáma, király és ász) lehet jellemezni, és mindegyik lapból csak egy van (például nincs két kőr 9-es). Ugyanakkor önálló lénynek tekinthető a teljes pakli is, sőt ha például négy egyenlő részre osztjuk a paklit (ahogy például a bridzsben kell), akkor a négy ún. kéz is egy-egy 13 lapból álló lénynek tekinthető, amit valahogy ábrázolnunk kell a számítógép memóriájában.

Tárgyak és tulajdonságok

De maradjunk egyelőre az egyes lapoknál. Talán ott kéne kezdeni, hogy nemcsak ezek a valóságos tárgyak tekinthetők lényeknek a programozáskor, hanem az adott szempontból fontos tulajdonságaik is. Például majdnem mindig fontos a kártyalapok színe és értéke, ezért a színeknek megfelelő 4 tulajdonságot és az értékeknek megfelelő 13 tulajdonságot is ábrázolnunk kell valahogy, még akkor is, ha nem foglalnak külön helyet a memóriában. Minden egyes lapnak szüksége van egy kis helyre, egy bit-sorozatra, amiből leolvasható a színe és az értéke, ilyen értelemben kell a színek és az értékek ábrázolását is kitalálnunk.

Bár a memóriában minden adat egy-egy bit-sorozatnak felel meg, ha nem muszáj, akkor nem bajlódunk bitekkel, hanem a bit-sorozatokat szokásosabb adattípusoknak fogjuk fel, amiket könnyebb leírni, megjegyezni stb. Vagyis a virtuális létezőinket magukat is virtuális létezőkkel ábrázoljuk. Például nagyon gyakran ábrázolunk dolgokat számokkal, mert egyszerű bánni velük, van természetes sorrendjük, és még ezer más okból. (Egy egész szám a memóriában általában 32 bit helyet foglal el, de a számokkal olyan egyszerű bánni, hogy még akkor is szoktunk számokat használni, amikor az ábrázolt dolgok megkülönböztetéséhez messze nincs szükség ennyi bitre.) Hasonlóan jól kezelhetők a karakterek (itt a hagyományos 256 ASCII karakterre kell gondolni, ezek 8 bit helyet foglalnak el), és gyakran használjuk az „igaz” és „hamis” értelmezésű két igazságértéket (más néven Boole-féle értéket), ennek ábrázolásához elvileg csak 1 bit memóriára lenne szükség.

Számokkal nagyon egyszerűen ábrázolhatjuk a színeket, a lapértékeket, a lapokat és a paklikat (kezeket), sőt, többféle megoldás közül választhatunk. Például mondhatjuk, hogy az 52 lapot összesen 52 számmal, mondjuk a 0 és 51 közötti számokkal ábrázoljuk (szokjuk meg, hogy 0-tól kezdjük a számolást, sok szempontból ez a praktikus, ezért ez a szokás), az egész paklit pedig az 52 lapnak megfelelő 52 számból álló tömbbel. Akkor a lapok sorszámából egy egyszerű eljárással kiszámolhatjuk a színüket és az értéküket: megnézzük, hogy az adott lap sorszámában hányszor van meg a 13, és mennyi a maradék. Az első szám 0 és 3 között lesz, vagyis négyféle lehet, ezek felelhetnek meg a négy színnek; a mardék 13-féle lehet, ezek felelhetnek meg a lapértéknek. (Fordítva is csinálhatjuk, 4-gyel osztva.)

Ha nem akarunk állandóan maradékos osztást számolni, akkor megtehetjük azt is, hogy minden lapot két számmal ábrázolunk (egy két számból álló tömbbel), az egyik a színét, a másik az értékét jelöli. Ekkor az egész pakli tárolásához nem 52, hanem 104 számra van szükségünk. Például ezt így jelenthetjük ki valahol a programunk elején:

int pakli[104];

Ezt a sort úgy kell kiolvasni, hogy a pakli szimbólum ezek után egy 104 egész számból (angolul: integer, ezért int) álló tömbre utal, ennyi helyet lefoglalunk a memóriában erre a célra. (Persze másképpen is csinálhattuk volna, például úgy, hogy két 52 hosszúságú tömbnek foglalunk helyet, úgy, hogy az egyikben az egyes lapok színét, a másikban a lapértékét tároljuk.)...

Nincsenek megjegyzések:

Megjegyzés küldése

Megjegyzés: Megjegyzéseket csak a blog tagjai írhatnak a blogba.