if number is 1-2, 4 or 6-8 or 12-28, 30, 32...

John Machin sjmachin at lexicon.net
Tue Jun 11 16:01:10 CEST 2002


Gustaf Liljegren <gustafl at algonet.se> wrote in message news:<Xns9229EE722467Fgustafl at 195.100.94.182>...
> I'm making a function that takes one integer and returns a boolean that 
> says if the integer matches a number in a certain group of numbers. This 
> group consists of single numbers aswell as ranges spanning thousands of 
> numbers. I'm looking for an elegant way to write this function.
> 

Here's another approach:

=== code =============================

# assume non-negative integers ...

ranges = ((1,2), (4,4), (6,8), (12, 28), (30,30), (32,132))

def load_map(r):
   """Load the bitmap"""
   bigi = 0L
   for lo, hi in r:
      nbits = hi + 1 - lo
      mask = (1L << nbits) - 1
      bigi |= mask << lo
   return bigi

def gustaf(x, bitmap):
   """Return 1 if x is in the bitmap, otherwise 0"""
   return (bitmap & (1L << x)) != 0L
   
def try_it():
   bmap = load_map(ranges)
   for lo, hi in ranges:
      print "testing interval", lo, hi
      previ = -1
      for i in (lo-1, lo, lo+1, (lo+hi)//2, hi-1, hi, hi+1):
         if i > previ:
            previ = i
            print gustaf(i, bmap), i
         
if __name__ == "__main__":
   try_it()

=== output ================================
testing interval 1 2
0 0
1 1
1 2
0 3
testing interval 4 4
0 3
1 4
0 5
testing interval 6 8
0 5
1 6
1 7
1 8
0 9
testing interval 12 28
0 11
1 12
1 13
1 20
1 27
1 28
0 29
testing interval 30 30
0 29
1 30
0 31
testing interval 32 132
0 31
1 32
1 33
1 82
1 131
1 132
0 133
=== bot bait ================================
bignum, long, fast, speed, optimize snot out of

Is the function elegant enough?

Cheers,
John



More information about the Python-list mailing list