Sha256: 4754d45241cc21effa23ea89069c51d419f731ba311080b6c8dfa9ff5a0b6876
Contents?: true
Size: 1.4 KB
Versions: 1
Compression:
Stored size: 1.4 KB
Contents
module Eulim::Chemistry class Compound VALID_COMPOUND_REGEXP = /[A-Z][a-z]{0,2}\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d*/ attr_accessor :molecular_mass, :constituents, :formula def initialize(arg) @formula = arg @constituents = get_constituents @molecular_mass = get_molecular_mass end private def get_molecular_mass mass = 0 @constituents.each do |constituent| mass += constituent[:element].atomic_mass * constituent[:atom_count] end mass end def get_constituents constituents = [] get_constituent_atoms.each do |symbol, count| constituents << {element: Element.get_by_symbol(symbol), atom_count: count} end constituents end def get_constituent_atoms formula=@formula, result={} constituents = formula.scan VALID_COMPOUND_REGEXP constituents.each do |constituent| multipler = get_multipler constituent if constituent[0] != '(' && multipler == 0 result[constituent] = result[constituent] ? result[constituent] + 1 : 1 else (multipler == 0 ? 1 : multipler).times do sub_constituents = constituent.match(/^\(?(.*?)\)?($|\d*$)/).to_a idx = constituent == sub_constituents.first ? 1 : 0 get_constituent_atoms sub_constituents[idx], result end end end result end def get_multipler constituent multipler = constituent.match(/\d*$/).to_a.first.to_i end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
eulim-0.0.7 | lib/eulim/chemistry/compound.rb |