Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Perl Golf

ynonperek
April 09, 2012

Perl Golf

An introduction to golfind

ynonperek

April 09, 2012
Tweet

More Decks by ynonperek

Other Decks in Programming

Transcript

  1. Let’s Golf
    Thursday, May 3, 12

    View full-size slide

  2. About Me
    • Ynon Perek
    • http://ynonperek.com
    • http://speakerdeck.com/u/
    ynonperek
    Thursday, May 3, 12

    View full-size slide

  3. The Game
    A Competition to find the
    shortest — fewest keystrokes
    perl code to solve a given
    problem
    Thursday, May 3, 12

    View full-size slide

  4. The Rules
    • Count keystrokes
    (newlines matter)
    • No modules
    • No external tools
    Thursday, May 3, 12

    View full-size slide

  5. Why Golf ?
    Thursday, May 3, 12

    View full-size slide

  6. Example: Head
    use strict;
    use warnings;
    use v5.14;
    my $counter = 0;
    while (<>) {
    $counter += 1;
    print;
    last if $counter > 10;
    }
    Thursday, May 3, 12

    View full-size slide

  7. We Can Do Better
    while (<>) {
    print;
    last if $. > 10;
    }
    Thursday, May 3, 12

    View full-size slide

  8. Yet a golfer would
    • Remember perl opts: -pe
    • Remember range operator
    Thursday, May 3, 12

    View full-size slide

  9. Yet a golfer would
    #!/usr/bin/perl -pe
    last if $. > 10
    Thursday, May 3, 12

    View full-size slide

  10. Yet a golfer would
    perl -pe '11..exit'
    Thursday, May 3, 12

    View full-size slide

  11. And a true golfer...
    perl -pe '11..&'
    Thursday, May 3, 12

    View full-size slide

  12. Some More Tricks
    • y///c Abigail’s length horror
    • $_ x= Larry’s boolean
    • }{ Abigail’s END for -pe
    • $\ Van-der Pijll print
    Thursday, May 3, 12

    View full-size slide

  13. Challenge
    • Use previous tricks to print:
    • characters count
    • words count
    • line count
    Thursday, May 3, 12

    View full-size slide

  14. Challenge
    # Characters count
    perl -lpe '$\+=y///c}{'
    # Words count
    perl -lpe '$\+=split}{'
    # Lines count
    perl -pe '$\=$.}{'
    Thursday, May 3, 12

    View full-size slide

  15. Example: tail
    • Tail is harder, because we need to
    remember previous lines
    • Can use an array
    Thursday, May 3, 12

    View full-size slide

  16. Example: tail
    # tail using an array
    perl -e '@a=<>;print @a[-10..-1]'
    Thursday, May 3, 12

    View full-size slide

  17. Example: tail
    # Removing the array
    perl -e 'print ((<>)[-10..-1])'
    Thursday, May 3, 12

    View full-size slide

  18. Example: tail
    # Removing the array
    perl -e 'print ((<>)[-10..-1])'
    Surprisingly, A true hacker can do better
    Thursday, May 3, 12

    View full-size slide

  19. Example: tail
    # Recall the ~
    perl -e 'print+(<>)[~9..-1]'
    Surprisingly, A true hacker can do better
    Thursday, May 3, 12

    View full-size slide

  20. Some More Tricks
    • $= Holds only int values.
    $==10/3 is the same as int(10/3)
    • $- Holds only positive values
    Thursday, May 3, 12

    View full-size slide

  21. Example: $-
    perl -pe '$-=eval or&'
    10+20
    20+3
    30-10
    40-50
    -5
    1
    4
    5
    Thursday, May 3, 12

    View full-size slide

  22. Golf Classics
    • Find all anagrams in a word list.
    • An anagram is two words made up of
    the same letters
    • Example: underflow - wonderful
    Thursday, May 3, 12

    View full-size slide

  23. Anagrams
    #!/usr/bin/perl
    sub normalized {
    my ($word) = @_;
    my @letters = split //, $word;
    return join '', sort @letters;
    }
    while (<>) {
    chomp;
    my $letters = normalized( $_ );
    $words{ $letters } ||= [];
    push $words{ $letters }, $_;
    }
    print "@$_\n" for grep { @$_ > 1} values %words;
    Thursday, May 3, 12

    View full-size slide

  24. Anagrams
    • Remove the sub
    • Prefer text over array-refs
    • Prefer switches over code
    • Use short variable names
    Thursday, May 3, 12

    View full-size slide

  25. Anagrams
    #!/usr/bin/perl -ln
    $w{ join '', sort split // } .= "$_ ";
    }{ print for grep / ./, values %w;
    Thursday, May 3, 12

    View full-size slide

  26. Anagrams
    • No need to join hash keys
    • Can use regexp instead of split
    • Can use regexp instead of grep
    • Can use %h instead of values %h
    Thursday, May 3, 12

    View full-size slide

  27. Anagrams
    #!/usr/bin/perl -ln
    $w{ 1, sort/./g } .= "$_ ";
    }{/ ./&&print for %w;
    Thursday, May 3, 12

    View full-size slide

  28. Golf Classic
    sub
    b{[@b=(abs||No,bottle."s"x!!++$_,of,beer),on,the,wall]}
    print
    "@{+b},\n@b,\nTake one down, pass it around,\n@{+b}.\n"
    for-pop||-99..-1
    99 bottles of beer on the wall,
    99 bottles of beer,
    Take one down, pass it around,
    98 bottles of beer on the wall.
    Thursday, May 3, 12

    View full-size slide

  29. Non-perl Golf
    • http://vimgolf.com/
    • http://codegolf.com/
    Thursday, May 3, 12

    View full-size slide

  30. What’s Next
    • Go to
    http://
    terje2.frox25.no-
    ip.org/
    • Download the book
    Thursday, May 3, 12

    View full-size slide