Les Bases Du Golfing En Ruby

Envie de vous lancer dans le golfing?

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

# 367 chars
# 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
    # 180 chars
    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
    # 155 chars
    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ère
    # 102 chars
    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)
    # 97 chars
    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)
    # 93 chars
    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)
    # 91 chars
    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
    # 90 chars
    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
    # 86 chars
    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
    # 84 chars
    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 )
    # 83 chars
    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
    # 79 chars
    h=[]
    a=[]
    gets.to_i.times{x,y=gets.split.map &:to_i
    h<<y
    a<<x}
    puts a.max,h.min