Hi Mighty Monks,

A few months ago, I had to deal with GD. Most GD functions expect the colours to be given as lists of three figures (amounts of red, green and blue, in that order, as I'm sure you had already guessed). I for one preferred to store my colours as numbers in a hash, using the handy 0xnnnnnn notation. I thus needed a function that would take an integer as argument and return the three elements: a good opportunity for a bit of golfing (and obfuscation if you care to...).

The function assumes the arguments is a valid hexa triplet, i.e. an integer between 0 and 0xFFFFFF.

My entry (43 chars only counting within the braces):

sub hexa_triplet { map eval"0x$_",sprintf('%06x',pop)=~/(..)/g }


Replies are listed 'Best First'.
Re: (GOLF) splitting an hexadecimal colour triplet
by wog (Curate) on Jul 05, 2001 at 20:14 UTC

    Much too much code. (Here's one that's 27 chars.)

    sub hexa_triplet { map{($_[0]>>$_)&255}16,8,0 }

    update: Or even another way at 24 chars (like my other one was reduced to by MeowChow) 23 chars:

    sub hexa_triplet { unpack"xC3",pack"N",@_ }

    -- perl -e '$|--;$.=q$.$;while($i!=0){$i=(time-$^T)%60;print"\r".$.x$i}'

      You can write this as (24 chars):
                     s aamecha.s a..a\u$&owag.print

      Clever use of binary bit wog. Misunderstood da question - scratch the rest. Off to wipe egg off face and eat some humble pie. I like the unpack pack too. You can shave a couple to 22 by dropping the quotes:

      sub hexa_triplet { unpack xC3,pack N,pop }




        I think you may have misunderstood the intent of the original subroutine. Given an integer, it should produce a list of three values: red, green, and blue. It does not produce anything like "0000FF"; rather, given 0x0000FF (note the difference, BTW), it should produce the list (0, 0, 255). Which it does.

        Where you say that it is returning 00255; it actually is not. It's returning a list containing (0, 0, 255), and when you print that out, it's getting automatically joined on the empty string, and so you see 00255.

        But the actual usage is like:

        my($red, $green, $blue) = hexa_triplet(0x0000FF);
        And then the $red, $green, and $blue would be passed into GD, since that's what the OP needed this for.