Stvaranje dvodimenzionalnih nizova u Rubyju

Sljedeći članak dio je serije. Za više članaka iz ove serije pogledajte kloniranje igre 2048 u Rubyju. Kompletan i konačni kod pogledajte u nastavku.

Sada kada znamo kako će algoritam raditi, vrijeme je da razmislimo o podacima na kojima će ovaj algoritam raditi. Ovdje postoje dva glavna izbora: stan red neke vrste ili dvodimenzionalni niz. Svaka ima svoje prednosti, ali prije nego što donesemo odluku, moramo nešto uzeti u obzir.

SUŠE zagonetke

Uobičajena je tehnika rada s zagonetkama utemeljenim na mreži gdje morate tražiti obrasce poput ovog kako biste napisali jedan inačica algoritma koja djeluje na zagonetki s lijeva na desno, a zatim zakretajte cijelu zagonetku oko četiri puta. Na ovaj način algoritam se mora pisati samo jednom i on mora raditi samo s lijeva na desno. Ovaj dramatično smanjuje složenost i veličinu najtežeg dijela ovog projekta.

Budući da ćemo raditi na zagonetki s lijeva na desno, ima smisla redovi predstaviti nizovima. Prilikom izrade dvodimenzionalnog niza u Rubin (ili točnije, kako želite da se na njega adresiraju i što podaci zapravo znače), morate odlučiti želite li snop redaka (pri čemu je svaki red mreže predstavljen nizom) ili snop stupaca (gdje je svaki stupac niz). Budući da radimo s redovima, odabrat ćemo redove.

instagram viewer

Kako se okreće ovaj 2D niz, doći ćemo do nakon što zapravo konstruiramo takav niz.

Konstrukcija dvodimenzionalnih nizova

Metoda Array.new može uzeti argument koji definira veličinu polja koja želite. Na primjer, Array.new (5) stvorit će niz od 5 nil objekata. Drugi argument vam daje zadanu vrijednost, dakle Array.new (5, 0) dat će vam niz [0,0,0,0,0]. Pa kako stvoriti dvodimenzionalni niz?

Pogrešan način i način na koji vidim ljude kako se često trude je reći Array.new (4, Array.new (4, 0)). Drugim riječima, niz od 4 reda, a svaki red je niz od 4 nule. Čini se da isprva djeluje. No pokrenite sljedeći kod:

Izgleda jednostavno. Napravite niz 4x4 od nula, gornji lijevi element postavite na 1. Ali isprintajte ga i dobit ćemo…

Postavila je cijeli prvi stupac na 1, što daje? Kad smo napravili nizove, najprije se zove poziv interneta Array.new, čineći jedan red. Pojedinačna referenca na ovaj redak zatim duplicira se 4 puta da bi se popunila najniža vrsta. Svaki se redak odnosi na isti niz. Promijenite jedan, promijenite ih sve.

Umjesto toga, trebamo koristiti treći način stvaranja niza u Rubyju. Umjesto da u Array.new prenesemo vrijednost, prosljeđujemo blok. Blok se izvršava svaki put kada metoda Array.new treba novu vrijednost. Pa ako biste to rekli Array.new (5) {get.chomp}, Ruby će se zaustaviti i tražiti unos 5 puta. Dakle, sve što trebamo učiniti je samo stvoriti novi niz unutar ovog bloka. Tako završimo sa Array.new (4) {Array.new (4,0)}. Sada pokušajmo ponovo taj testni slučaj.

I čini se onako kako ste očekivali.

Iako iako Ruby nema podršku za dvodimenzionalne nizove, još uvijek možemo raditi ono što trebamo. Sjetite se samo da niz vrhunske razine drži reference na pod-nizove, a svaki se niz mora odnositi na različit niz vrijednosti.

Što ovisi ovaj niz, ovisi o vama. U našem slučaju je ovaj niz raspoređen u redove. Prvi indeks je redak koji indeksiramo, od vrha do dna. Za indeksiranje gornjeg reda zagonetke koristimo A [0], za indeksiranje sljedećeg retka dolje koji koristimo [1]. Za indeksiranje određene pločice u drugom redu koristimo [1] [n]. Međutim, da smo se odlučili za stupce... bila bi ista stvar. Ruby nema pojma što radimo s ovim podacima, a budući da tehnički ne podržava dvodimenzionalne nizove, ono što ovdje radimo je hack. Pristupite mu samo konvencijom i sve će se održati zajedno. Zaboravite što bi trebali raditi podaci ispod njih i sve se može brzo raspasti.

instagram story viewer