jbbarth's

Que j’aurais pu aussi sobrement appeler :

  • refaisons le match
  • massacre à la tronçonneuse
  • f*ck
require 'find'
require 'yaml'
require 'digest/md5'

class EvaFile
  attr_accessor :path

  def initialize(path)
    @path = path
  end
  
  def infos
    @infos ||= {:size => File.size(@path).tap{|s| def s.to_s; "#{self.dup} bytes"; end },
                :last_modified => File.mtime(@path),
                :md5_sum => Digest::MD5.hexdigest(File.read(@path))}
  end
end

class EvaDir
  def initialize(subdir)
    raise "Give me a (sub)directory !" if subdir.nil? || !File.directory?(subdir)
    @subdir = subdir
  end
  
  def files
    @files ||= Find.find(@subdir) do |f|
                 Find.prune if File.directory?(f)
                 EvaFile.new(f) if File.file?(f)
               end.compact
  end

  def write_info_file(filename)
    path = File.join(@subdir,filename)
    begin
      info = File.open(path,"w")
    rescue
      $stderr.puts "Error opening file #{path} for writing..."
    end
    info.write "Size: #{size} bytes\n"
    info.write "Files: #{nb_files}\n"
    files_hash = {}
    files.each do |file|
      files_hash.merge!(File.basename(file.path) => file.infos)
    end
    info.write files_hash.to_yaml
    info.close_write
  end

  def size
    @size = files.inject(0) do |memo, f|
              memo + f.infos[:size]
            end
  end
  
  def nb_files
    files.length
  end
end

class EvaUtil
  def initialize(dir)
    raise "Give me a directory !" if dir.nil? || !File.directory?(dir)
    @dir = dir
  end
  
  def subdirs
    return @subdirs if @subdirs
    @subdirs = [ EvaDir.new(@dir) ]
    @subdirs << Find.find(@dir) do |f|
                  EvaDir.new(f) if File.directory?(f)
                end
    @subdirs = @subdirs.compact.uniq
  end

  def generate_info_files(filename="infos.txt")
    @subdirs.each do |s|
      s.write_info_file(filename)
    end
  end
  
  def generate_meta_info_file(filename="metainfos.txt")
    path = File.join(@dir,filename)
    begin
      meta = File.open(path,"w")
    rescue
      $stderr.puts "Error opening file #{path} for writing..."
    end
    meta.write "Total size: #{size} bytes"
    meta.write "Total number of files: #{nb_files}"
    meta.write "Last modified (<24h) :\n #{last_modified.join("\n  ")}" if last_modified.any?
    meta.close_write
  end
  
  def last_modified
    @subdirs.inject([]) do |memo, subdir|
      memo << subdir.files.select{|f| File.mtime(f) < Time.at(Time.now.to_i - 86400)}.map(&:path)
      memo.flatten
      memo
    end
  end

  private
  def method_missing(symbol, *args)
    if %w(nb_files size).include?(symbol.to_s)
      @subdirs.inject(0) do |memo, subdir|
         memo + subdir.send(symbol)
      end
    else
      super
    end
  end
end

e = EvaUtil.new(ARGV[0])
e.generate_info_files
e.generate_meta_info_file

Garanti 100% non testé, 100% fait sans l’API, et surtout 100% fait avec un éditeur de texte. C’est sûrement bourré de conneries, mais au moins avec un truc comme ça j’aurais pas eu honte. Cela dit vue la longueur, je commence à me pardonner d’avoir barbouillé ma copie de blanco, c’était infaisable sans ça. Coder sur papier est définitivement un cauchemard. On se la refait dans 2 ans ;-)

Hierarchy: previous, next

Comments

There are 6 comments on this post. Post yours →

Mais c’est un test interne en entreprise ?
C’est hallucinant les boites qui restent enfermées dans ce genre de truc sans aucun intérêt.

On se croirait revenu en première année d’algorithmie …

JB

Un test interne à mon ministère, langage libre, qui conditionne l’obtention d’une prime. Je suis sorti dégouté après 4h de raturage sur ma copie…

Enfin. Je n’ai jamais fait d’algorithmie mais ce qui est sûr, c’est que ce genre d’exercice ne doit pas être très représentatif de “mes compétences”.

Fae

Oh merde. On t’a pourtant envoyé plein d’ondes de Horwth. Crotte.

mom

moi j’y croyais ,mais vu le galimatia que ça représente,je ne peux que m’incliner!
c’est trop trop complexe,shit,shit,shit!

koukou

Aha! Monsieur n’a visiblement pas besoin de refaire le match. je dis bravo l’artiste, chapeau bas. c’est quoi le prochain challenge?

Gagner de l’argent :)

Post a comment

Required fields in bold.