#!/usr/bin/perl # http://perlmonks.org/?node_id=1169432 use strict; use warnings; my ($answer, $letters); while() { my ( $let, $start, $end) = /(?:(\w) )?(\d+)-(\d+)/; if( $let ) { $letters |= "\0" x $start . $let x ($end - $start + 1); } else { $_ = $letters & "\0" x $start . "\xff" x ($end - $start + 1); $answer .= "$1 $-[0]-" . ($+[0] - 1) . "\n" while /(\w)\1*/g; } } 1 while $answer =~ s/^(\w).*\K\n\1 /,/gm; print $answer; __END__ a 11-23 b 33-39 c 40-45 d 48-58 1-34 35-39 40-42 43-49 51-59 62-90