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


in reply to Re^2: Perl Golf idea
in thread Perl Golf idea

One character less:
perl -nlE'sub w{[sort/./g]}INIT{$w=w$_=pop}$w~~w&&say' ./dict.txt acer +t
And if you don't mind the (second) argument getting printed, another 3 chars less:
perl -nlE'sub w{[sort/./g]}$w||=w$_=pop;$w~~w&&say' ./dict.txt acert

Replies are listed 'Best First'.
Re^4: Perl Golf idea
by brx (Pilgrim) on May 01, 2012 at 20:58 UTC
    And if you don't mind the (second) argument getting printed, another 3 chars less:
    perl -nlE'sub w{[sort/./g]}$w||=w$_=pop;$w~~w&&say' ./dict.txt acert

    This one is wrong (only) if the first line of 'dict.txt' contains a valid word (different from arg2).

    example:

    $ cat dict.txt one neo noe bad $ perl -nlE'sub w{[sort/./g]}$w||=w$_=pop;$w~~w&&say' ./dict.txt oen oen neo noe

    First word is missing. Anyway, this is a very beautiful version: ++

    UPDATE: with an extra newline

    perl -E'@a=sort pop=~/./g;say grep@a~~[sort/./g],<>' ./dict.txt acert

    UPDATE2: one char useless

    perl -E'@a=sort pop=~/./g;say grep@a~~[sort//g],<>' ./dict.txt acert

      Nice. Here's one that returns the correct output using a few characters less:

      perl -nE'$w//=pop;[sort$w=~/./g]~~[sort//g]&&print' ./dict.txt acert

      or, two characters less than that, but with an extra newline between each word:

      perl -nE'$w//=pop;[sort$w=~/./g]~~[sort//g]&&say' ./dict.txt acert

      UPDATE: shorter version with correct output:

      perl -nlE'$w//=pop;[sort$w=~/./g]~~[sort//g]&&say' ./dict.txt acert

      or, same length, more efficient:

      perl -nlE'($w//=[sort pop=~/./g])~~[sort//g]&&say' ./dict.txt acert