Вы играли в игру "2048" ( ссылка на игру )? Если нет, то этот вопрос, скорее всего, не будет иметь для вас особого интуитивного смысла, и поэтому я думаю, что это плохой вопрос для собеседования.
То, что он пытается сделать, это смоделировать один шаг в игре 2048, где числа идут вверх. Числа будут перемещаться вверх на одну ячейку, если они не достигают другого числа или границы матрицы (представьте себе, что гравитация тянет все числа вверх). Если два числа равны, они объединяются и производят новое число (их сумма).
Примечание: это не совсем один шаг в игре 2048, потому что числа перемещаются только на одну клетку вверх, в то время как в игре они движутся «все в одну сторону», пока не столкнутся с чем-то другим. Чтобы пройти этап игры 2048, вы должны повторять данную функцию до тех пор, пока больше не произойдет никаких изменений.
Проблема в коде заключается в том, что, как вы упомянули, индекс массива выходит за пределы. Это должно быть исправлено путем итерации вместо x = 0 to 2
.
Чтобы сделать это более общим, вы должны быть креативными:
- Основным обобщением является то, что он должен принимать параметр "направление". (Опять же, вы бы этого не знали, если бы сами не играли в игру 2048.) Вместо гравитации, вытягивая числа вверх, гравитация может вытягивать числа в любом из 4 основных направлений.
- Возможно, алгоритм не должен проверять
NULL
, но должен проверять какое-либо другое значение часового (которое является другим входом).
- Также довольно просто обобщить это на более крупные матрицы.
- Может быть, должно быть какое-то другое правило, которое предписывает, когда числа объединяются, и как точно они объединяются (необязательно 2 раза по сравнению с первым). Эти правила могут быть даны в виде лямбд.
Что касается этой части вашего ответа:
целочисленная матрица не может иметь нулевые значения, по умолчанию им присваивается 0, ложно для логического значения и ноль для ссылочного типа
Это в значительной степени зависит от используемого языка, поэтому я бы не сказал, что это ошибка в псевдокоде (который не должен быть на каком-либо конкретном языке). Например, в слабо типизированных языках вы можете иметь матрицу со значениями int
и NULL
.
Вы не упоминаете, что сказали о поведении функции. Если бы я был интервьюером, я бы хотел, чтобы кто-то «подумал вслух» и понял, по крайней мере, следующее:
- Код пытается сравнить каждый элемент с элементом под ним.
- Ничего не произойдет, если нижний элемент не будет
NULL
.
- Если два элемента равны, то нижний заменяется на
NULL
, а верхний элемент становится в два раза больше.
- Если верхний элемент равен
NULL
, то нижний не NULL
элемент «перемещается» на место верхнего элемента.
Эти замечания о коде просто получить, просто прочитав исходный код. Понимаете ли вы эти «правила» и замечаете ли вы, что это (похоже на) игра 2048 года, во многом зависит от того, играли ли вы в нее раньше.