Les bases du golfing en Ruby

Partons d’une solution de code « classique » que l’on pourrait écrire pour résoudre une solution CodinGame :

# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.

persons = gets.to_i
heights = []
ages = []
persons.times do
    age, height = gets.split(" ").collect {|x| x.to_i }
		heights << height
		ages << age
end

# Write an action using puts
# To debug: STDERR.puts "Debug messages..."

puts ages.max, heights.min
  • Enlever les commentaires
persons = gets.to_i
heights = []
ages = []
persons.times do
    age, height = gets.split(" ").collect {|x| x.to_i }
		heights << height
		ages << age
end

puts ages.max, heights.min
  • Enlever les espaces superflux
persons=gets.to_i
heights=[]
ages=[]
persons.times do
age,height=gets.split(" ").collect{|x|x.to_i}
heights<<height
ages<<age
end
puts ages.max,heights.min
  • utiliser des variables de 1 caractères
p=gets.to_i
h=[]
a=[]
p.times do
x,y=gets.split(" ").collect{|x|x.to_i}
h<<y
a<<x
end
puts a.max,h.min
  • Pas besoin de donner les paramètres par défaut des fonctions (ici pour split)
p=gets.to_i
h=[]
a=[]
p.times do
x,y=gets.split.collect{|x|x.to_i}
h<<y
a<<x
end
puts a.max,h.min
  • Quand plusieurs alias existent pour la même fonction, utiliser le plus court (map vs collect vs each)
p=gets.to_i
h=[]
a=[]
p.times do
x,y=gets.split.map{|x|x.to_i}
h<<y
a<<x
end
puts a.max,h.min
  • Utiliser _1 comme paramètre dans les blocs (_1 reçoit le premier paramètre du block, _2 reçoit le deuxième dans le cas each_with_index par exemple, etc)
p=gets.to_i
h=[]
a=[]
p.times do
x,y=gets.split.map{_1.to_i}
h<<y
a<<x
end
puts a.max,h.min
  • Remplacer les blocks simples par le symbole de la fonction à appliquer
p=gets.to_i
h=[]
a=[]
p.times do
x,y=gets.split.map(&:to_i)
h<<y
a<<x
end
puts a.max,h.min
  • Remplacer les do ... end par des accolades
p=gets.to_i
h=[]
a=[]
p.times{
x,y=gets.split.map(&:to_i)
h<<y
a<<x
}
puts a.max,h.min
  • Éviter les retours à la ligne superflux
p=gets.to_i
h=[]
a=[]
p.times{x,y=gets.split.map(&:to_i)
h<<y
a<<x}
puts a.max,h.min
  • Enlever les parenthèses en fin de chaînage de fonctions (ici sur le map )
p=gets.to_i
h=[]
a=[]
p.times{x,y=gets.split.map &:to_i
h<<y
a<<x}
puts a.max,h.min
  • Ne pas assigner les variables que nous utilisons qu’une seule fois
h=[]
a=[]
gets.to_i.times{x,y=gets.split.map &:to_i
h<<y
a<<x}
puts a.max,h.min