免费注册 查看新帖 |

Chinaunix

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

已解决:求一列非连续的数字的连续的区间,想了一天,实在想不出,求大家帮帮忙 [复制链接]

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-22 10:34 |只看该作者 |倒序浏览
本帖最后由 54red 于 2015-09-23 09:24 编辑

我有一组数据,如下面的格式,第一列相同,第三列大于5,求第二列的连续区间,输出是一段一段的小区间,实在是想不出怎么写这个程序,求大家帮帮忙!
A        74851        1
A        74852        1
A        375904        6
A        375905        6
A        375906        7
A        375907        7
A        375908        7
A        375909        7
A        375910        7
A        375911        7
A        375912        7
B        29172057        19
B        29172058        19
B        29172059        19
B        29172060        19
B        29172061        19
B        29172062        19
B        29172063        19
B        29172064        19
B        29172065        19
B        29172066        19
B        29216088        1
B        29216089        1

结果是:
A        375904        375912
B        29172057        29172066

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-09-22 11:01 |只看该作者
这种问题要出现多少次才算是个头?

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
3 [报告]
发表于 2015-09-22 11:38 |只看该作者
我承认我的问题太多了!可能在您看来确实又很简单。回复 2# MMMIX


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-09-22 13:12 |只看该作者
回复 3# 54red


    先不说这个问题简单复杂,关键是它在 Perl 版已经被反复提问和回答了好多遍,你在这时间也不短了,干吗还要再问一次?

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
5 [报告]
发表于 2015-09-22 14:10 |只看该作者
大神,请你理解一下我这样的菜鸟,任务急,时间紧,被逼无奈啊,真没见到类似的问题,既然出现过,我去找找看,再次谢谢你之前对我的帮忙。回复 4# MMMIX


   

论坛徽章:
0
6 [报告]
发表于 2015-09-22 14:52 |只看该作者
output
  1. A        375904        375906
  2. A        375908        375912
  3. B        29172057        29172063
  4. B        29172065        29172066
复制代码
data structure @Z
  1. [
  2. [ A, [ 375904, 375906 ], [ 375908, 375912 ], [ 375917 ], [ 375919 ] ],
  3. [ B, [ 29172057, 29172063 ], [ 29172065, 29172066 ] ]
  4. ]
复制代码
code

  1. use 5.010;
  2. my ( $X, $Y, @Z ) = '';

  3. while (<DATA>) {
  4.     my ( $x, $y, $z ) = split;
  5.     next if $z <= 5;

  6.     $X ne $x
  7.         ? push @Z, [ $X = $x, [$y] ]
  8.         : $y - $Y == 1
  9.             ? ( $Z[-1][-1][1] = $y )
  10.             : push @{ $Z[-1] }, [$y];

  11.     $Y = $y;
  12. }

  13. for (@Z) {
  14.     my ( $x, @y ) = @$_;
  15.     @$_ > 1 and say join "\t", $x, @$_ for @y;
  16. }

  17. __DATA__
  18. A        74851        1
  19. A        74852        1
  20. A        375904        6
  21. A        375905        6
  22. A        375906        7
  23. A        375908        7
  24. A        375909        7
  25. A        375910        7
  26. A        375911        7
  27. A        375912        7
  28. A        375917        7
  29. A        375919        7
  30. B        29172057        19
  31. B        29172058        19
  32. B        29172059        19
  33. B        29172060        19
  34. B        29172061        19
  35. B        29172062        19
  36. B        29172063        19
  37. B        29172065        19
  38. B        29172066        19
  39. B        29216088        1
  40. B        29216089        1
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
54red + 10 再次感谢!

查看全部评分

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
7 [报告]
发表于 2015-09-22 16:03 |只看该作者
谢谢你了,程序写的太好了, 回复 6# Okelani


   

论坛徽章:
0
8 [报告]
发表于 2015-09-30 14:08 |只看该作者
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;

  4. my ($last_column_1, $last_column_2, $first_column_2)=('','','');

  5. while(<DATA>)
  6. {
  7.     my @line=split(/\s+/);

  8.     if($line[2]>5)
  9.     {

  10.        if($last_column_1 eq $line[0] && $line[1] == $last_column_2+1)
  11.        {
  12.            $last_column_2 = $line[1];
  13.        }
  14.        elsif($last_column_1 ne $line[0] or $line[1] != $last_column_2)
  15.        {
  16.            print $last_column_1, " "x5, $first_column_2, " "x5, $last_column_2, "\n";
  17.            $last_column_1 = $line[0];
  18.            $last_column_2 = $line[1];
  19.            $first_column_2 = $line[1];
  20.        }
  21.     }

  22. }

  23. print $last_column_1, " "x5, $first_column_2, " "x5, $last_column_2, "\n";

  24. __DATA__
  25. A        74851        1
  26. A        74852        1
  27. A        375904        6
  28. A        375905        6
  29. A        375906        7
  30. A        375908        7
  31. A        375909        7
  32. A        375910        7
  33. A        375911        7
  34. A        375912        7
  35. A        375917        7
  36. A        375919        7
  37. B        29172057        19
  38. B        29172058        19
  39. B        29172059        19
  40. B        29172060        19
  41. B        29172061        19
  42. B        29172062        19
  43. B        29172063        19
  44. B        29172065        19
  45. B        29172066        19
  46. B        29216088        1
  47. B        29216089        1
复制代码

论坛徽章:
0
9 [报告]
发表于 2015-09-30 14:11 |只看该作者
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;

  4. my ($last_column_1, $last_column_2, $first_column_2, $count)=('','','',0);

  5. while(<DATA>)
  6. {
  7.     my @line=split(/\s+/);

  8.     if($line[2]>5)
  9.     {

  10.        if($last_column_1 eq $line[0] && $line[1] == $last_column_2+1)
  11.        {
  12.            $last_column_2 = $line[1];
  13.            $count++;
  14.        }
  15.        elsif($last_column_1 ne $line[0] or $line[1] != $last_column_2)
  16.        {   
  17.            print $last_column_1, " "x5, $first_column_2, " "x5, $last_column_2, "\n" if $count>0;
  18.            $last_column_1 = $line[0];
  19.            $last_column_2 = $line[1];
  20.            $first_column_2 = $line[1];
  21.            $count = 0
  22.        }
  23.     }

  24. }

  25. print $last_column_1, " "x5, $first_column_2, " "x5, $last_column_2, "\n";

  26. __DATA__
  27. A        74851        1
  28. A        74852        1
  29. A        375904        6
  30. A        375905        6
  31. A        375906        7
  32. A        375908        7
  33. A        375909        7
  34. A        375910        7
  35. A        375911        7
  36. A        375912        7
  37. A        375917        7
  38. A        375919        7
  39. B        29172057        19
  40. B        29172058        19
  41. B        29172059        19
  42. B        29172060        19
  43. B        29172061        19
  44. B        29172062        19
  45. B        29172063        19
  46. B        29172065        19
  47. B        29172066        19
  48. B        29216088        1
  49. B        29216089        1
复制代码
稍做修改

评分

参与人数 1信誉积分 +10 收起 理由
54red + 10 多谢!学习了!

查看全部评分

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
10 [报告]
发表于 2015-10-08 12:48 |只看该作者
谢谢啦!程序很赞!回复 9# xie3ks


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP