in reply to Consolidate ranges (quick and dirty with a cool regexp)

Or, reach for CPAN and Number::Util::Range.
#!/usr/bin/perl use warnings; use strict; use experimental qw( signatures ); use utf8; use Number::Util::Range qw{ convert_number_sequence_to_range }; sub consolidate($s) { my ($name, $range) = $s =~ /(.*):((?:[0-9]+,)+[0-9]+)/g; my @range = split /,/, $range; my $new_range = convert_number_sequence_to_range( array => \@range, min_range_len => 2, separator => '-'); return "$name:" . join ',', @$new_range }
use Test::More tests => 4;

is consolidate('Attacca Quartet:1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28'),
    'Attacca Quartet:1-8,10-20,22-28';

is consolidate('John Patitucci:1,2,3,5,8,11,12,13,14,15,16,17,19,25,26,27,28'),
    'John Patitucci:1-3,5,8,11-17,19,25-28';

is consolidate('Roomful of Teeth:1,3,5,7,9,12,14,16,19,21,24,26,28'),
    'Roomful of Teeth:1,3,5,7,9,12,14,16,19,21,24,26,28';

is consolidate('Sō Percussion:1,3,4,5,6,7,8,11,12,13,14,15,16,18,19,21,22,23,24,25,26,27,28'),
    'Sō Percussion:1,3-8,11-16,18-19,21-28';
map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

Replies are listed 'Best First'.
Re^2: Consolidate ranges (quick and dirty with a cool regexp)
by gpvos (Acolyte) on Oct 29, 2024 at 22:30 UTC

    Absolutely (and definitely when I'd have to write production code!), but using just basic Perl reduces my cognitive load. And that is also why I framed this as a learning experience and marked it quick & dirty. ;-)

    Also good to see the min_range_len option, as I actually don't like ranges of length 2; curious to see the default is 4, I would put it at 3.

    (Hmm, so you can use Unicode in general markup, but not in code blocks. Good to know.)

      If you are up for similar learning experiences then have a browse of the https://theweeklychallenge.org site.

      (Hmm, so you can use Unicode in general markup, but not in code blocks. Good to know.)

      Yes - you too can have hippos in your sig! Generally the rule is always to put code and data within <code>...</code> tags unless it includes utf-8 in which case enclose it in <pre>...</pre> tags instead.


      🦛

Re^2: Consolidate ranges (quick and dirty with a cool regexp)
by sleet (Pilgrim) on Oct 30, 2024 at 10:30 UTC
    You'll find a bunch more if you search for "intspan". I'm partial to Set::IntSpan::Fast.