Két dimenziós tömb létrehozása a Ruby-ban

A következő cikk egy sorozat része. A sorozat további cikkei: A játék 2048-as klónozása, Ruby. A teljes és a végleges kódot lásd a lényegben.

Most, hogy tudjuk, hogyan fog működni az algoritmus, itt az ideje, hogy gondolkozzunk azokra az adatokra, amelyeken ez az algoritmus működni fog. Két fő választási lehetőség van itt: lakás sor valamiféle, vagy kétdimenziós tömb. Mindegyiknek megvannak az előnyei, de mielőtt döntést hoznánk, figyelembe kell vennünk valamit.

Száraz rejtvények

Általános módszer a rács alapú rejtvényekkel való munka során, amikor ilyen mintákat kell keresni, az ilyenek írása Az algoritmus verziója, amely balról jobbra működik a rejtvényen, majd az egész rejtvényt négy köré forgatja alkalommal. Ilyen módon az algoritmust csak egyszer kell írni, és csak balról jobbra kell működnie. Ez drámai módon csökkenti a bonyolultságot és a méretet ennek a projektnek a legnehezebb része.

Mivel balról jobbra fogunk dolgozni a puzzle-n, érdemes a sorokat tömbökkel ábrázolni. Kétdimenziós tömb elkészítésekor

instagram viewer
Rubin (vagy pontosabban, hogyan kívánja kezelni, és mit jelent az adat valójában), el kell döntenie, sorok halmaza (ahol a rács minden sorát tömb képviseli) vagy oszlopok halmaza (ahol minden oszlop tömb). Mivel sorokkal dolgozunk, sorokat választunk.

Hogy hogyan forgatja ezt a 2D tömböt, megtudjuk, miután ténylegesen felépítettünk egy ilyen tömböt.

Kétdimenziós tömbök készítése

Az Array.new módszer argumentumot vehet fel a kívánt tömb méretének meghatározására. Például, Array.new (5) 5 nulla objektum tömböt hoz létre. A második argumentum alapértelmezett értéket ad, tehát Array.new (5, 0) megadja a tömböt [0,0,0,0,0]. Szóval hogyan hozhat létre kétdimenziós tömböt?

Rossz út, és az a módszer, amellyel az embereket gyakran próbálom mondani Array.new (4, Array.new (4, 0)). Más szavakkal, egy 4 sorból álló tömb, mindegyik sor egy 4 nullát tartalmazó tömb. És úgy tűnik, hogy először működik. Futtassa azonban a következő kódot:

Úgy néz ki, egyszerű. Készítsen 4x4-es nullákat, állítsa a bal felső elemet 1-re. De nyomtassa ki, és megkapjuk ...

A teljes első oszlopot 1-re állította, mit ad? Amikor elkészítettük a tömböket, az Array.new leginkább belső hívása először felhívásra kerül, egyetlen sorból állva. Ezután erre a sorra egy hivatkozást négyszer megismételünk, hogy kitöltsük a legkülső tömböt. Ezután minden sor ugyanazon tömbre hivatkozik. Cserélj egyet, mind megváltoztasd őket.

Ehelyett a harmadik a tömb létrehozásának módja a Ruby-ban. Ahelyett, hogy átadnánk egy értéket az Array.new módszernek, blokkot adunk át. A blokk minden alkalommal végrehajtódik, amikor az Array.new metódus új értéket igényel. Tehát, ha mondanád Array.new (5) {gets.chomp}, A Ruby leáll, és ötször kéri a bevitelt. Tehát csak annyit kell tennünk, hogy csak új tömböt hozzunk létre ebben a blokkban. Tehát végül vagyunk Array.new (4) {Array.new (4,0)}. Most próbáljuk meg újra ezt a teszt esetet.

És úgy működik, ahogy elvárható.

Tehát annak ellenére, hogy a Ruby nem támogatja a kétdimenziós tömböket, meg tudjuk csinálni azt, amire szükségünk van. Ne felejtsd el, hogy a legfelső szintű tömb tart referenciák az al-tömbökhöz, és minden egyes tömbnek különféle érték tömbre kell hivatkoznia.

Amit ez a tömb reprezentál, az ön dönti el. Esetünkben ez a tömb sorokként van elrendezve. Az első index a sor, amelyet indexelünk, felülről lefelé. A puzzle felső sorának indexeléséhez használjuk a [0], a következő sor lefelé indexeléséhez használjuk egy [1]. Egy adott csempe indexeléséhez a második sorban a következőket használjuk egy [1] [n]. Ha azonban oszlopokra döntenénk, akkor ugyanaz lenne. Rubynak fogalma sincs arról, hogy mit csinálunk ezekkel az adatokkal, és mivel ez műszakilag nem támogatja a kétdimenziós tömböket, az itt zajlik. Csak megegyezés szerint érje el, és minden együtt fog maradni. Felejtsd el, mit csinálnak az alatta lévő adatok, és minden valóban gyorsan széteshet.

instagram story viewer