fork download
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use Data::Dumper;
  7.  
  8. while (<DATA>) {
  9.  
  10. my @numbers = split ',';
  11. print "(@numbers)\n";
  12.  
  13. my $last_diff;
  14. my $start = $numbers[0];
  15. my @all_series;
  16. for my $i (1 .. $#numbers + 1) {
  17. my $diff;
  18. if ($i < $#numbers + 1) {
  19. $diff = $numbers[$i] - $numbers[ $i - 1 ];
  20. }
  21.  
  22. # Merge with the last number from the previous series if needed:
  23. if (!$last_diff # Just starting a new series.
  24. and $i > 2 # Far enough to have preceding numbers.
  25. and $diff and $diff == $numbers[ $i - 1 ] - $numbers[ $i - 2 ]
  26. ) {
  27. $all_series[-1]{end} = $numbers[ $i - 3 ];
  28. $all_series[-1]{offset} = 0 if $all_series[-1]{start} == $all_series[-1]{end};
  29. $start = $numbers[ $i - 2 ];
  30. }
  31.  
  32. if (! $diff or ( $last_diff && ($last_diff != $diff)) ) {
  33. push @all_series, { start => $start,
  34. end => $numbers[ $i - 1 ],
  35. offset => $last_diff,
  36. };
  37. $start = $numbers[$i];
  38. undef $diff;
  39. }
  40. $last_diff = $diff;
  41. }
  42.  
  43. print Dumper \@all_series;
  44. print "\n";
  45. }
  46.  
  47. __END__
  48. 1,2,3,10,12,14
  49. 1,2,3,5,7
  50. 1,7,8,9
  51. 1,2,3,7,8,11,13,15,22,100,150,200
  52. 2,3,5,8,13,21,34,55,89
  53. 1,2,3,9,10,12,14,15,20,25
  54.  
Success #stdin #stdout 0.03s 5088KB
stdin
Standard input is empty
stdout
(1 2 3 10 12 14)
$VAR1 = [
          {
            'offset' => 1,
            'end' => 3,
            'start' => '1'
          },
          {
            'offset' => 2,
            'end' => 14,
            'start' => 10
          }
        ];

(1 2 3 5 7)
$VAR1 = [
          {
            'offset' => 1,
            'end' => 2,
            'start' => 1
          },
          {
            'offset' => 2,
            'end' => 7,
            'start' => 3
          }
        ];

(1 7 8 9)
$VAR1 = [
          {
            'offset' => 0,
            'end' => 1,
            'start' => 1
          },
          {
            'offset' => 1,
            'end' => 9,
            'start' => 7
          }
        ];

(1 2 3 7 8 11 13 15 22 100 150 200)
$VAR1 = [
          {
            'offset' => 1,
            'end' => 3,
            'start' => '1'
          },
          {
            'offset' => 1,
            'end' => 8,
            'start' => 7
          },
          {
            'offset' => 2,
            'end' => 15,
            'start' => 11
          },
          {
            'offset' => 0,
            'end' => 22,
            'start' => 22
          },
          {
            'offset' => 50,
            'end' => 200,
            'start' => 100
          }
        ];

(2 3 5 8 13 21 34 55 89)
$VAR1 = [
          {
            'offset' => 1,
            'end' => 3,
            'start' => '2'
          },
          {
            'offset' => 3,
            'end' => 8,
            'start' => 5
          },
          {
            'offset' => 8,
            'end' => 21,
            'start' => 13
          },
          {
            'offset' => 21,
            'end' => 55,
            'start' => 34
          },
          {
            'offset' => undef,
            'end' => 89,
            'start' => 89
          }
        ];

(1 2 3 9 10 12 14 15 20 25)
$VAR1 = [
          {
            'offset' => 1,
            'end' => 3,
            'start' => '1'
          },
          {
            'offset' => 0,
            'end' => 9,
            'start' => 9
          },
          {
            'offset' => 2,
            'end' => 14,
            'start' => 10
          },
          {
            'offset' => 5,
            'end' => 25,
            'start' => 15
          }
        ];