Code Golf is the art of writing the shortest program possible. The less bytes the better. And the competition is just ridiculously strong! Head over to Anarchy Golf if you want to see more!
A good beginner's problem is printing out Pascal's Triangle: Spend a few days to get to 45 bytes. Spend a few months to get to 43 bytes!
Attention: A new golf course has opened at code.golf. Why not give it a try 😉?
10 Ruby Tricks You'll Learn by Playing Code Golf
While code golfing does not necessarily make you a better programmer, you can learn a lot about the programming language you are using. Here are some things that were new to me:
Dirty Interpolation
String interpolation (#{}
) is sometimes possible without using curlies:
"You can directly interpolate #@instance variables, " \
"#@@class variables, and #$global variables!"
I must admit, this can confuse newcomers, but it looks fantastic!
Constant Assignment in Modifiers
It is perfectly legit to use assignments in conditions:
if a = 42
p a
end
# => 42
However, this won't work with the shorter modifier syntax:
p b if b = 42
# NameError: undefined local variable or method `b'...
Unless… you use constants:
p C if C = 42
# => 42
Shebang require
What could possibly be shorter than:
require'json'; require 'yaml'
p JSON,YAML
It's inlined command-line options:
#!ruby -rjson -ryaml
p JSON,YAML
Iterating Input Lines
Finding the shortest way to read user input is a common problem for golfers and solutions vary, depending on how to process the input. My favorite one is to iterate over the input's lines:
$<.each{|e|p e}
Appending Output
puts
and p
are already good candidates to output content. However, sometimes, using <<
on STDOUT
is a tiny bit (or byte) more efficient:
?a.upto(?z){|o|$><<o}
Regex Always Wins
This is one of the golden rules of golfing. Especially, combining the block syntax of gsub
with the perlish regex variables can be very expressive!
"some_string".gsub(/(^|_)(\w)/){$2.upcase}
String#tr
However, it's not true - regexes do not always win. If you need to perform some simple character substitutions, tr is an extremely short (and also clean) way to do so:
# ROT13 Cipher
"Vqvbflapengvp Ehol".tr'a-zA-Z','n-za-mN-ZA-M'
# => "Idiosyncratic Ruby"
One More or Less
In some instances, you cannot use i+1
or i-1
without wrapping them in parenthesis. No problem, unary complement to the rescue:
-~42 # => 43
~-42 # => 41
Flexible Precedence
This is one of my favorites: Explicitly call (.
) operators for alternative precedence semantics:
3*(2+1) #=> 9
3.*2+1 #=> 9
Quick Quit
What's a shorter way to quit a Ruby script than the 4 bytes long exit
method?
1/0
Although this is longer than z
(calling an undefined method), it's often easier to trigger programmatically.
More Idiosyncratic Ruby
- Please Comment on GitHub
- Next Article: Operating Nothing
- Previous Article: File Encoding Magic