http://www.perlmonks.org?node_id=330174


in reply to Re: Competition fuels obsession over Perl [golf]
in thread Competition fuels obsession over Perl

3 strokes sh?aved.

#!perl -aln $$_=y/aAeEiIoOuU//for@F;print"$$_ $_"for sort{$$b-$$a||$a cmp$b}@F

Using a G-R transform (and assuming less than 9 vowels per word) saves 8 more.

#!perl -an print+map{/./;9-$&.$'}sort map{9- y/aAeEiIoOuU//." $_\n"}@F

/-\

Replies are listed 'Best First'.
Re: Re: Re: Competition fuels obsession over Perl [golf]
by educated_foo (Vicar) on Feb 19, 2004 at 16:56 UTC
    Oh, man I'm rusty. Here are a few minor tweaks. For the full version, one less:
    $$_=lc=~y/aeiou//for@F;print"$$_ $_"for sort{$$b-$$a||$a cmp$b}@F
    For the "less than ten vowels" version, you can also lose one by getting rid of that space after the "map{9-".

    Finally, if they meant increasing order of vowel count and less than nine vowels, then we can do much better ;)

    -an print sort map y/aAeEiIoOuU//." $_\n",@F

      For the "less than ten vowels" version, you can also lose one by getting rid of that space after the "map{9-".

      Alas, Perl complains with Unrecognized file test: -y if you try that. However, using your lc trick saves two more strokes:

      print+map{/./;9-$&.$'}sort map{9-lc=~y/aeiou//." $_\n"}@F

      You could allow up to 90 vowels (at the cost of 3 strokes) by changing 9 to 99 and . to ..

        Hm... "9-y///" works fine on 5.8.3 for me, while 5.6.0 chokes. Nothing jumps out at me in perldelta, but it does mention that parsing of m// has changed.