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

In reply to Re: construct a matrix by different intervals by dwm042
in thread construct a matrix by different intervals by mozart

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • 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:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.