免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 5803 | 回复: 39
打印 上一主题 下一主题

去重叠脚本求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-20 12:32 |只看该作者 |倒序浏览
两列数据
1    10
2     8
3     9
16   40
19   45
输出结果
1    10
16   45

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2013-03-20 12:53 |只看该作者
这是神马逻辑

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
3 [报告]
发表于 2013-03-20 12:54 |只看该作者
同上      

论坛徽章:
0
4 [报告]
发表于 2013-03-20 12:55 |只看该作者
回复 2# zhlong8


    每一行的两个数代表一个序列的始末位置,我这是要去除这些序列的重叠部分,合并连续的序列

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
5 [报告]
发表于 2013-03-20 13:21 |只看该作者
本帖最后由 rubyish 于 2013-03-20 09:34 编辑

应该:
  1. #!/usr/bin/perl -l
  2. my @a;
  3. while (<DATA>) {
  4.     @a = [ split ] and next unless @a;
  5.     my ( $a, $b ) = split;
  6.     $a < $a[-1][1]
  7.       ? $b > $a[-1][1] && ( $a[-1][1] = $b )
  8.       : push @a, [ $a, $b ];
  9. }

  10. print for map join( "\t", @$_ ), @a;
  11. __DATA__
  12. 1    10
  13. 2     8
  14. 3     9
  15. 16   40
  16. 19   45
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2013-03-20 14:15 |只看该作者
回复 1# 静女,其姝
  1. #!/usr/bin/perl -w

  2. use strict;
  3. use warnings;

  4. my $id = 0;
  5. my @data;
  6. while (<DATA>) {
  7.     my($left, $right) = split /\s+/, $_;
  8.     die "$left >= $right at line $." if $left >= $right;
  9.     push @data, {
  10.         value => $left,
  11.         id    => $id,
  12.         pos   => 'left',
  13.     };
  14.    push @data, {
  15.         value => $right,
  16.         id    => $id,
  17.         pos   => 'right',
  18.     };
  19.     $id++;
  20. }

  21. # 为保证合并 [1 10] [10 12] 这种情况的区间要求值相等的情况下 'left' < 'right'
  22. @data = sort { $a->{value} <=> $b->{value} or $a->{pos} cmp $b->{pos} } @data;

  23. my $idx = 0;
  24. my @result;

  25. while ($idx < @data) {
  26.     my $left = $data[$idx];
  27.     my %open = ( $left->{id} => 1 ); # 以 left 开始的区间
  28.     for my $i ($idx+1 .. $#data) {
  29.         my $val = $data[$i];
  30.         my $id  = $val->{id};
  31.         if (exists $open{$id}) {
  32.             delete $open{$id};
  33.         } else {
  34.             $open{$id} = 1;
  35.         }
  36.         if (0 == scalar keys %open) { # 不存在没有闭合的区间
  37.             $idx = $i + 1;
  38.             push @result, [$left->{value}, $val->{value}];
  39.             last;
  40.         }
  41.     }
  42. }

  43. print "@$_\n" for @result;

  44. __DATA__
  45. 1    10
  46. 2     8
  47. 3     9
  48. 10   12
  49. 16   40
  50. 19   45
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
7 [报告]
发表于 2013-03-20 14:28 |只看该作者
提供一个awk:
  1. awk 'NR==1{a=$1;b=$2}NR>1{if($1>b){print a,b;a=$1;b=$2}else{if($1<a)a=$1;if($2>b)b=$2}}END{print a,b}'
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-03-20 15:12 |只看该作者
我排过顺序了,所以第一列肯定是从小到大回复 6# zhlong8


   

论坛徽章:
0
9 [报告]
发表于 2013-03-20 20:59 |只看该作者
回复 5# rubyish


    怎么觉得运行结果出乎我的意料了?

论坛徽章:
0
10 [报告]
发表于 2013-03-20 22:10 |只看该作者
回复 5# rubyish


    这是求并集吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP