http://qs321.pair.com?node_id=869609


in reply to Howto count elements within an interval

so like every number you read adds to the count for each incremental 100k bucket? e.g. seeing 202844 on input adds to the count for the bucket for the 200k to 300k range.
you could either write this the old fashioned way testing how many times you can divide by 100k before you go to a result below 1.0. OR the much more fun way is to pre-process the numbers by rounding down to nearest 100k, then drop all the right hand side zeros, and count these (now simple) integers, i.e. every number from 0 to 100k becomes nothing, which (when used in perl number context) becomes zero again, so all these zeros go to first bucket, etc.
the hardest line to type correctly is: stty erase ^H

Replies are listed 'Best First'.
Re^2: Howto count elements within an interval
by bibliophile (Prior) on Nov 05, 2010 at 14:32 UTC
    Just for fun:

    #!/usr/bin/perl use strict; use warnings; my %cnt100kRange; while (<DATA>) { chomp; my ($text, $count) = split; next unless $text =~ /gene/; $cnt100kRange{ substr( sprintf("%06d",$count),0,1) }++; } foreach my $range (sort keys %cnt100kRange) { print "$range: $cnt100kRange{$range}\n"; } __DATA__ gene 3936 gene 7591 gene 13082 gene 23200 gene 32518 gene 45123 gene 57330 gene 62384 gene 66839 gene 71715 gene 83427 gene 90948 gene 87510 gene 96042 gene 106380 gene 108247 gene 109395 gene 120121 gene 138410 gene 143225 gene 147455 gene 152452 gene 155580 gene 158939 gene 163483 gene 167583 gene 178450 gene 181546 gene 184301 gene 193505 gene 190880 gene 199431 gene 202844
      Bibliophile,
      That is the answer to my questions. Also, any advice on getting a better
      grip on the power of hashes?

      Thanks!
      LomSpace