Ruby: назначение значений массива в хэше - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел бы получить следующий результат хеширования:

{ 0 => [0,1,2], 1 => [0,1,2], 2 => [0,1,2],
  3 => [3,4,5], 4 => [3,4,5], 5 => [3,4,5],
  6 => [6,7,8], 7 => [6,7,8], 8 => [6,7,8]
}

Интуитивно я могу просто жестко запрограммировать эти значения, но я изо всех сил пытаюсь выяснить, как я могу динамически назначать каждый ключ хеш-функции соответствующему значению массива.. Например, возможно, создание цикла 9.times?

{ 0 => (0..2).to_a, 1 => (0..2).to_a, 2 => (0..2).to_a,
  3 => (3..5).to_a, 4 => (3..5).to_a, 5 => (3..5).to_a, 
  6 => (6..8).to_a, 7 => (6..8).to_a, 8 => (6..8).to_a 
}

Спасибо за любые советы

Ответы [ 6 ]

0 голосов
/ 19 февраля 2019
{}.merge(*Array.new(3){|i| (0..8).group_by{|n| n / 3 * 3 + i}})  

Выход:

{
  0=>[0, 1, 2],
  3=>[3, 4, 5],
  6=>[6, 7, 8],
  1=>[0, 1, 2],
  4=>[3, 4, 5],
  7=>[6, 7, 8],
  2=>[0, 1, 2],
  5=>[3, 4, 5],
  8=>[6, 7, 8]
}
0 голосов
/ 18 февраля 2019
def make_da_hash(n)
  a = (0..n*n-1).to_a
  a.zip(a.each_slice(n).flat_map { |e| [e]*n }).to_h
end

make_da_hash(3)
  #=> {0=>[0, 1, 2], 1=>[0, 1, 2], 2=>[0, 1, 2],
  #    3=>[3, 4, 5], 4=>[3, 4, 5], 5=>[3, 4, 5],
  #    6=>[6, 7, 8], 7=>[6, 7, 8], 8=>[6, 7, 8]} 

make_da_hash(4)
  #=> {0=>[0, 1, 2, 3], 1=>[0, 1, 2, 3], 2=>[0, 1, 2, 3], 3=>[0, 1, 2, 3],
  #    4=>[4, 5, 6, 7], 5=>[4, 5, 6, 7], 6=>[4, 5, 6, 7], 7=>[4, 5, 6, 7],
  #    8=>[8, 9, 10, 11], 9=>[8, 9, 10, 11], 10=>[8, 9, 10, 11],
  #    11=>[8, 9, 10, 11], 12=>[12, 13, 14, 15], 13=>[12, 13, 14, 15],
  #    14=>[12, 13, 14, 15], 15=>[12, 13, 14, 15]} 
0 голосов
/ 18 февраля 2019
dummy_data = {}
(0..8).to_a.each_slice(3).map{ |m| m.each{|v| dummy_data[v] = m }}

генерирует ожидаемые фиктивные данные

dummy_data
 => {0=>[0, 1, 2], 1=>[0, 1, 2], 2=>[0, 1, 2], 3=>[3, 4, 5], 4=>[3, 4, 5], 5=>[3, 4, 5], 6=>[6, 7, 8], 7=>[6, 7, 8], 8=>[6, 7, 8]} 
0 голосов
/ 18 февраля 2019

С динамической верхней границей:

count, split = 9, 3
0.upto(count - 1).map do |i|
  [i, [*(i / split * split)...(i / split) * split + split]]
end.to_h
0 голосов
/ 18 февраля 2019

Используя операции по модулю (%), вы можете вычислить значения подмассивов:

(0..8).map { |i| [i, (i - i%3 .. i - i%3 + 2).to_a] }.to_h

# => {0=>[0, 1, 2], 1=>[0, 1, 2], 2=>[0, 1, 2], 3=>[3, 4, 5], 4=>[3, 4, 5], 5=>[3, 4, 5], 6=>[6, 7, 8], 7=>[6, 7, 8], 8=>[6, 7, 8]}

0 голосов
/ 18 февраля 2019

Может быть, что-то вроде этого:

[0..2, 3..5, 6..8].each.with_object({}) do |range, result|
  range.each do |ind|
    result[ind] = range.to_a
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...