diff options
author | Nat Lasseter <nat.lasseter@york.ac.uk> | 2024-01-22 10:23:58 +0000 |
---|---|---|
committer | Nat Lasseter <nat.lasseter@york.ac.uk> | 2024-01-22 10:23:58 +0000 |
commit | a79414bcf14d17c58e040a7b8524f7bd8f7e5e03 (patch) | |
tree | 4f2f232aca568711ecb35caa3444b54f4dfa4361 /digits.rb |
Migrate from gists
Diffstat (limited to 'digits.rb')
-rw-r--r-- | digits.rb | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/digits.rb b/digits.rb new file mode 100644 index 0000000..addc51e --- /dev/null +++ b/digits.rb @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby + +require 'optimist' + +opts = Optimist::options do + version "digits 0.2 (c) 2023 Nat Lasseter" + banner <<-EOS +Digits gives valid combinations of digits 1-9 that sum to the given total + +Usage: + digits [opts] + +where [opts] are: +EOS + + opt :number, "The number of digits", type: :integer + opt :target, "The target sum", type: :integer + opt :exclude, "Exclude a digit", type: :integer, multi: true + opt :include, "Include a digit", type: :integer, multi: true + + educate_on_error +end + +digits = [1,2,3,4,5,6,7,8,9] +opts[:exclude].each { |i| digits.delete(i) } + +def puts_group(digits, mandatory, number, target = nil) + if target.nil? + puts digits.combination(number).select { |a| (mandatory - a).empty? }.sort { |a, b| a.sum <=> b.sum }.map { |a| "#{a.join} = #{a.sum}" } + else + puts digits.combination(number).select { |a| a.sum == target }.select { |a| (mandatory - a).empty? }.map { |a| "#{a.join} = #{target}" } + end +end + +if opts[:number_given] + puts "== #{opts[:number]} ==" + puts_group(digits, opts[:include], opts[:number], opts[:target]) +else + (2..8).each do |n| + puts "== #{n} ==" + puts_group(digits, opts[:include], n, opts[:target]) + end +end |