Как мне перебрать массив нулей? - PullRequest
0 голосов
/ 30 декабря 2011

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

class Big
  def ben
    x = [nil,1,nil,2]
    y = 0
    x[y] == nil ? "good": "bad"
    y += 1
    puts x
  end
end

Я знаю, это можно упростить. Есть ли способ перезаписать каждое значение в массиве?

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Вот некоторые вещи, которые могут помочь, основываясь на том, что я вижу в примере кода.

Это простой способ создать массив, если вы хотите, чтобы он был определенного размера, заполненного nil значениями:

foo = [nil] * 5
=> [nil, nil, nil, nil, nil]

Если вы хотите сплести два массива, таких как массив нулей и другой со значениями:

TOTAL_ELEMENTS = 5

([nil] * TOTAL_ELEMENTS).zip((1..TOTAL_ELEMENTS).to_a).flatten
=> [nil, 1, nil, 2, nil, 3, nil, 4, nil, 5]

Исходя из комментария ОП ниже, что это для игры в крестики-нолики, вот несколько способов создать x:

Array.new(9)
[nil] * 9

Оба из которых возвращают:

=> [nil, nil, nil, nil, nil, nil, nil, nil, nil]

Это полезно, если вы получаете координату ячейки в виде смещения от 0.

Для сетки крестики-нолики может быть более полезно иметь три строки по три столбца, если вы получаете координаты ячейки в виде пары строка / столбец:

Array.new(3) { Array.new(3) }
[[nil] * 3] * 3

Возвращение:

=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]

И некоторые вещи для медитации:

ROWS = COLUMNS = 3

x = Array.new( ROWS * COLUMNS )            # for offsets
x = Array.new(ROWS) { Array.new(COLUMNS) } # for rows and columns

Если вы получаете свою позицию как смещение, но хотите преобразовать ее в строку / столбец, используйте divmod. Ваше смещение будет 0,8, и будет преобразовано в сетку 3х3, то есть [0..2][0..2]. Конвертировать обратно тоже легко:

def row_col_to_offset(x,y)
  x * ROW + y
end  
>> row_col_to_offset(0,0) # => 0
>> row_col_to_offset(0,1) # => 1
>> row_col_to_offset(1,1) # => 4
>> row_col_to_offset(2,2) # => 8

def offset_to_row_col(o)
  o.divmod(ROW)
end  
>> offset_to_row_col(0) # => [0, 0]
>> offset_to_row_col(1) # => [0, 1]
>> offset_to_row_col(4) # => [1, 1]
>> offset_to_row_col(8) # => [2, 2]

Теперь вам нужно узнать о переменных экземпляра @ в Ruby и правильном использовании метода initialize.

1 голос
/ 30 декабря 2011

Если я вас правильно понимаю, вы могли бы сделать это:

class Big 
  def ben
    x = [nil,1,nil,2]
    # These lines don't do much
    # y = 0
    # x[y] == nil ? "good": "bad"
    # y += 1
    puts x
  end
end

И да, на ваш второй вопрос: fill. Например:

[1, 2, 3].fill(0) # => [0, 0, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...