#!/usr/bin/perl # Usage: chompie.pl run_script orig_program dest_program # # run_script is passed the name of the program to run. It can then filter the # results as appropriate. use strict; use File::Slurp; use POSIX qw(ceil); my ($run_filename, $src_filename, $dest_filename) = @ARGV; my @src = read_file($src_filename); write_file($dest_filename, @src); my $target = `$run_filename "$dest_filename" 2>&1`; print "BEGIN_TARGET\n$target\nEND_TARGET\n"; my $num_lines = $#src; print "src rows: $num_lines\n"; # test the file sub test_file { my ($run_filename, $dest_filename, $target, @cur_src) = @_; write_file($dest_filename, @cur_src); print "."; my $result = `$run_filename "$dest_filename" 2>&1`; return ($target eq $result); } # Single Line Chopping my $current_lines; do { $current_lines = scalar @src; KILLEH: for my $width (1..(scalar @src)) { for(my $i = 0; $i < $current_lines; $i++) { my (@chopped_src) = @src; splice @chopped_src, $i, $width; if(test_file($run_filename, $dest_filename, $target, @chopped_src)) { print "\nChopped $width lines at $i\n"; @src = @chopped_src; last KILLEH; } } } } until($current_lines == (scalar @src)); write_file($dest_filename, @src); print "\nDone! Eliminated " . ($num_lines - @src) . " lines!\n"; =pod # Binary Tree Chopping my $depth = 1; while($num_lines / (2**$depth) >= 1) { my $chunk_size = int ($num_lines / (2**$depth)); my $chunk_count = ceil($num_lines / $chunk_size); print "Depth: $depth\tchunk_size: $chunk_size\tchunk_count: $chunk_count\n"; foreach my $bitmask (1 .. ((2**$chunk_count)-2)) { my @cur_src; foreach my $line_num (0 .. $num_lines) { my $chunk_num = int ($line_num / $chunk_size); if($bitmask & (2**$chunk_num)) { push @cur_src, $src[$line_num]; } } printf "----($chunk_size | $bitmask (%b))----\n".(join'',@cur_src), $bitmask; # test the file # if it passes, use @cur_src as @src and go to zero depth if(test_file($run_filename, $dest_filename, $target, @cur_src)) { print "Keeping new version!\n"; $depth = 0; @src = @cur_src; $num_lines = $#src; last; } } $depth++; } =cut