2015-12-13 2 views
-1

Я создал массив массивов в Ruby с элементами, заполненными им. Есть чистый способ проверить все соседние элементы определенного элемента в многомерном массиве а не делать:Как проверить соседей в массиве массивов

array[x-1][y] 
array[x][y-1] 
array[x-1][y-1] 
array[x+1][y] 
array[x][y+1] 
array[x+1][y+1] 
array[x+1][y-1] 
array[x-1][y+1] 

выше метод кажется излишним, я чувствую, рубин должен быть более простой способ сделать выше.

Пример моего массива выглядит следующим образом:

# SA[ 
    # R0[S,X, S, S, S,] 
    # R1[Z,Y, , , , ] 
    # R2[ , , , , , ] 
    # R3[ , , , , , ] 
# ] 

В приведенном выше примере, соседи Y являются S, X и Z.

+0

Настоящие данные и конструкторы, пожалуйста. Ruby не имеет 2D-массивов, поэтому вам нужно описать ваши фактические данные и ожидаемые результаты. –

+0

Также, учитывая 'a = [1, 2, 3]', что вы думаете, 'a [0-1]' дает вам? Ответ может вас удивить. –

+0

Проверьте соседей для чего? Патологические тенденции? –

ответ

0

Рубин не реально сделать 2d массивы, как некоторые другие языки, поскольку массивы являются изменяемыми. Я не знаю каких-либо встроенных классов Ruby, которые обрабатывают такие вещи, и действительно, существует так много комбинаций вещей, которые вы можете захотеть, и вопросы, которые необходимо задать. Как вы справляетесь с краями? Игнорировать, обернуть? Вы суммируете? Применяя функцию к каждой, является ли эта константа постоянной или существует спад рода? Какой результат вы ищете - мутируете, создаете новые? Это просто для этого размера ядра или вы хотите обобщить его для разных размеров?

Моим советом было бы создать свой собственный класс для обработки массивов 2d (внутренне представленных как 1d-массив). Код, который вы хотите написать, прост, но вы точно знаете, что хотите, чтобы вы могли ответить на все вопросы, о которых я спрашивал (плюс те, которых я не сделал), и абстрагировать все это из того места, где вы надеясь использовать его. Кроме того, вы можете обобщить его только на тот уровень, который вам нужен, чтобы вы могли его оптимизировать как можно лучше (Ruby очень гибкий, но, возможно, не самый быстрый из языков).

0

Я не уверен, что мне нравится эта версия лучше, но, возможно, вам хотелось бы поэкспериментировать с продуктами?

[x-1, x, x+1].product([y-1, y, y+1]) - [x, y] 

Или диапазоны?

((x-1) .. (x+1)).to_a.product(((y-1)..(y+1)).to_a) - [x, y] 
+0

Это будет работать, но все равно необходимо проверить, находятся ли ячейки в пределах сетки. Исходный код OP лучше с точки зрения ясности и скорости. – emptyflask

Смежные вопросы