Class: Judges::Judges

Inherits:
Object show all
Defined in:
lib/judges/judges.rb

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 (yegor256@gmail.com)

Copyright

Copyright © 2024-2025 Yegor Bugayenko

License

MIT

Instance Method Summary collapse

Constructor Details

#initialize(dir, lib, loog, start: Time.now, shuffle: '', boost: []) ⇒ Judges

Returns a new instance of Judges.



29
30
31
32
33
34
35
36
# File 'lib/judges/judges.rb', line 29

def initialize(dir, lib, loog, start: Time.now, shuffle: '', boost: [])
  @dir = dir
  @lib = lib
  @loog = loog
  @start = start
  @shuffle = shuffle || ''
  @boost = boost
end

Instance Method Details

#each {|Judge| ... } ⇒ Object

Iterate over them all.

Yields:



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/judges/judges.rb', line 48

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| a[0].start_with?(@shuffle) }
    .to_h { |a| [a[1], a[2]] }
  positions = mapping.values.shuffle
  mapping.keys.zip(positions).to_h.each do |before, after|
    good[after] = all[before]
  end
  ret = []
  good.map { |a| a[0] }.each do |j|
    if @boost&.include?(j.name)
      ret.prepend(j)
    else
      ret.append(j)
    end
  end
  ret.each(&)
end

#each_with_index {|(Judge, Integer)| ... } ⇒ Object

Iterate over them all, with an index.

Yields:



82
83
84
85
86
87
88
89
# File 'lib/judges/judges.rb', line 82

def each_with_index
  idx = 0
  each do |p|
    yield [p, idx]
    idx += 1
  end
  idx
end

#get(name) ⇒ Judge

Get one judge by name.

Returns:



40
41
42
43
44
# File 'lib/judges/judges.rb', line 40

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, start: @start)
end