Chinaunix

标题: 怎么用变量表示一个数组中挨着的两个元素 [打印本页]

作者: 赛萌    时间: 2015-08-24 13:30
标题: 怎么用变量表示一个数组中挨着的两个元素
本帖最后由 赛萌 于 2015-08-24 14:58 编辑

如一个数组@w=qw(1 3 6 8 14 15 21 23)
要求相邻的两个元素相减不超过5的这些元素截到新数组中,得到:
1 3 6 8
14 15
21 23

用perl怎么实现呢
作者: 赛萌    时间: 2015-08-24 15:18
回复 1# 赛萌


    好像就是做一个循环,第一个元素不动,读第二个元素,如果第二个元素减第一个元素小于5,就把第二个元素跟到第一个元素的后面,如果大于5就把第二个元素存到一个新的数组中去,再循环第三个元素,让第三个元素减第二个元素,如果第三个元素减第二个元素小于5,就把第三个元素跟到第二个元素的后面,如果大于5就把第三个元素存到一个新的数组中去,如此循环下去,可以我不会写出变量的形式,
作者: 赛萌    时间: 2015-08-24 15:30
本帖最后由 赛萌 于 2015-08-24 15:46 编辑

回复 1# 赛萌


哦,想错了
作者: MMMIX    时间: 2015-08-24 16:01
本帖最后由 MMMIX 于 2015-08-25 10:30 编辑

回复 2# 赛萌


    基本上直接翻译就可以了:

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. use v5.14;
  5. use Data::Dumper;

  6. sub split_array {
  7.     my ($diff, @arr) = @_;

  8.     my @subarrs;
  9.     while (@arr) {
  10.         my @subarr;
  11.         my $e1 = shift @arr;
  12.         push @subarr, $e1;

  13.         while (@arr) {
  14.             my $e2 = shift @arr;
  15.             if ($e2 - $e1 < $diff) {
  16.                 push @subarr, $e2;
  17.                 $e1 = $e2;
  18.             } else {
  19.                 unshift @arr, $e2;
  20.                 last;
  21.             }
  22.         }
  23.         push @subarrs, \@subarr;
  24.     }

  25.     \@subarrs;
  26. }

  27. my @arr = (1, 3, 6, 8, 14, 15, 21, 23);

  28. print Dumper(split_array 5, @arr);
复制代码

作者: 赛萌    时间: 2015-08-24 17:09
回复 4# MMMIX


    谢谢,请受我三拜!
作者: rubyish    时间: 2015-08-25 02:40
biru:
  1. #!/usr/bin/perl

  2. my @W = qw/1 3 6 8 14 15 21 23/;
  3. my $P = 5;
  4. my @N = [];

  5. for (@W) {
  6.     $_ - ( $N[-1][-1] // $W[0] ) <= $P ? push @{ $N[-1] }, $_ : push @N, [$_];
  7. }

  8. print "@$_\n" for @N;
复制代码

作者: xiaoxingan99    时间: 2015-08-25 09:08
use strict;
use warnings;
my @w=qw(1 3 6 8 14 15 21 23 29);
for (my $i=0;$i<$#w;$i++)
{
        if ($w[$i+1]-$w[$i]<=5)
        {print "$w[$i] ";}
        else
        {print "$w[$i]\n";}
        }
print "$w[-1]";
作者: ttcn_cu    时间: 2015-08-25 11:01
rubyish 发表于 2015-08-25 02:40
biru:


rubyish 绝对是非人类,鉴定完毕
作者: 赛萌    时间: 2015-08-25 12:40
回复 6# rubyish

不太明白$N[-1][-1] //$w[0]?
   
作者: 赛萌    时间: 2015-08-25 12:41
回复 8# ttcn_cu


    嘿嘿,为什么这样说啊
作者: 赛萌    时间: 2015-08-25 13:36
都是牛人!
作者: 赛萌    时间: 2015-08-25 13:46
回复 7# xiaoxingan99


    你这个循环写的好神奇
作者: xiaoxingan99    时间: 2015-08-25 14:41
回复 12# 赛萌


    写代码方面完全是半瓶子水,只会用最笨的方法
作者: 815138698    时间: 2015-08-25 14:44
回复 13# xiaoxingan99


  对于新手来说 大牛的代码可读性一般哈~   最笨的方法不代表不是好方法
作者: MMMIX    时间: 2015-08-25 17:07
815138698 发表于 2015-08-25 14:44
回复 13# xiaoxingan99

对于新手来说 大牛的代码可读性一般哈~


不容易懂 != 可读性差.
作者: 815138698    时间: 2015-08-25 17:22
回复 15# MMMIX


  哈哈   大牛们别见怪哈   
新手确实很不容易读懂   得吭哧吭哧的研究很久   学习的道路还很长
作者: 清泉一边    时间: 2015-08-25 17:54
感觉这个写法是不严谨的,例如@w=qw(1 3 6 8 14 15 21 23 29 89);  就不能正确输出结果了。回复 7# xiaoxingan99


   
作者: 赛萌    时间: 2015-08-25 21:17
回复 17# 清泉一边


    我一开始也觉得不严谨,所以认真的看了好半天,最后觉得是正确的呢,
作者: 清泉一边    时间: 2015-08-25 21:27
本帖最后由 清泉一边 于 2015-08-25 21:27 编辑

你这样验证一下,是不对的:
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my @w=qw(1 3 6 8 14 15 21 23 29 89);
  4. for (my $i=0;$i<$#w;$i++)
  5. {
  6.         if ($w[$i+1]-$w[$i]<=5)
  7.         {print "$w[$i] ";}
  8.         else
  9.         {print "$w[$i]\n";}
  10. }
  11. print "$w[-1]";


  12. 结果:


  13. 1 3 6 8
  14. 14 15
  15. 21 23
  16. 29
  17. 89
复制代码
[/code]回复 18# 赛萌


   
作者: xiaoxingan99    时间: 2015-08-26 08:50
回复 19# 清泉一边


    要的不就是这样的结果么?大于5换行么
作者: 赛萌    时间: 2015-08-26 09:25
回复 19# 清泉一边


    对的啊,要的就是 这样的结果
作者: 赛萌    时间: 2015-08-26 09:30
回复 15# MMMIX


    对的对的,牛牛
作者: swspj    时间: 2015-08-26 10:13
好贴水一水
91b2b.com/news/201508/25/1816317.html

作者: sunzhiguolu    时间: 2016-03-08 15:25
回复 7# xiaoxingan99
思路非常棒, 要是最后一句能够放进 for 循环就更完美了!

   
作者: stanley_tam    时间: 2016-03-08 18:49
同意 回复 9# 赛萌


   
作者: stanley_tam    时间: 2016-03-08 18:50
大神,你可以更短的
$_ - ( $N[-1][-1] // $W[0] )  <= 5 ? push @{ $N[-1] }, $_ : push @N, [$_] for @W;
回复 6# rubyish


   
作者: RE_HASH    时间: 2016-03-09 02:06
## Using RE:
$_ = "1 3 6 8 14 15 21 23 29 89";
s/(\d+) (?=(\d+))/{( $2 - $1 <= 5  ) ? "$1 " : "$1\n"}/eg;
print;




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2