Skip to content

Instantly share code, notes, and snippets.

@lian
Created November 6, 2013 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lian/7346053 to your computer and use it in GitHub Desktop.
Save lian/7346053 to your computer and use it in GitHub Desktop.
resistor_calculator.rb
class ResistorCalculator
# http://www.dannyg.com/examples/res2/resistor.htm
attr_reader :tolerance, :multiplier, :ones, :tens, :ohms
Tens = %w[Black Brown Red Orange Yellow Green Blue Violet Gray White]
Ones = %w[Black Brown Red Orange Yellow Green Blue Violet Gray White]
Multiplier = %w[Black Brown Red Orange Yellow Green Blue Violet Gray White Gold Silver]
Tolerance = %w[Gold Silver None]
MultiplierValues = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -2 ]
ToleranceValues = [ 5, 10, 20 ]
def initialize(tens="Black", ones="Black", multiplier="Black", tolerance="Gold")
@tens, @ones, @multiplier, @tolerance = *[tens, ones, multiplier, tolerance].map(&:capitalize)
raise "Invalid Color #{@tens} for Tens" unless Tens.include?(@tens)
raise "Invalid Color #{@ones} for Ones" unless Ones.include?(@ones)
raise "Invalid Color #{@multiplier} for Multiplier" unless Multiplier.include?(@multiplier)
raise "Invalid Color #{@tolerance} for Tolerance" unless Tolerance.include?(@tolerance)
calculate_ohms
end
def calculate_ohms
ohmage = (Tens.index(@tens) * 10.0) + Ones.index(@ones)
@ohms = ohmage * (10**MultiplierValues[Multiplier.index(@multiplier)])
end
def to_f; calculate_ohms; end
def to_i; calculate_ohms.to_i; end
def to_s; "%s +/-%d%%" % [format(calculate_ohms), ToleranceValues[Tolerance.index(@tolerance)]]; end
def inspect
"Resistor.new(%s, %s, %s, %s) = %s" %
[ @tens, @ones, @multiplier, @tolerance, to_s ]
end
def format(ohmage)
if ohmage >= 1e6
"%g Mohms" % (ohmage / 1e6)
else
ohmage >= 1e3 ? "%g Kohms" % (ohmage / 1e3) : "%g ohms" % ohmage
end
end
def self.[](*a); new(*a).to_s; end
end
p ResistorCalculator["red", "red", "red", "gold"]
__END__
p ResistorCalculator.new("green", "green", "red", "gold").inspect
p ResistorCalculator.new("green", "green", "red", "gold").to_f
p ResistorCalculator.new("green", "green", "red", "gold").to_i
p ResistorCalculator.new("green", "green", "red", "gold").to_s
p ResistorCalculator["green", "green", "red", "gold"]
p ResistorCalculator["green", "green", "brown", "gold"]
p ResistorCalculator["green", "green", "gold", "gold"]
p ResistorCalculator["brown", "black", "red", "gold"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment