

下記のような座標を持つファイルをrubyで処理したいのですが、どのようにしたらいいか検討がつかず頓挫しています。アイデアを頂けますか。

処理前

[code]

    group   start   end id  distance    value1  value2
    A   5817    7756    id1 1939    0   3
    A   5817    7754    id2 1937    -2  1
    A   5817    7752    id3 1935    -4  1
    A   5817    7747    id4 1930    -9  1
    A   5817    10699   id5 1938    -50 1
    A   5819    7756    id6 1937    -2  1
    A   5819    7755    id7 1936    -3  1
    A   5828    7756    id8 1928    -11 1
    A   5983    8180    id9 2197    1   2
    A   5983    8175    id10    2192    -5  2
    A   5983    8174    id11    2191    -6  1
    A   5984    8175    id12    2191    -6  1
    
[/code]

上記のような重なりを持つ座標に関して、例として

[code]

    (id2;end – id1;end) – (id2;start – id1;start) = id2;value1
    (id3;end – id1;end) – (id3;start – id1;start) = id3;value1
    
[/code]

というような条件を満たせば、id1とid2及びid3は同じグループに所属するとみなし、グループ内で一番大きいvalue1を持つid1のvalue2にそのカウントを足していきたいのです。

処理後

[code]

    group   start   end id  length  value1  value2
    A   5817    7756    id1 1939    0   9
    A   5817    10699   id5 1938    -50 1
    A   5983    8180    id9 2197    1   5
    
[/code]

以上、ご教示の程、宜しくお願いいたします。


CC BY-SA 3.0
2017-11-26T17:02:41.500
39867
2018-11-10T01:44:15.563
2017-11-26T20:24:21.460
3068
26338
question
ruby
ファイル中の座標の処理

[code]

    require 'pp'
    
    list = []
    open('/tmp/hoge.txt').read.split("\n").select.with_index{|a,i| i != 0}.map{|a| a.split(" ")}.map do |a|
      list << {
        group: a[0],
        start: a[1].to_i,
        end: a[2].to_i,
        id: a[3],
        distance: a[4].to_i,
        value1: a[5].to_i,
        value2: a[6].to_i
      }
    end
    
    id_comb_list = list.map{|a| a[:id]}.combination(3).to_a
    id_comb_list.each do |ic|
      id1 = list.find{|a| a[:id] == ic[0]}
      id2 = list.find{|a| a[:id] == ic[1]}
      id3 = list.find{|a| a[:id] == ic[2]}
      if ( (id2[:end] - id1[:end]) - (id2[:start] - id1[:start]) == id2[:value1] ) &&
         ( (id3[:end] - id1[:end]) - (id3[:start] - id1[:start]) == id3[:value1] )
        target = [id1, id2, id3].sort_by{|c| c[:value1]}.last
        target[:value2] += target[:value1]
      end
    end
    
    pp list
    
[/code]


CC BY-SA 4.0
2018-11-10T01:44:15.563
50149
2018-11-10T01:44:15.563
30913
39867
answer