разбить массив на известный фрагмент - PullRequest
0 голосов
/ 13 июня 2018

У меня есть массив хэшей, которые содержат логический ключ, например

    [{"n"=>"img01", "h"=>1},
     {"n"=>"img02", "h"=>1},
     {"n"=>"img03", "h"=>0},
     {"n"=>"img04", "h"=>1}]

Моя цель - разбить на группы, которые имеют одно из следующих условий: h ключ: [1,1,1] или [1,0] или[0,1] или [1,1] или одно значение, если любое из этих условий невозможно.В этом примере единственным способом разделения массива является

     [{"n"=>"img01", "h"=>1},{"n"=>"img02", "h"=>1}] 

и

     [{"n"=>"img03", "h"=>0},{"n"=>"img04", "h"=>1}]

, но сначала он должен выполнить поиск массива, выполненного таким образом

          [{"n"=>"img01", "h"=>1},
           {"n"=>"img02", "h"=>1},
           {"n"=>"img03", "h"=>1}] 

и затем ищу другие комбинации

Я попытался разделить исходный массив на группы по 3 (в тесте использовался только массив 1 и 0)

 irb(main):030:0> b=a.each_slice(3).to_a => [[0, 1, 1], [1, 1, 0], [0, 0, 0], [0]]

, а затемсначала сопоставьте результат с самым большим массивом [1,1,1], а затем попробуйте снова разделить, если не

 irb(main):055:0> (b[0] -  [1,1,1]).count => 1

, поэтому переместите к следующему подматрицу последнее значение

 irb(main):060:0> b[1].push(b[0].pop)=> [1, 1, 0, 1]

повторите поиск в первом массиве из двух элементов

(irb(main):061:0> b[0] - [1,0]).count
(irb(main):061:0> b[0] - [1,1]).count
(irb(main):061:0> b[0] - [0,1]).count

, а затем объедините другой подмассив, разделите его снова и повторите поиск, но он определенно запутался

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете использовать 1 и 0 как вид воображаемой ширины изображения.Горизонтальное изображение предполагается в два раза больше ширины вертикального изображения.

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

Когда width + next element width больше, чемчто соответствует «строке изображений», вы начинаете новую строку.

Пример:

input = [{"n"=>"img01", "h"=>1},
   {"n"=>"img02", "h"=>1},
   {"n"=>"img03", "h"=>0},
   {"n"=>"img04", "h"=>1}]

image_rows = []
current_row = []
current_width = 0.0
input.each.with_index(1) do |image_data, idx|

  image_width = image_data['h'] == 1 ? 0.5 : 1.0

  if current_width + image_width > 1.5
    image_rows << current_row
    current_row = [image_data]
    current_width = image_width
  else
    current_row << image_data
    current_width += image_width
  end

  if idx == input.size
    image_rows << current_row
  end
end

require 'json'
puts JSON.pretty_generate(image_rows)

Выходы:

[
  [
    {
      "n": "img01",
      "h": 1
    },
    {
      "n": "img02",
      "h": 1
    }
  ],
  [
    {
      "n": "img03",
      "h": 0
    },
    {
      "n": "img04",
      "h": 1
    }
  ]
]
  • Когда текущая строка имеет111 ширина равна 0.5 + 0.5 + 0.5 = 1.5 => ничто не подходит
  • Когда текущая строка имеет 10 ширина равна 1.0 + 0.5 = 1.5 => ничто не подходит
  • Когда текущая строка имеет 01 ширина 0.5 + 1.0 = 1.5 => ничто не подходит
  • Когда текущая строка имеет 11 ширина 0.5 + 0.5 = 1.0 => только 0,5 соответствует
  • Когда текущая строка имеет 1ширина составляет 0.5 => 1,0 или 0,5 вписывается в
  • Когда текущая строка имеет 0 ширина составляет 1.0 => только 0,5 вписывается в

Вы можетенайдите первую группу, содержащую 111, выполнив image_rows.find { |row| row.size == 3 }.

...