#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
while (<DATA>) {
my $last_diff;
my $start = $numbers[0];
my @all_series;
for my $i (1 .. $#numbers + 1) {
my $diff;
if ($i < $#numbers + 1) {
$diff = $numbers[$i] - $numbers[ $i - 1 ];
}
# Merge with the last number from the previous series if needed:
if (!$last_diff # Just starting a new series.
and $i > 2 # Far enough to have preceding numbers.
and $diff and $diff == $numbers[ $i - 1 ] - $numbers[ $i - 2 ]
) {
$all_series[-1]{end} = $numbers[ $i - 3 ];
$all_series[-1]{offset} = 0 if $all_series[-1]{start} == $all_series[-1]{end};
$start = $numbers[ $i - 2 ];
}
if (! $diff or ( $last_diff && ($last_diff != $diff)) ) {
push @all_series, { start
=> $start, end => $numbers[ $i - 1 ],
offset => $last_diff,
};
$start = $numbers[$i];
}
$last_diff = $diff;
}
print Dumper
\@all_series; }
__END__
1,2,3,10,12,14
1,2,3,5,7
1,7,8,9
1,2,3,7,8,11,13,15,22,100,150,200
2,3,5,8,13,21,34,55,89
1,2,3,9,10,12,14,15,20,25
IyEvdXNyL2Jpbi9wZXJsCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGF0YTo6RHVtcGVyOwoKd2hpbGUgKDxEQVRBPikgewogICAgY2hvbXA7CgogICAgbXkgQG51bWJlcnMgPSBzcGxpdCAnLCc7CiAgICBwcmludCAiKEBudW1iZXJzKVxuIjsKCiAgICBteSAkbGFzdF9kaWZmOwogICAgbXkgJHN0YXJ0ID0gJG51bWJlcnNbMF07CiAgICBteSBAYWxsX3NlcmllczsKICAgIGZvciBteSAkaSAoMSAuLiAkI251bWJlcnMgKyAxKSB7CiAgICAgICAgbXkgJGRpZmY7CiAgICAgICAgaWYgKCRpIDwgJCNudW1iZXJzICsgMSkgewogICAgICAgICAgICAkZGlmZiA9ICRudW1iZXJzWyRpXSAtICRudW1iZXJzWyAkaSAtIDEgXTsKICAgICAgICB9CgogICAgICAgICMgTWVyZ2Ugd2l0aCB0aGUgbGFzdCBudW1iZXIgZnJvbSB0aGUgcHJldmlvdXMgc2VyaWVzIGlmIG5lZWRlZDoKICAgICAgICBpZiAoISRsYXN0X2RpZmYgIyBKdXN0IHN0YXJ0aW5nIGEgbmV3IHNlcmllcy4KICAgICAgICAgICAgYW5kICRpID4gMiAgIyBGYXIgZW5vdWdoIHRvIGhhdmUgcHJlY2VkaW5nIG51bWJlcnMuCiAgICAgICAgICAgIGFuZCAkZGlmZiBhbmQgJGRpZmYgPT0gJG51bWJlcnNbICRpIC0gMSBdIC0gJG51bWJlcnNbICRpIC0gMiBdCiAgICAgICAgICAgKSB7CiAgICAgICAgICAgICRhbGxfc2VyaWVzWy0xXXtlbmR9ID0gJG51bWJlcnNbICRpIC0gMyBdOwogICAgICAgICAgICAkYWxsX3Nlcmllc1stMV17b2Zmc2V0fSA9IDAgaWYgJGFsbF9zZXJpZXNbLTFde3N0YXJ0fSA9PSAkYWxsX3Nlcmllc1stMV17ZW5kfTsKICAgICAgICAgICAgJHN0YXJ0ID0gJG51bWJlcnNbICRpIC0gMiBdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgJGRpZmYgb3IgKCAkbGFzdF9kaWZmICYmICgkbGFzdF9kaWZmICE9ICRkaWZmKSkgKSB7CiAgICAgICAgICAgIHB1c2ggQGFsbF9zZXJpZXMsIHsgc3RhcnQgID0+ICRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgICAgPT4gJG51bWJlcnNbICRpIC0gMSBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9PiAkbGFzdF9kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAkc3RhcnQgPSAkbnVtYmVyc1skaV07CiAgICAgICAgICAgIHVuZGVmICRkaWZmOwogICAgICAgIH0KICAgICAgICAkbGFzdF9kaWZmID0gJGRpZmY7CiAgICB9CgogICAgcHJpbnQgRHVtcGVyIFxAYWxsX3NlcmllczsKICAgIHByaW50ICJcbiI7Cn0KCl9fRU5EX18KMSwyLDMsMTAsMTIsMTQKMSwyLDMsNSw3CjEsNyw4LDkKMSwyLDMsNyw4LDExLDEzLDE1LDIyLDEwMCwxNTAsMjAwCjIsMyw1LDgsMTMsMjEsMzQsNTUsODkKMSwyLDMsOSwxMCwxMiwxNCwxNSwyMCwyNQo=
(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
}
];