use strict;
use warnings;
use Algorithm::Diff qw( );
my @seqs = (
[qw( A B C D E F G H I )],
[qw( A D C X F G H I )],
# [qw( A )],
# [qw( A B C )],
);
my @combined;
my @grid;
for my $col_idx (0..$#seqs) {
my $seq = $seqs[$col_idx];
my $diff = Algorithm::Diff->new(\@combined, $seq);
my @new_combined;
my @new_grid;
while ($diff->Next()) {
if ($diff->Same()) {
for ($diff->Range(1)) {
push @new_combined, $combined[$_];
push @new_grid, $grid[$_];
$new_grid[-1][$col_idx] = 1;
}
} else {
for ($diff->Range(1)) {
push @new_combined, $combined[$_];
push @new_grid, $grid[$_];
}
for ($diff->Range(2)) {
push @new_combined, $seq->[$_];
push @new_grid, [];
$new_grid[-1][$col_idx] = 1;
}
}
}
@combined = @new_combined;
@grid = @new_grid;
}
for my $row_idx (0..$#combined) {
my $ch = $combined[$row_idx];
for my $col_idx (0..$#seqs) {
print($grid[$row_idx][$col_idx] ? $ch : " ", " ");
}
print("\n");
}
####
A A
B
C
D D
E
C
X
F F
G G
H H
I I
####
A A
B B
C C
D
X
E
F F
G G
H H
I I