Стварање дводимензионалних низова у Рубију

click fraud protection

Следећи чланак је део серијала. За више чланака из ове серије погледајте Клонирање игре 2048 у Рубију. Комплетан и коначни код погледајте у суштини.

Сада када знамо како ће алгоритам функционисати, време је да размислимо о подацима на којима ће овај алгоритам радити. Овдје постоје два главна избора: стан низ неке врсте или дводимензионални низ. Свако од њих има своје предности, али пре него што донесемо одлуку морамо нешто узети у обзир.

ДРИ Пуззле

Уобичајена техника рада са загонеткама заснованим на мрежи на којима морате тражити обрасце попут овог је писање једног верзија алгоритма која ради на слагалици са леве на десну страну и затим ротирати читаву слагалицу око четири пута. На овај начин, алгоритам мора бити написан само једном и он мора радити само с лева на десно. Ово драматично смањује сложеност и величину најтежег дела овог пројекта.

Будући да ћемо радити на загонетки с лева на десно, има смисла редови бити представљени низовима. Када правите дводимензионални низ у Руби (или тачније, како желите да се адресира и шта подаци заправо значе), морате да одлучите да ли желите сноп редова (при чему је сваки ред мреже представљен низом) или сноп ступаца (при чему је сваки ступац низ). Пошто радимо са редовима, бирамо редове.

instagram viewer

Како се овај 2Д низ окреће, доћи ћемо до ствари након што заправо конструирамо такав низ.

Конструкција дводимензионалних низова

Метода Арраи.нев може узети аргумент који одређује величину матрице коју желите. На пример, Арраи.нев (5) створиће низ од 5 нил објеката. Други аргумент вам даје задану вредност, па Арраи.нев (5, 0) дат ће вам низ [0,0,0,0,0]. Па како створити дводимензионални низ?

Погрешан начин и начин на који видим људе који се често труде је рећи Арраи.нев (4, Арраи.нев (4, 0)). Другим речима, низ од 4 реда, сваки ред је низ од 4 нуле. И чини се да у почетку делује. Међутим, покрените следећи код:

Изгледа једноставно. Направите низ 4к4 од нула, горњи леви елемент поставите на 1. Али одштампајте га и добићемо ...

Поставио је целу прву колону на 1, шта даје? Кад смо направили поља, најпре се зове интерни позив на Арраи.нев, чинећи један ред. Појединачна референца на овај ред потом се дуплицира 4 пута да би се попунио највећи спољни низ. Сваки ред тада упућује на исти низ. Промените једну, промените их све.

Уместо тога, морамо да користимо треће начин креирања низа у Руби-у. Уместо да проследимо вредност методи Арраи.нев, просљеђујемо блок. Блок се извршава сваки пут када метода Арраи.нев треба нову вредност. Па ако хоћете да кажете Арраи.нев (5) {гет.цхомп}, Руби ће се зауставити и тражити унос 5 пута. Дакле, све што треба да урадимо је само створити нови низ унутар овог блока. Дакле, завршимо са тим Арраи.нев (4) {Арраи.нев (4,0)}. Сада покушајмо поново тај тест случај.

И чини се онако како сте очекивали.

Иако Руби нема подршку за дводимензионалне низове, још увек можемо радити оно што требамо. Сјетите се само да низ врхунског нивоа држи референце на под-низове, а сваки потпоље требало би се односити на различит низ вриједности.

Шта ће овај низ представљати зависи од вас. У нашем случају је овај низ распоређен у редове. Први индекс је ред који индексирамо, од врха до дна. За индексирање горњег реда слагалице користимо а [0], да индексирамо следећи ред који користимо доле а [1]. За индексирање одређене плочице у другом реду користимо а [1] [н]. Међутим, да смо се одлучили за ступце... била би иста ствар. Руби нема појма шта радимо са овим подацима, а пошто технички не подржава дводимензионалне низове, ово што радимо овде је хацк. Приступите му само конвенцијом и све ће се држати заједно. Заборави шта подаци испод требају радити и све се може брзо распасти.

instagram story viewer