亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

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# 賽萌


    好像就是做一個循環(huán),第一個元素不動,讀第二個元素,如果第二個元素減第一個元素小于5,就把第二個元素跟到第一個元素的后面,如果大于5就把第二個元素存到一個新的數組中去,再循環(huán)第三個元素,讓第三個元素減第二個元素,如果第三個元素減第二個元素小于5,就把第三個元素跟到第二個元素的后面,如果大于5就把第三個元素存到一個新的數組中去,如此循環(huán)下去,可以我不會寫出變量的形式,
作者: 賽萌    時間: 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 發(fā)表于 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


    你這個循環(huán)寫的好神奇
作者: xiaoxingan99    時間: 2015-08-25 14:41
回復 12# 賽萌


    寫代碼方面完全是半瓶子水,只會用最笨的方法
作者: 815138698    時間: 2015-08-25 14:44
回復 13# xiaoxingan99


  對于新手來說 大牛的代碼可讀性一般哈~   最笨的方法不代表不是好方法
作者: MMMIX    時間: 2015-08-25 17:07
815138698 發(fā)表于 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 循環(huán)就更完美了!

   
作者: 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://www.72891.cn/) Powered by Discuz! X3.2