This problem interested me in the sense that the data could be stored as ordered pairs. I was curious if a function could be written to efficiently process these data as ordered pairs. I didn't worry as much about possible variable output, though if someone thinks of a way to use a map to generate the final output (so that output could handle arbitrary data ranges) I'd be curious.
My solution is:
#!/usr/bin/perl
use warnings;
use strict;
package main;
my %ranges = ();
while (<DATA>) {
my ( $key, $initial_value, $final_value ) = split /\s+/, $_;
push @{$ranges{$key}}, [ $initial_value, $final_value ];
}
my @headers = (1, 2, 3, 5, 7, 10, 11, 15, 20);
my @keys = ( 'A', 'B', 'C', 'D' );
my $value = sprintf "ID %2d %2d %2d %2d %2d %2d %2d %2d %2d\n", @heade
+rs;
print $value;
foreach my $k (@keys) {
my @results = map { &in_range($k, $_) } @headers;
$value = sprintf "%-2s %2d %2d %2d %2d %2d %2d %2d %2d %2d\n", $k,
+ @results;
print $value;
}
sub in_range {
my $letter = shift;
my $test_value = shift;
if ( defined( $ranges{$letter} )) {
foreach my $ref ( @{$ranges{$letter}} ) {
if (($ref->[0] <= $test_value) &&
($ref->[1] >= $test_value)) {
return 1;
}
}
}
return 0;
}
__DATA__
A 1 2
A 7 10
A 15 20
B 3 5
B 11 15
C 5 10
D 10 20
and the output is:
~/perl/monks$ ./ranges.pl
ID 1 2 3 5 7 10 11 15 20
A 1 1 0 0 1 1 0 1 1
B 0 0 1 1 0 0 1 1 0
C 0 0 0 1 1 1 0 0 0
D 0 0 0 0 0 1 1 1 1
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.