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 ;-)
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 …
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”.
Oh merde. On t’a pourtant envoyé plein d’ondes de Horwth. Crotte.
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!
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.