Rácsrejtjelezés

Időnként készítünk oktatóprogramokat is tanfolyamainkon. Most az volt a cél, hogy kódolás/dekódolás szakterület egyik ismert betűkeveréses algoritmusának működését mutassa be lépésről-lépésre az oktatóprogram. A rácsrejtjelezést választottuk.

Az elkészült program Java swing-es felületű és Windows Classic look-and-feel bőrrel így néz ki működés közben:

A rácsrejtjelezés a képernyőképen látható 4×4-es Kódrács használatán alapul.

A titkosítandó szöveget karakterenként beleírjuk az aktuális kódrácsba soronként lefelé, azon belül balról jobbra haladva. Ha a négy pozíció betelt, akkor el kell fordítani a kódrácsot az óramutató járásával megegyező irányban 90 fokkal. Ha a szöveg hosszabb 16 karakternél, akkor elölről kell kezdeni. Ha készen vagyunk, akkor soronként haladva leírjuk egymás után a kódrácsban található karaktereket.

A megfejtéshez ismernünk kell a titkosított karaktersorozaton kívül a felhasznált kódrácsot is. A karaktersorozatot soronként lefelé haladva beírjuk a kódrácsba, az ismert kódrácsot ráhelyezve soronként lefelé, azon belül balról jobbra haladva kiolvashatjuk a megfejtést. Természetesen a kódrácsot most is forgatni kell minden negyedik karakter után.

Megfigyelhető, hogy bármely karaktert tudunk titkosítani és megfejteni. Ezért a rácsrejtjelezés ebből a szempontból univerzális módszer.

A kódrács ismerete nélkül a titkosított szöveg nem fejthető meg, tartalmára csak nehézkes következtetést adhatunk. Például, ha tudjuk, hogy milyen nyelvű a titkosított szöveg, akkor támpontot adhat a megfejtéséhez a nyelv ábécéjében előforduló betűk ismert gyakorisága.

A képernyőkép éppen a megfejtés egyik pillanatában készült. A feladó továbbította a titkosított szöveget és a kódrácsot a címzettnek, aki elkezdte annak megfejtését. A negyedik karakter a b volt, utoljára erre kattintott a (4;4) pozícióban. Ezt követte egy rácsforgatás, amelyhez tartozik egy ablak, amely megjeleníti a „Rácsforgatás következik.” szöveget. Ezután a kódrács elfordult, és a következő cella a második sor első cellája lesz. Ha hibás cellára, pozícióra kattintunk, akkor a következő hibaüzeneteket kaphatjuk: „Hibáztál! Folytathatod a titkosítást.” vagy „Hibáztál! Folytathatod a megfejtést.” Ha befejeztük a titkosítást, vagy a megfejtést, akkor a következő üzeneteket kaphatjuk: „A kódolás sikerült.” vagy „A megfejtés sikerült.”

A program tartalmaz egy gyakorlást támogatandó szövegkészletet. Ennek minden eleme 16 hosszúságú, az egyszerűség kedvéért – így nem kell véletlenszerű karakterekkel feltölteni a rács kimaradt celláit, illetve nem kell 16-os csoportokkal foglalkozni.

A Titkosítás és megfejtés fülön látható egy véletlenszerűen kiválasztott szöveg, amelyet karakterenként kódolni lehet a kódrács megfelelő cellájára kattintva. Ha kész, a Továbbítás gombbal a feladó elküldi a címzettnek a titkosított karaktersorozatot, aki hasonlóan megfejti. „Útközben” megfigyelhető, hogy éppen hányadik elforgatásnál tartunk és természetesen megjelenik az aktuális ráccsal titkosított szöveg is.

Az űrlapon lévő Kódrács csoportablak az aktuálisan, véletlenszerűen legenerált kódrácson kívül a kiválasztott cellák pozícióit is tartalmazza. Az (1;1) pozícióban a bal felső cella található. A kódrács a Másik nyomógombbal véletlenszerűen újragenerálható. Ennek megvalósításakor több probléma, ötlet is felmerülhet. Például használható visszalépéses keresés algoritmus.

Most nem specifikáljuk részletesebben, például objektumorientált tervezés, eseménykezelés, háttérbeli objektumok vagy GUI komponensek működésének/vezérlésének szintjén. Aki kedvet kapott és úgy érzi, hogy meg tudja ugrani ezt a kihívást, akkor bátran elkészítheti. Hajrá! Mivel oktatóprogram, szükséges hozzá Leírás és Teszt is.

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A Java SE szoftverfejlesztő tanfolyamunkon, a szakmai modul Objektumorientált programozás témakörét követő 29-36. óra Grafikus felhasználói felület alkalmain már tudunk egyszerűbb oktatóprogramot tervezni, kódolni, tesztelni.

Skandináv lottó demóprogram

Skandináv lottó (heteslottó) demóprogramot tervezünk és írunk meg Java nyelven. Lépésenként mutatja meg, hogy mi történik a háttérben: hogyan állítja elő véletlenszerűen a lottószelvényt.

Az emlékezet egy logikai tömb. Ebben 36 elem van. A nulladik elem nem számít, és legyen a többi elem (1-35-ig indexelve) kezdetben mind hamis. A cél: legyen a tömbben pontosan 7 db igaz érték. Másképpen: a logikai tömb a lottószelvényen megjátszható számok kiválasztottságát jelöli, igen vagy nem. A heteslottó-szelvény 7 db 1 és 35 közötti különböző egész számból áll.

Mindig 1 és 35 közötti egész véletlenszámot tippelünk. Kezdetben jóSzámDb=0. Az első tipp biztosan jó és jóSzámDb=1. A többi tipp esetén vizsgálni kell, hogy már kiválasztott-e. Ha igen, akkor nincs teendőnk. Ha nem, akkor meg kell jegyezni (kiválasztottá kell tenni, azaz igazzá kell állítani a logikai tömbben) és a jóSzámDb++ (növelhető). Mindezt ciklusban ismételjük, amíg a jóSzámDb<7 feltétel teljesül (másképpen: amíg nincs elegendő kiválasztott szám a szelvényen). Mindez biztosítja az egyediséget, különbözőséget. Ha jóSzámDb==7, akkor kiírjuk a lottószelvényre kerülő számokat az alapján, hol (melyik indexen) van a logikai tömbben igaz érték.

Tekintsük át az alkalmazott módszer hátrányait és előnyeit. Hátrány, hogy 36 logikai érték szükséges ahhoz, hogy 7 különböző számot előállítsunk. Előny, hogy egyszerű az algoritmus (nem kell keresés és megszámolás programozási tétel) és nincs szükség rendezésre sem, mert a szakterületre jellemző „emelkedő számsorrend” a logikai tömb bejárásával önkéntelenül is adódik. Hangsúlyozzuk, hogy ez csupán egyetlen módszer a nagyon sok izgalmas közül, amikkel generálható egy véletlenszerű lottószelvény.

A megvalósítás, Java forráskód nagy egyszerű. Íme egy függvény, amely visszaadja azt kiválasztottságot jelölő logikai tömböt, amiből megfelelően indexelve kiíratható a véletlenszerűen generált lottószelvény:

Egy demóprogram, szimulációs program, oktatóprogram esetén nem is a konkrét feladat megoldása a cél/probléma. Sokkal inkább a lépésenkénti bemutatás, sok-sok konzolos kiírással vagy grafikus szemléltetéssel. Sokszor időzítővel késleltetjük, lassítjuk, gyorsítjuk a folyamatot, de előfordul az is, hogy rengetegszer megismételjük a tevékenységet és a kapott adatokat elemezzük, következtetünk belőlük. Most például a ciklust ki kell cserélni olyan léptetésre, ami a felhasználó kattintásához kötődik. Ha kéri a következő tippet a lottószelvényre, akkor megkapja. Ha nem kattint, akkor nem kapja meg. Az is egy csalás/lehetőség lenne, hogy a háttérben nem is logikai tömb adatszerkezet van, csupán a vizualizáció miatt tűnik annak.

Az elkészült demóprogram megvalósítja a fenti algoritmust. Az alábbi képernyőképeken végiglapozható a demóprogram működése. Nem is az algoritmus megvalósítása a kihívás és a cél, hanem a folyamat lépésenkénti megjelenítése. Java swing grafikus felület készült el.

 

A demóprogram Start állapottal indul. Olyan a lépésenként tesztesetek sorozata, hogy a lottószelvény nem sikerül rögtön elsőre. Az egyik szám már előfordult korábban. A demóprogram Stop állapottal ér véget. A demóprogram pénztárszalagszerűen időnként jelzi, hol tart éppen. A demóprogram képes egymás után több lottószelvényt is előállítani és az emlékezete egyetlen szelvényre korlátozódik.

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A Java SE szoftverfejlesztő tanfolyamunkon, a szakmai modul Objektumorientált programozás témakörét követő 29-36. óra Grafikus felhasználói felület alkalmain már tudunk egyszerűbb szimulációs programot tervezni, kódolni, tesztelni. A Java EE szoftverfejlesztő tanfolyamunkon, a szakmai modul 33-40. óra Java Server Pages alkalmain már a program böngészőben futó változatát is el tudjuk készíteni.

Keresztrejtvény készítése

Támogatjuk a keresztrejtvények készítését Java programmal. A program grafikus felülete eszköztárból és a keresztrejtvényből áll. Az elkészült programban 10×10-től 15×15-ig beállítható négyzetrács készíthető elő. A tiltott négyzetek száma 15-től 30-ig beállítható. Mivel a tiltott négyzetek helyzete véletlenszerű, így nem biztos, hogy az elsőre jó/szerencsés lesz, ezért újragenerálható a négyzetrács. A program a tipikus követelményeknek megfelelően sorfolytonosan sorszámozza a négyzetrács elemeit, ami alapján megadhatók hozzá a vízszintes és függőleges feladványok. A program az elfogadott négyzetrácsot többféle képformátumban is el tudja menteni.

Az elkészült Java program grafikus felülete

Objektumorientált tervezés

A keresztrejtvény ábrája egy négyzetrácsból áll, amelyben rejtvénymezők helyezkednek el. A rejtvénymezőnek megfelel egy örökítéssel felüldefiniált címkekomponens. A rejtvénymezőt körülveszi egy szegély/keret, tiltott vagy sem állapotától függően fekete vagy fehér a háttérszíne, valamint van a bal felső sarkához igazított kis méretű betűvel nem kötelezően megjeleníthető sorszáma. A tiltott és sorszám tulajdonságait kell tudni beállítani és megkérdezni. Ez a feladatban a RejtvenyMezo POJO. A négyzetrács sorai és oszlopai azonos méretűek (pixelre és darabszámra egyaránt).

Algoritmus a keresztrejtvény sorszámozására

A rejtvénymezők kétdimenziós négyzetes mátrixban/tömbben helyezkednek el. A sorszámozáshoz hasznos, ha a négyzetrácsot körbeveszi egy tiltott rejtvénymezőkből álló keret. Először a rács sorain és oszlopain végighaladó egymásba ágyazott ciklusok létrehozzák a POJO-kat úgy, hogy a négyzetrács keretén lévő rejtvénymezők tiltottak, a többi nem tiltott. Ezután véletlenszerűen ki kell választani – a még nem tiltottak közül – a szükséges mennyiségű tiltott rejtvénymezőt. Ezután sorfolytonosan sorszámozni kell azokat a rejtvénymezőket, ahol vízszintes vagy függőleges feladvány kezdődik. Ehhez is két egymásba ágyazott ciklus kell, amelyben minden még nem tiltott rejtvénymező egyre növekvő sorszámot kap, ha tőle balra tiltott és tőle jobbra nem tiltott rejtvénymező helyezkedik el, de akkor is, ha felette tiltott és alatta nem tiltott rejtvénymező található.

A keresztrejtvényt sorszámozó algoritmus Java megvalósítása

Továbbfejlesztési lehetőségek

  • A feladványok listázhatók és kideríthető a hosszuk.
  • A tiltott rejtvénymezők véletlenszerű elhelyezése helyett lehetne valamilyen szabály, stratégia az egymáshoz való helyzetükre, távolságukra, közvetlen szomszédságukra vonatkozóan. Figyelembe vehetnénk valamilyen szimmetriát is, mintákat, alakzatokat is. Véletlenszerű elhelyezésük nem biztos, hogy mindig jó/szerencsés: például a tiltott rejtvénymezők körbezárhatnak egy nem tiltottat, hosszabb feladványokat nehezebb találni…
  • A Java SE szoftverfejlesztő tanfolyam tematikájához kötődően többféle szótárból, fájlformátumból betölthetünk a feladványokhoz használható, például 7 betűs országnevek, 2 betűs kémiai elemek, női/férfi keresztnevek, autójelek, pénznemek, szinonimák…
  • A Java EE szoftverfejlesztő tanfolyam tematikához kötődően többféle webes adatforrásból, Wikipédiából, szótárból, API hívásokkal letölthetünk a feladványokhoz használható listákat, meghatározásokat, kulcs-érték párokat. A swing-es felületet lecserélhetjük böngészőben futó webes GUI-ra is.
  • A Java adatbázis-kezelő tanfolyam tematikájához kötődően a fentiek kiegészítéseként tervezhetünk és építhetünk helyben tárolt tudástárat, adatbázist, amiből hatékonyan lekérdezve adhatunk feladványokat a keresztrejtvényhez.
  • Miután a fentiek szerint valahogyan – tipikusan visszalépéses algoritmussal – meghatároztuk a feladványokat, a keresztrejtvényből menthetünk kitöltött változatot is.

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

Logikus gondolkodás teszt

Mensa logó

Mensa logóAz elmúlt 20 évben rengeteg logikai feladatokból álló tesztet állítottam össze. Kezdetben iskolai szakkörökhöz, versenyekre való felkészítéshez, tehetséggondozáshoz használtam ezeket. Ezután következett a Logikus gondolkodásra nevelő Diákműhely, amelyben ez már professzionális lett. Végül több cég/vállalkozás számára állítottam össze többféle programozói, szoftverfejlesztői tanfolyam tematikájához illeszkedően toborzáshoz, felvételihez, jelentkeztetéshez, kiválogatáshoz, szakmai interjúk során használható tesztet/feladatsort. Ezek eltérő igények szerint mérik/skálázzák a logikus gondolkodást, a problémamegoldást, az algoritmikus készségek meglétét, az összefüggések/szabályok felismerésének és alkalmazásának szintjét, a szakmai felkészültséget.

A logikus gondolkodáshoz kötődően rendszeresen szoktam előadásokat is tartani például országos rendezvényeken (Kutatók éjszakája, Szakmák éjszakája), tehetséggondozó versenyek szakmai napjain tanároknak, diákoknak, főiskolás/egyetemista Erasmus hallgatóknak.

Korábban blogoltam a népszerű Hány éves a kapitány? címmel, ahol ajánlottam 8 db magyar szakirodalmat a témában.

Most angol Mensa IQ teszt szakfolyóiratból [1, 2, 3, 4, 5] válogattam össze egy 10 feladatból álló, logikus gondolkodás mérésére alkalmas tesztet. A válaszok/megoldások név és e-mail cím megadásával automatikus válaszlevélben a bejegyzés végén hozzáférhetőek.

Logikus gondolkodás teszt – feladatok

1. feladat
Az alakzatok pozitív egész számokat jelölnek. Mi kerül a kérdőjel helyére?

logikai-feladat-01

 

2. feladat
A betűk és számok elrendezése logikus. Mi kerül a kérdőjel helyére?

logikai-feladat-02

 

3. feladat
A számok elrendezése logikus. Mi kerül a kérdőjel helyére?

logikai-feladat-03

 

4. feladat
A számok elrendezése logikus. Mi kerül a kérdőjel helyére?

logikai-feladat-04

 

5. feladat
Folytatva a sorozatot mennyi az idő a 4. analóg órán?logikai-feladat-05

 

6. feladat
A számok elrendezése logikus. Mi kerül a kérdőjel helyére?logikai-feladat-06

 

7. feladat
A táblázatban a piros mintával kitöltött cellák elhelyezkedése logikus. Honnan hiányzik 1 db piros mintával kitöltött cella?logikai-feladat-07

 

8. feladat
A szimbólumok elrendezése logikus. Mi kerül a kérdőjel helyére?

logikai-feladat-08

 

9. feladat
56 db jutalomfalattal megetethető 10 háziállat, amelyek vegyesen macskák és kutyák. A macskák 5 db-ot, a kutyák 6 db-ot kapnak és végül marad 1 db jutalomfalat. Hány macska és hány kutya kap enni?

logikai-feladat-09

 

10. feladat
A 7 szám közül 6 párba állítható. Melyik szám marad ki?logikai-feladat-10


Logikus gondolkodás teszt – megoldások

    Doktori értekezések védése a Miskolci Egyetemen

    Miskolci Egyetem logó

    Miskolci Egyetem logóA Miskolci Egyetem Hatvany József Informatikai Tudományok Doktori Iskolájában 2020. július 1-jén két doktori értekezés nyilvános védésére került sor, amelyeket Szentmiklósi István Sándor és Veres Péter nyújtottak be.

    Mindkét munka a logisztikai szakterülethez kapcsolódott. A cél azonos: optimalizálás. Eltérő a megközelítés: az egyik inkább hardverhez, a másik inkább szoftverhez kötődött. Mindkét védés színvonalas és igényes volt. Tartalmas és érdemi hozzászólások, javaslatok hangzottak el. A nyilvános védés méltó alkalom egy többéves kutató tevékenység lezárásához, egyben alkalmat nyújt a további folytatás irányainak meghatározására. Gratulálok a kollégáknak!

    8:30-tól Szentmiklósi István Sándor kezdte, aki Raktári folyamatok optimálhatóságának vizsgálata Ipar 4.0 eszközök alkalmazásával című disszertációját védte.

    A jelölt a szakirodalmi áttekintést követően ismertette, hogy megalkotott egy eszközt, amely anyagáramlási folyamatokban a szállítandó árura negatívan ható hatásokat az áru közvetlen környezetében folyamatosan méri, a mért értékeket kiértékeli és minőségromlás megállapítására is képes. Ez az eszköz az okos egységrakomány képző eszköz (OERK), amely egy mobil kiberfizikai eszköz. Az okos egységrakomány képző eszköz legfontosabb összetevői: egységrakomány képző eszköz, ami lehet egy tároló rekesz, műanyag raklap stb., ami az áru befogadására alkalmas, energia átalakító, energiamenedzsment, mikrokontroller, kiskapacitású memória, szenzoregységeket, a fizikai, kémiai és biológiai paraméterek mérésére, dátum, óra funkció és RF-ID antenna.

    Kutatómunkájának eredményeit öt tézisben foglalta össze:

    • „I. tézis: Elkészítettem egy logisztikai eszköz lehetséges modelljét, amely anyagáramlási folyamatok során az adott áru minőségét befolyásoló paramétereket valós időben folyamatosan méri. A mért paraméterek alapján minőségkiértékelés végezhető. A megalkotott modell alapján elkészítettem annak makettjét.
    • II. tézis: Kidolgoztam az új eszköz egy matematikai modelljét, amely alkalmas adott logisztikai folyamat idő és költség értékeinek meghatározására adott sorbanállási modell esetén.
    • III. tézis: Kísérleti vizsgálataim alapján megállapítottam, hogy különböző anyagáramlási rendszereknél nagy számban keletkeznek rövid időtartalmú, de nagy energiájú tranziens jelenségek. Feltártam, hogy ezek energiája villamos energiává alakítható.
    • IV. tézis: Kidolgoztam és megvalósítottam a III. tézis eredményeire alapozva az eddigiektől eltérő elven működő, a rendszertelen, tranziens rezgéseket is kihasználó áramfejlesztő és energiakicsatoló eszközt.
    • V. tézis: Kidolgoztam egy matematikai modellt, amely modern technikai eszközök felhasználásával alkalmas a járműbeérkezések pontos meghatározására. Ennek alapján kidolgoztam egy dinamikus hozzárendelési algoritmust, amely a járműveket az időkapukhoz rendeli.”

    Szentmiklósi István Sándor és Veres Péter doktori védése

    12:00-tól Veres Péter folytatta, aki Heurisztikus módszerek alkalmazása logisztikai rendszerek tervezésében és irányításában című disszertációját védte.

    A jelölt két célt fogalmazott meg a hálózatszerűen működő nagy kiterjedésű, komplex ellátási láncokhoz kötődően. Ezek: vállalaton belüli és vállalaton kívüli nagyméretű logisztikai hálózatok leírása és kezelését segítő modellek megalkotása, valamint ezen hálózatokban keletkező logisztikai feladatok megoldására olyan új módszerek, modellek és alkalmazások kidolgozása, melyek révén azok működésének hatékonysága javítható. Három modellt mutatott be: belső milkrun útvonal és raktártervezés, külső raktár pozíciójának meghatározása hozzárendeléssel és installációs költségekkel, automatikus járatmódosítás lehetőségei.

    Kutatómunkájának eredményeit négy tézisben foglalta össze:

    • „I. tézis: Kidolgoztam egy új, szekvenciák közötti távolságok mérésére alkalmas módszert, bizonyítottam annak alkalmasságát különböző hosszúságú és felépítésű szekvenciák közötti távolságok mérésére vonatkozóan az egyezőség, a szimmetria és a távolság nem-negativitás szempontjából. A kidolgozott módszer alkalmas különböző járattervezési feladatokban az egyes megoldásváltozatokat reprezentáló permutációs egyedek közötti távolságok meghatározására.
    • II. tézis: Kidolgoztam egy olyan új paramétergenerálási módszert a hagyományos black hole heurisztikára, melynek révén annak konvergenciasebessége – különösen a keresési fázis elején – szignifikáns mértékben javítható. Kifejlesztettem a black hole heurisztikák egy olyan változatát, mely alkalmas szekvencia-problémák, például járattervezési feladatok megoldására.
    • III. tézis: Bevezettem a randomizált életciklus és az elhalálozási ráta fogalmát új egyedek generálására a Firefly algoritmus robusztusságnak növelése érdekében. Emellett bevezettem a legfényesebb memória alkalmazását Firefly algoritmusok hatékonyságának növelése céljából. Az elvégzett benchmark tesztek igazolták, hogy az általam kifejlesztett bővítmények révén az eredeti Firefly algoritmus hatékonysága növelhető.
    • IV. tézis: Megalkottam egy olyan általános keretrendszert, mely alkalmas speciális logisztikai modellek leszármaztatására. Ezen keretrendszer alapján megalkottam az integrált járattervezés, az elosztás és a milkrun anyagellátás egy-egy speciális modelljét. Ezen modellek által definiált NP-nehéz optimalizálási feladatok megoldására megoldásokat kerestem és egyedi módon átalakítottam. A problémák megoldására egyedi alkalmazásokat készítettem, melyekkel a kidolgozott modellek és módszerek hatékonyságát validáltam. Mindegyik probléma megoldható volt lágyszámítási módszerekkel.”

    A tézisfüzetek, disszertációk végleges és korábbi műhelyvitára beadott változatai elérhetők a doktori iskola weboldalán: most még a Hírek, később a Disszertációk oldalon.