use 5.20.0; use List::AllUtils qw/ reduce part /; my $e = <>; chomp $e; my @commands = map { ord } split '', $e; #pop @commands; push @commands, 17, 31, 73, 47, 23; my $skip = 0; my $i = 0; my @array = 0..255; for ( 1..64 ) { for my $c ( @commands ) { @array[0..$c-1] = @array[ reverse 0..$c-1]; push @array, shift @array for 1..$c + $skip++; $i += $c + $skip-1; } } unshift @array, pop @array for 1..($i%@array); say "@array"; my $j; my @grouped = map { reduce { $a ^ $b } @$_ } part { $j++ / 16 } @array; use DDP; p @grouped; say map { sprintf "%02x", $_ } @grouped;