【问题标题】:split an array in known fragment在已知片段中拆分数组
【发布时间】:2018-11-23 00:04:10
【问题描述】:

我有一个包含布尔键的哈希数组,例如

    [{"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,1,1] 是什么?数组表示什么/
  • 我已经编辑了这个问题,希望更清楚。它是一组图片,我必须根据这些组是否包含水平或垂直图片来组成某些组
  • 连续3个零应该怎么办?
  • 它应该被分成 3 个不同的子数组,每个子数组只有一个哈希
  • 1.告诉我们你尝试了什么。 SO 不是要求他人免费为您编写代码的服务。 2.如果保证输入有4个元素,使用暴力破解会更容易。

标签: arrays ruby split


【解决方案1】:

您可以使用10 作为一种虚构的图像宽度。假设水平图像的宽度是垂直图像的两倍。

然后您可以继续使用它来计算当前图像行上的图像有多宽,以及下一张图像是否仍适合该行。

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适合

你可以通过image_rows.find { |row| row.size == 3 }找到包含111的第一组。

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多