From 56f17c01f6bf54f7d970541c0320491d01272565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C8=98tefan-Iulian=20Alecu?= <165364995+pascalecu@users.noreply.github.com> Date: Wed, 13 May 2026 22:38:16 +0300 Subject: [PATCH] Add Job Sequencing in Ruby --- archive/r/ruby/job-sequencing.rb | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 archive/r/ruby/job-sequencing.rb diff --git a/archive/r/ruby/job-sequencing.rb b/archive/r/ruby/job-sequencing.rb new file mode 100644 index 000000000..9584f7163 --- /dev/null +++ b/archive/r/ruby/job-sequencing.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +USAGE = "Usage: please provide a list of profits and a list of deadlines" + +def usage! + warn USAGE + exit 1 +end + +def parse_list(str) + str.split(",").map { Integer(it.strip) } +rescue ArgumentError, NoMethodError + usage! +end + +def find(parent, x) + while parent[x] != x + parent[x] = parent[parent[x]] + x = parent[x] + end + x +end + +def schedule(profits, deadlines) + jobs = profits.zip(deadlines) + max_d = deadlines.max + + parent = (0..max_d).to_a + + total = 0 + + jobs.sort_by { -it[0] }.each do |profit, d| + slot = find(parent, [d, max_d].min) + + next if slot == 0 + + parent[slot] = slot - 1 + total += profit + end + + total +end + +profits_str, deadlines_str = ARGV +usage! if profits_str.nil? || deadlines_str.nil? || + profits_str.strip.empty? || deadlines_str.strip.empty? + +profits = parse_list(profits_str) +deadlines = parse_list(deadlines_str) + +usage! if profits.size != deadlines.size + +puts schedule(profits, deadlines)