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

  2. About Me • Ynon Perek • http://ynonperek.com • http://speakerdeck.com/u/ ynonperek

    Thursday, May 3, 12
  3. The Game A Competition to find the shortest — fewest

    keystrokes perl code to solve a given problem Thursday, May 3, 12
  4. The Rules • Count keystrokes (newlines matter) • No modules

    • No external tools Thursday, May 3, 12
  5. Why Golf ? Thursday, May 3, 12

  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
  7. We Can Do Better while (<>) { print; last if

    $. > 10; } Thursday, May 3, 12
  8. Yet a golfer would • Remember perl opts: -pe •

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

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

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

    12
  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
  13. Challenge • Use previous tricks to print: • characters count

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

    perl -lpe '$\+=split}{' # Lines count perl -pe '$\=$.}{' Thursday, May 3, 12
  15. Example: tail • Tail is harder, because we need to

    remember previous lines • Can use an array Thursday, May 3, 12
  16. Example: tail # tail using an array perl -e '@a=<>;print

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

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

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

    A true hacker can do better Thursday, May 3, 12
  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
  21. Example: $- perl -pe '$-=eval or&' 10+20 20+3 30-10 40-50

    -5 1 4 5 Thursday, May 3, 12
  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
  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
  24. Anagrams • Remove the sub • Prefer text over array-refs

    • Prefer switches over code • Use short variable names Thursday, May 3, 12
  25. Anagrams #!/usr/bin/perl -ln $w{ join '', sort split // }

    .= "$_ "; }{ print for grep / ./, values %w; Thursday, May 3, 12
  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
  27. Anagrams #!/usr/bin/perl -ln $w{ 1, sort/./g } .= "$_ ";

    }{/ ./&&print for %w; Thursday, May 3, 12
  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
  29. Non-perl Golf • http://vimgolf.com/ • http://codegolf.com/ Thursday, May 3, 12

  30. What’s Next • Go to http:// terje2.frox25.no- ip.org/ • Download

    the book Thursday, May 3, 12