Class: Judges::Judges
Overview
Collection of all judges to run.
In the directory dir the following structure must be maintained:
dir/
judge-one/
judge-one.rb
other files...
judge-two/
judge-two.rb
other files...
The name of a directory of a judge must be exactly the same as the name of the .rb script inside the directory.
- Author
-
Yegor Bugayenko ([email protected])
- Copyright
-
Copyright © 2024-2025 Yegor Bugayenko
- License
-
MIT
Instance Method Summary collapse
-
#each {|Judges::Judge| ... } ⇒ Enumerator
Iterates over all valid judges in the directory.
-
#each_with_index {|Judges::Judge, Integer| ... } ⇒ Integer
Iterates over all judges while tracking their index position.
-
#get(name) ⇒ Judges::Judge
Retrieves a specific judge by its name.
-
#initialize(dir, lib, loog, epoch: Time.now, shuffle: '', boost: [], demote: [], seed: 0) ⇒ Judges
constructor
Initialize.
Constructor Details
#initialize(dir, lib, loog, epoch: Time.now, shuffle: '', boost: [], demote: [], seed: 0) ⇒ Judges
Initialize.
38 39 40 41 42 43 44 45 46 47 |
# File 'lib/judges/judges.rb', line 38 def initialize(dir, lib, loog, epoch: Time.now, shuffle: '', boost: [], demote: [], seed: 0) @dir = dir @lib = lib @loog = loog @epoch = epoch @shuffle = shuffle || '' @boost = boost @demote = demote @seed = seed || 0 end |
Instance Method Details
#each {|Judges::Judge| ... } ⇒ Enumerator
Iterates over all valid judges in the directory.
This method discovers all judge directories, validates them (ensuring they contain a corresponding .rb file), and yields them in a specific order. The order is determined by:
-
Randomly reorder judges (if shuffle prefix is empty, shuffle all judges; if prefix is not empty, shuffle only those NOT starting with the prefix)
-
Judges whose names match the boost list are placed first
-
Judges whose names match the demote list are placed last
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/judges/judges.rb', line 74 def each(&) return to_enum(__method__) unless block_given? list = Dir.glob(File.join(@dir, '*')).each.to_a.map do |d| next unless File.directory?(d) b = File.basename(d) next unless File.exist?(File.join(d, "#{b}.rb")) Judges::Judge.new(File.absolute_path(d), @lib, @loog) end list.compact! list.sort_by!(&:name) all = list.each_with_index.to_a good = all.dup mapping = all .map { |a| [a[0].name, a[1], a[1]] } .reject { |a| !@shuffle.empty? && a[0].start_with?(@shuffle) } .to_h { |a| [a[1], a[2]] } positions = mapping.values.shuffle(random: Random.new(@seed)) mapping.keys.zip(positions).to_h.each do |before, after| good[after] = all[before] end boosted = [] demoted = [] normal = [] good.map { |a| a[0] }.each do |j| if @boost&.include?(j.name) boosted.append(j) elsif @demote&.include?(j.name) demoted.append(j) else normal.append(j) end end ret = boosted + normal + demoted ret.each(&) end |
#each_with_index {|Judges::Judge, Integer| ... } ⇒ Integer
Iterates over all judges while tracking their index position.
This method calls the #each method and additionally provides a zero-based index for each judge yielded. The judges are processed in the same order as determined by the #each method (with boost and shuffle rules applied).
119 120 121 122 123 124 125 126 |
# File 'lib/judges/judges.rb', line 119 def each_with_index idx = 0 each do |p| yield [p, idx] idx += 1 end idx end |
#get(name) ⇒ Judges::Judge
Retrieves a specific judge by its name.
The judge must exist as a directory within the judges directory with the given name.
56 57 58 59 60 |
# File 'lib/judges/judges.rb', line 56 def get(name) d = File.absolute_path(File.join(@dir, name)) raise "Judge #{name} doesn't exist in #{@dir}" unless File.exist?(d) Judges::Judge.new(d, @lib, @loog, epoch: @epoch) end |