Pro Yearly is on sale from $80 to $50! »

Perl Golf

82fe3950bdbb0b1048e870fa04c89cfd?s=47 ynonperek
April 09, 2012

Perl Golf

An introduction to golfind

82fe3950bdbb0b1048e870fa04c89cfd?s=128

ynonperek

April 09, 2012
Tweet

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