eulim 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -4
- data/lib/eulim/chemistry/compound.rb +47 -7
- data/lib/eulim/chemistry/element.rb +5 -0
- data/lib/eulim/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 848f2bdad4e29272b0fa072940779da4fa423ef7
|
4
|
+
data.tar.gz: aa8f97a80023676fb7f984343949b033c02b2773
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55336a3b7f9db14cdddbe750e65871fb2f1c9982a82917a09f8f51f87da17875e97f21a5c89d7db8b019e5bb33c8be202f5bb31a2df950828a7296e92019b3d1
|
7
|
+
data.tar.gz: 3a127b106a946e0f3a8f16b6e11948a8f0b8006577db9bd41b90cb8490acea3f91ce28170c2ea892675dd76fce4d9156db73e8f9ec5619951eb7a7e3f6079745
|
data/README.md
CHANGED
@@ -39,13 +39,17 @@ Or install it yourself as:
|
|
39
39
|
## Usage
|
40
40
|
|
41
41
|
$ Eulim::Chemistry::Element.get_by_symbol("H")
|
42
|
-
=> #<Eulim::Chemistry::Element:
|
42
|
+
=> #<Eulim::Chemistry::Element: @symbol="H", @name="Hydrogen", @atomic_number=1, @atomic_mass=1.008>
|
43
43
|
|
44
44
|
$ Eulim::Chemistry::Element.get_by_atomic_number(12)
|
45
|
-
=> #<Eulim::Chemistry::Element:
|
45
|
+
=> #<Eulim::Chemistry::Element: @symbol="Mg", @name="Magnesium", @atomic_number=12, @atomic_mass=24.305>
|
46
46
|
|
47
|
-
$ Eulim::Chemistry::Compound.
|
48
|
-
=>
|
47
|
+
$ Eulim::Chemistry::Compound.new("CaCO3")
|
48
|
+
=> #<Eulim::Chemistry::Compound: @formula="CaCO3">
|
49
|
+
|
50
|
+
$ Eulim::Chemistry::Compound.new("CaCO3").elements
|
51
|
+
=> [#<Eulim::Chemistry::Element: @symbol="Ca", @name="Calcium", @atomic_number=20, @atomic_mass=40.078>, #<Eulim::Chemistry::Element: @symbol="C", @name="Carbon", @atomic_number=6, @atomic_mass=12.0107>, #<Eulim::Chemistry::Element: @symbol="O", @name="Oxygen", @atomic_number=8, @atomic_mass=15.9996>]
|
52
|
+
|
49
53
|
## Development
|
50
54
|
|
51
55
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -1,16 +1,56 @@
|
|
1
1
|
module Eulim::Chemistry
|
2
2
|
class Compound
|
3
|
+
|
4
|
+
VALID_COMPOUND_REGEXP = /[A-Z][a-z]{0,2}\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d*/
|
5
|
+
VAILD_ELEMENT_REGEXP = /[A-Z][a-z]{0,2}\d*/
|
6
|
+
|
3
7
|
def initialize(arg)
|
4
8
|
@formula = arg
|
5
9
|
end
|
6
10
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
+
def molecular_mass
|
12
|
+
mass = 0
|
13
|
+
element_atom_count = get_element_atom_count
|
14
|
+
element_atom_count.each do |symbol, count|
|
15
|
+
mass += Element.get_by_symbol(symbol).atomic_mass * count
|
11
16
|
end
|
12
|
-
|
17
|
+
mass
|
13
18
|
end
|
14
|
-
|
19
|
+
|
20
|
+
private
|
21
|
+
def get_element_atom_count formula = @formula, group_multiplier = 1, result = {}, groups = []
|
22
|
+
formula
|
23
|
+
elements_n_groups = formula.scan VALID_COMPOUND_REGEXP
|
24
|
+
loop do
|
25
|
+
break if !elements_n_groups.last
|
26
|
+
elements = elements_n_groups.last.scan VAILD_ELEMENT_REGEXP
|
27
|
+
if elements.first === elements_n_groups.last
|
28
|
+
element_multipler = elements.first.match(/\d*$/).to_a.first.to_i
|
29
|
+
element_multipler = element_multipler > 0 ? element_multipler : 1
|
30
|
+
element_symbol = elements.first.match(/[A-Z][a-z]{0,2}/).to_a.first
|
31
|
+
if result[element_symbol]
|
32
|
+
result[element_symbol] += (element_multipler * group_multiplier)
|
33
|
+
else
|
34
|
+
result[element_symbol] = (element_multipler * group_multiplier)
|
35
|
+
end
|
36
|
+
else
|
37
|
+
groups << elements_n_groups.last
|
38
|
+
end
|
39
|
+
elements_n_groups.pop
|
40
|
+
end
|
41
|
+
loop do
|
42
|
+
break if !groups.last
|
43
|
+
group = groups.pop
|
44
|
+
grml = get_group_multiplier(group)
|
45
|
+
get_element_atom_count group[1..-(grml.to_s.length+1)], grml*group_multiplier, result, groups
|
46
|
+
end
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_group_multiplier formula
|
51
|
+
group_multiplier = formula.scan(VALID_COMPOUND_REGEXP).first.match(/\d*$/).to_a.first.to_i
|
52
|
+
group_multiplier > 0 ? group_multiplier : 1
|
53
|
+
end
|
54
|
+
|
15
55
|
end
|
16
|
-
end
|
56
|
+
end
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module Eulim::Chemistry
|
2
2
|
class Element
|
3
3
|
|
4
|
+
VALID_SYMBOL_REGEXP = /[A-Z][a-z]{0,2}/
|
5
|
+
VALID_NAME_REGEXP = /[A-Z][a-z]+/
|
6
|
+
|
7
|
+
attr_accessor :atomic_mass
|
8
|
+
|
4
9
|
@@elements = [
|
5
10
|
{ symbol:'H', name: 'Hydrogen', atomic_number: 1, atomic_mass: 1.0079 },
|
6
11
|
{ symbol:'He', name: 'Helium', atomic_number: 2, atomic_mass: 4.002602 },
|
data/lib/eulim/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eulim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Syed Fazil Basheer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|