in reply to construct a matrix by different intervals

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

Replies are listed 'Best First'.
Re^2: construct a matrix by different intervals
by mozart (Initiate) on Aug 20, 2007 at 13:06 UTC
    Thanks for you all Guys,
    This was of great help.
    Mozart