Ustvarjanje dvodimenzionalnih nizov v Rubyju

Naslednji članek je del nanizanke. Za več člankov v tej seriji glejte Kloniranje igre 2048 v Rubyju. Za celotno in končno kodo glejte vsebino.

Zdaj, ko vemo, kako bo algoritem deloval, je čas, da razmislimo o podatkih, na katerih bo ta algoritem deloval. Tu sta dve glavni izbiri: stanovanje matrika neke vrste ali dvodimenzionalni niz. Vsak ima svoje prednosti, a preden se odločimo, moramo nekaj upoštevati.

SUHE Uganke

Običajna tehnika dela z ugankami, ki temeljijo na mreži, kjer morate iskati vzorce, kot je ta, je, da napišete enega različica algoritma, ki deluje na sestavljanki od leve proti desni in nato celotno sestavljanko zasuka okoli štiri krat. Tako mora biti algoritem napisan samo enkrat in deluje le od leve proti desni. Tole dramatično zmanjša kompleksnost in velikost najtežjega dela tega projekta.

Ker bomo sestavljanko delali od leve proti desni, je smiselno, da so vrstice predstavljene z nizi. Pri izdelavi dvodimenzionalnega niza v Ruby (ali natančneje, kako želite, da se obravnava in kaj podatki dejansko pomenijo), se morate odločiti, ali želite sveženj vrstic (kjer je vsaka vrstica mreže predstavljena z matriko) ali kup stolpcev (kjer je vsak stolpec matrika). Ker delamo z vrsticami, bomo izbrali vrstice.

instagram viewer

Kako se ta 2D matrika vrti, bomo prišli po tem, ko bomo dejansko zgradili takšen niz.

Izdelava dvodimenzionalnih nizov

Metoda Array.new lahko sprejme argument, ki določa velikost matrike, ki jo želite. Na primer Array.new (5) bo ustvaril niz 5 ničelnih predmetov. Drugi argument vam daje privzeto vrednost, torej Array.new (5, 0) vam bo dal niz [0,0,0,0,0]. Kako torej ustvarite dvodimenzionalni niz?

Napačen način in način, kako vidim ljudi, ki se pogosto trudijo, je treba povedati Array.new (4, Array.new (4, 0)). Z drugimi besedami, matrika iz 4 vrstic, pri čemer je vsaka vrstica niz 4 nič. In to na začetku deluje. Vendar zaženite to kodo:

Izgleda preprosto. Naredite matrično ničlo 4x4, zgornji levi element nastavite na 1. Toda natisnite in dobimo ...

Celoten prvi stolpec je postavil na 1, kaj daje? Ko smo naredili matrike, prvi kliče Array.new najprej pokliče in naredi eno vrstico. Posamezno sklicevanje na to vrstico se nato 4-krat podvoji, da zapolni najbolj zunanji niz. Vsaka vrstica se nato sklicuje na isti niz. Spremenite enega, spremenite jih vse.

Namesto tega moramo uporabiti tretjič način ustvarjanja matrike v Rubyju. Namesto da prenesemo vrednost metodi Array.new, prenesemo blok. Blok se izvrši vsakič, ko metoda Array.new potrebuje novo vrednost. Torej, če bi rekli Array.new (5) {get.chomp}, Ruby se bo ustavila in vprašala za vnos 5-krat. Torej, vse, kar moramo storiti, je samo ustvariti nov niz v tem bloku. Tako zaključimo z Array.new (4) {Array.new (4,0)}. Zdaj poskusimo še enkrat preizkusni primer.

In to tako, kot bi pričakovali.

Čeprav Ruby nima podpore za dvodimenzionalne matrike, lahko vseeno naredimo tisto, kar potrebujemo. Ne pozabite samo, da drži matrika najvišje ravni reference na pod-matrike in vsak podzidar se mora nanašati na različen niz vrednosti.

Kaj predstavlja ta niz, je odvisno od vas. V našem primeru je ta niz postavljen kot vrstice. Prvi indeks je vrstica, ki jo indeksiramo, od vrha do dna. Za indeksiranje zgornje vrstice sestavljanke uporabljamo a [0], za indeksiranje naslednje vrstice navzdol, ki jo uporabljamo a [1]. Za indeksiranje določene ploščice v drugi vrstici uporabimo a [1] [n]. Vendar, če bi se odločili za stolpce... bi bilo isto. Ruby nima pojma, kaj počnemo s temi podatki, in ker tehnično ne podpira dvodimenzionalnih nizov, je to, kar počnemo tukaj, kramp. Do nje dostopajte le s konvencijo in vse bo držalo skupaj. Pozabi, kaj naj bi počeli podatki pod njimi in vse se lahko zelo hitro razpade.

instagram story viewer