P06axz 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.travis.yml +5 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/Guardfile +82 -0
  7. data/LICENSE.txt +21 -0
  8. data/P06.gemspec +44 -0
  9. data/README.md +7 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/doc/Alimento.html +825 -0
  14. data/doc/Alimento_concreto.html +396 -0
  15. data/doc/List.html +858 -0
  16. data/doc/Node.html +423 -0
  17. data/doc/P06.html +117 -0
  18. data/doc/_index.html +151 -0
  19. data/doc/class_list.html +51 -0
  20. data/doc/css/common.css +1 -0
  21. data/doc/css/full_list.css +58 -0
  22. data/doc/css/style.css +492 -0
  23. data/doc/file.README.html +78 -0
  24. data/doc/file_list.html +56 -0
  25. data/doc/frames.html +17 -0
  26. data/doc/index.html +78 -0
  27. data/doc/js/app.js +248 -0
  28. data/doc/js/full_list.js +216 -0
  29. data/doc/js/jquery.js +4 -0
  30. data/doc/method_list.html +243 -0
  31. data/doc/top-level-namespace.html +112 -0
  32. data/docs/Alimento.html +682 -0
  33. data/docs/Alimento_concreto.html +389 -0
  34. data/docs/List.html +858 -0
  35. data/docs/Node.html +423 -0
  36. data/docs/P06.html +117 -0
  37. data/docs/_index.html +151 -0
  38. data/docs/class_list.html +51 -0
  39. data/docs/css/common.css +1 -0
  40. data/docs/css/full_list.css +58 -0
  41. data/docs/css/style.css +492 -0
  42. data/docs/file.README.html +79 -0
  43. data/docs/file_list.html +56 -0
  44. data/docs/frames.html +17 -0
  45. data/docs/index.html +79 -0
  46. data/docs/js/app.js +248 -0
  47. data/docs/js/full_list.js +216 -0
  48. data/docs/js/jquery.js +4 -0
  49. data/docs/method_list.html +227 -0
  50. data/docs/top-level-namespace.html +112 -0
  51. data/lib/P06.rb +11 -0
  52. data/lib/P06/alimento.rb +37 -0
  53. data/lib/P06/version.rb +3 -0
  54. data/lib/P07/alimento_concreto.rb +10 -0
  55. data/lib/P07/list.rb +80 -0
  56. data/lib/P08/alimento_concreto.rb +25 -0
  57. data/lib/P08/list.rb +108 -0
  58. data/lib/P10/modified_array.rb +29 -0
  59. data/lib/P11/alimento.rb +29 -0
  60. data/lib/P11/plato.rb +108 -0
  61. data/lib/P11/porciones.rb +31 -0
  62. metadata +233 -0
data/lib/P06.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "P10/modified_array"
2
+ require "P06/version"
3
+ require "P11/alimento"
4
+ require "P08/list"
5
+ require "P08/alimento_concreto"
6
+ require "P11/plato"
7
+ require "P11/porciones"
8
+
9
+ module P06
10
+
11
+ end
@@ -0,0 +1,37 @@
1
+ # Esta clase permite representar la información básica
2
+ # de un alimento dado, sus proteinas, glúcidos y lípidos
3
+ # además, calcula el índice calórico del mismo.
4
+ #
5
+ # Author:: Alberto González (mailto:alu0100949568@ull.edu.es)
6
+ # Copyright:: Cretive Commons
7
+ # License:: Distributes under the same terms as Ruby
8
+ class Alimento
9
+ attr_reader :nom, :prot, :gluc, :lip, :cal_index
10
+ include Enumerable, Comparable
11
+ # Se asigna el nombre y la información nutricional del alimento
12
+ def initialize(nom, prot, gluc, lip, gluc_data = nil)
13
+ @nom = nom
14
+ @prot = prot
15
+ @gluc = gluc
16
+ @lip = lip
17
+ @gluc_data = gluc_data
18
+ @cal_index = (@prot.to_f*4 + @gluc.to_f*4 + @lip.to_f*9).round(2)
19
+ end
20
+
21
+ # Muestra la información de un alimento en concreto
22
+ def to_s
23
+ #El huevo frito tiene 14.1 proteinas, 0.0 glúcidos, 19.5 lípidos
24
+ " #{@nom}: #{@prot} proteinas, #{@gluc} glúcidos, #{@lip} lípidos, #{@cal_index} calorías"
25
+ end
26
+
27
+ # Se comprueba que no sea un valor negativo, en caso de serlo, se sustituye por un 0
28
+ def not_negative(n)
29
+ n < 0 ? n = 0 : n = n
30
+ end
31
+
32
+ # Calcula el área bajo la curva para los datos tomados en una medición de glucosa en intervalos de tiempo de 5 minutos
33
+ def aibc
34
+ @gluc_data.map{|indv| zero = indv.at(0); prev = -2; indv.map{|index| prev = prev + 1; ((index-zero) + (indv.at(not_negative(prev))-zero))*2.5}.reduce(:+).round(2)}
35
+ end
36
+ end
37
+
@@ -0,0 +1,3 @@
1
+ module P06
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,10 @@
1
+ class Alimento_concreto < Alimento
2
+ def initialize(group_name, food_name, prot, gluc, lip)
3
+ @group_name = group_name
4
+ super(food_name, prot, gluc, lip)
5
+ end
6
+
7
+ def to_s
8
+ "(#{@group_name} ->#{super.to_s})"
9
+ end
10
+ end
data/lib/P07/list.rb ADDED
@@ -0,0 +1,80 @@
1
+ Node = Struct.new(:value, :next, :prev)
2
+
3
+ class List
4
+ def initialize
5
+ @head = @tail = nil
6
+ end
7
+
8
+ def push(value)
9
+ ##Si es un array
10
+ if value.is_a?(Array)
11
+ value.each do |val|
12
+ prev = @tail unless @tail.nil?
13
+ while prev != @head do
14
+ prev = prev.next
15
+ end
16
+
17
+ node = Node.new(val, nil, prev)
18
+
19
+ @tail = node if @tail.nil?
20
+ @head.next = node unless @head.nil?
21
+
22
+ @head = node
23
+ end
24
+ else #Si es un único valor
25
+ prev = @tail unless @tail.nil?
26
+ while prev != @head do
27
+ prev = prev.next
28
+ end
29
+
30
+ node = Node.new(value, nil, prev)
31
+
32
+ @tail = node if @tail.nil?
33
+ @head.next = node unless @head.nil?
34
+
35
+ @head = node
36
+ end
37
+ end
38
+
39
+ def head
40
+ @head.value unless @head.nil?
41
+ end
42
+
43
+ def tail
44
+ @tail.value unless @tail.nil?
45
+ end
46
+
47
+ def remove_tail
48
+ @tail = @tail.next
49
+ end
50
+
51
+ def remove_head
52
+ @head = @head.prev
53
+ @head.next = nil
54
+ end
55
+
56
+ def to_s
57
+ array = "["
58
+ next_val = @tail unless @tail.nil?
59
+ while next_val != nil do
60
+ array = array + next_val.value.to_s + ", "
61
+ next_val = next_val.next
62
+
63
+ if next_val == nil #For las element
64
+ array = array.chomp(', ') + "]"
65
+ end
66
+ end
67
+ "#{array}"
68
+ end
69
+
70
+ def size
71
+ count = 0
72
+ next_val = @tail unless @tail.nil?
73
+ while next_val != nil do
74
+ next_val = next_val.next
75
+ count +=1
76
+ end
77
+ "#{count}"
78
+ end
79
+
80
+ end
@@ -0,0 +1,25 @@
1
+ # Representa a un grupo de alimentos, identificados por su nombre de grupo
2
+ # es una clase heredada de Alimento
3
+ #
4
+ # Author:: Alberto González (mailto:alu0100949568@ull.edu.es)
5
+ # Copyright:: Cretive Commons
6
+ # License:: Distributes under the same terms as Ruby
7
+ class Alimento_concreto < Alimento
8
+ # Se han incluido los mixin Comparable.
9
+ include Comparable
10
+ def initialize(group_name, food_name, prot, gluc, lip)
11
+ @group_name = group_name
12
+ super(food_name, prot, gluc, lip)
13
+ end
14
+ # Devuelve de forma formateada el nombre del grupo al que pertenecen
15
+ # un grupo de alimentos, además de los alimentos que lo conforman.
16
+ def to_s
17
+ "(#{@group_name} ->#{super.to_s})"
18
+ end
19
+ # Compara dos alimentos según su índice calórico
20
+ def <=>(other)
21
+ return nil unless other.instance_of? Alimento_concreto
22
+ @cal_index <=> other.cal_index
23
+ end
24
+ end
25
+
data/lib/P08/list.rb ADDED
@@ -0,0 +1,108 @@
1
+ # encoding: utf-8
2
+ # Esta estructura respresenta a un nodo de nuestra futura
3
+ # lista. Tiene un nodo predecesor, sucesor y un valor.
4
+ #
5
+ # Author:: Alberto González (mailto:alu0100949568@ull.edu.es)
6
+ # Copyright:: Cretive Commons
7
+ # License:: Distributes under the same terms as Ruby
8
+
9
+ Node = Struct.new(:value, :next, :prev)
10
+
11
+ # Representa una lista doblemente enlazada con una cabeza y una cola,
12
+ # pudiéndose insertar un array de alimentos o alimentos individuales
13
+ #
14
+ # Author:: Alberto González (mailto:alu0100949568@ull.edu.es)
15
+ # Copyright:: Cretive Commons
16
+ # License:: Distributes under the same terms as Ruby
17
+ class List
18
+ # Se ha incluido el mixin Enumerable.
19
+ include Enumerable
20
+ # Se asigna la cabeza y cola a nil (inicialmente)
21
+ def initialize
22
+ @head = @tail = nil
23
+ end
24
+ # Método para insertar valores en la lista, se pueden
25
+ # insertar varios valores o un único valor.
26
+ def push(value)
27
+ ##Si es un array
28
+ if value.is_a?(Array)
29
+ value.each do |val|
30
+ prev = @tail unless @tail.nil?
31
+ while prev != @head do
32
+ prev = prev.next
33
+ end
34
+
35
+ node = Node.new(val, nil, prev)
36
+
37
+ @tail = node if @tail.nil?
38
+ @head.next = node unless @head.nil?
39
+
40
+ @head = node
41
+ end
42
+ else #Si es un único valor
43
+ prev = @tail unless @tail.nil?
44
+ while prev != @head do
45
+ prev = prev.next
46
+ end
47
+
48
+ node = Node.new(value, nil, prev)
49
+
50
+ @tail = node if @tail.nil?
51
+ @head.next = node unless @head.nil?
52
+
53
+ @head = node
54
+ end
55
+ end
56
+
57
+ # Devuelve la cabeza de la lista a menos que no tenga cabeza
58
+ def head
59
+ @head.value unless @head.nil?
60
+ end
61
+ # Devuelve la cola de la lista a menos que no tenga cola
62
+ def tail
63
+ @tail.value unless @tail.nil?
64
+ end
65
+ # Borra la cola de la lista a menos que no tenga cola
66
+ def remove_tail
67
+ @tail = @tail.next unless @tail.nil?
68
+ end
69
+ # Borra la cabeza de la lista
70
+ def remove_head
71
+ @head = @head.prev
72
+ @head.next = nil
73
+ end
74
+ # Muestra los valores que se han almacenado en la lista
75
+ def to_s
76
+ array = "["
77
+ next_val = @tail unless @tail.nil?
78
+ while next_val != nil do
79
+ array = array + next_val.value.to_s + ", "
80
+ next_val = next_val.next
81
+
82
+ if next_val == nil #For las element
83
+ array = array.chomp(', ') + "]"
84
+ end
85
+ end
86
+ "#{array}"
87
+ end
88
+ # Devuelve la cantidad de nodos que tiene nuestra lista
89
+ def size
90
+ count = 0
91
+ next_val = @tail unless @tail.nil?
92
+ while next_val != nil do
93
+ next_val = next_val.next
94
+ count +=1
95
+ end
96
+ "#{count}"
97
+ end
98
+ # Método que nos permite recorrer cada uno de los nodos de nuestra lista
99
+ def each
100
+ next_val = @tail
101
+ while next_val != nil do
102
+ yield next_val.value
103
+ next_val = next_val.next
104
+ end
105
+ end
106
+
107
+ end
108
+
@@ -0,0 +1,29 @@
1
+ class Array
2
+ def bubble_sort
3
+ i = 0
4
+ j = 0
5
+ v_aux = self.clone
6
+ while j < v_aux.size-1 do
7
+ while i < v_aux.size-1 do
8
+ if v_aux[i] > v_aux[i+1]
9
+ aux = v_aux[i]
10
+ v_aux[i] = v_aux[i+1]
11
+ v_aux[i+1] = aux
12
+ end
13
+
14
+ i = i+1
15
+ end
16
+ j = j+1
17
+ i = 0
18
+ end
19
+
20
+ v_aux
21
+ end
22
+
23
+ def bubble_sort_func
24
+ self_ = self.clone
25
+ aux = self.clone
26
+ (0..self.size-1).each{|x| min = self_.min; prev = aux[x]; aux[x] = min; self_.delete(min)}
27
+ aux
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ class Alimento
2
+ attr_reader :nom, :prot, :gluc, :lip, :cal_index
3
+ include Enumerable, Comparable
4
+ # Se asigna el nombre y la información nutricional del alimento
5
+ def initialize(nom, prot, gluc, lip, gluc_data = nil)
6
+ @nom = nom
7
+ @prot = prot
8
+ @gluc = gluc
9
+ @lip = lip
10
+ @gluc_data = gluc_data
11
+ @cal_index = (@prot.to_f*4 + @gluc.to_f*4 + @lip.to_f*9).round(2)
12
+ end
13
+
14
+ # Muestra la información de un alimento en concreto
15
+ def to_s
16
+ #El huevo frito tiene 14.1 proteinas, 0.0 glúcidos, 19.5 lípidos
17
+ "%21s"%"#{@nom}:%13s "%" #{@prot} %13s "%" #{@gluc} %15s "%" #{@lip} %13s "%" #{@cal_index}"
18
+ end
19
+
20
+ # Se comprueba que no sea un valor negativo, en caso de serlo, se sustituye por un 0
21
+ def not_negative(n)
22
+ n < 0 ? n = 0 : n = n
23
+ end
24
+
25
+ # Calcula el área bajo la curva para los datos tomados en una medición de glucosa en intervalos de tiempo de 5 minutos
26
+ def aibc
27
+ @gluc_data.map{|indv| zero = indv.at(0); prev = -2; indv.map{|index| prev = prev + 1; ((index-zero) + (indv.at(not_negative(prev))-zero))*2.5}.reduce(:+).round(2)}
28
+ end
29
+ end
data/lib/P11/plato.rb ADDED
@@ -0,0 +1,108 @@
1
+ class Plato
2
+ attr_reader :name, :total
3
+ def initialize(name, &block)
4
+ @name = name
5
+ @alimentos = []
6
+ @total = 0
7
+
8
+ if block_given?
9
+ if block.arity == 1
10
+ yield self
11
+ else
12
+ instance_eval(&block)
13
+ end
14
+ end
15
+ end
16
+
17
+ def convert_quantities(amount)
18
+ grams = 0
19
+ prop = 1
20
+
21
+ if amount[:porcion] =~ /taza/i
22
+ amount[:porcion] = amount[:porcion].gsub(/taz(a\s|as\s|a\z|as\z)/, '')
23
+ grams = 3
24
+ else if amount[:porcion] =~ /cucharada/i
25
+ amount[:porcion] = amount[:porcion].gsub(/cucharad(a\s|as\s|a\z|as\z)/, '')
26
+ grams = 0.09
27
+
28
+ else if amount[:porcion] =~ /cucharon/i
29
+ amount[:porcion] = amount[:porcion].gsub(/cucharo(n\s|nes\s|n\z|nes\z)/, '')
30
+ grams = 10
31
+
32
+ else if amount[:porcion] =~ /pieza/i
33
+ amount[:porcion] = amount[:porcion].gsub(/piez(a\s|as\s|a\z|as\z)/, '')
34
+ grams = 1
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ if amount[:porcion] =~ /pequeñ(a\s|as\s|a\z|as\z|o\s|os\s|o\z|os\z)/i
41
+ amount[:porcion] = amount[:porcion].gsub(/pequeñ(a\s|as\s|a\z|as\z|o\s|os\s|o\z|os\z)/, '')
42
+ grams = grams.to_f / 2
43
+ end
44
+ # reconoce numero y fraccion amount[:porcion] = amount[:porcion].match(/(\d\/\d)|\d/)
45
+
46
+ # Si el número es una fracción
47
+ if amount[:porcion].match(/(\d\/\d)/)
48
+ num = amount[:porcion].match(/(\d\/)/).to_s.gsub(/(\/)/, '').to_f
49
+ den = amount[:porcion].match(/(\/\d)/).to_s.gsub(/(\/)/, '').to_f
50
+ prop = num/den
51
+ else
52
+ # Si el numero es entero
53
+ prop = amount[:porcion].match(/\d/).to_s.to_i
54
+ end
55
+
56
+ grams = grams * prop
57
+ end
58
+
59
+ def insert_food(name, amount)
60
+ food = Food[name]
61
+
62
+ if amount[:porcion]
63
+ quantity = Food[name].cal_index * convert_quantities(amount)
64
+ else
65
+ quantity = Food[name].cal_index * amount[:gramos]/10
66
+ end
67
+
68
+ @alimentos << [food, quantity.round(2)]
69
+ @total = @alimentos.map{|x| x[1]}.reduce(:+)
70
+ end
71
+
72
+ def vegetal(name, amount)
73
+ insert_food(name, amount)
74
+ end
75
+
76
+ def fruta(name, amount)
77
+ insert_food(name, amount)
78
+ end
79
+
80
+ def cereal(name, amount)
81
+ insert_food(name, amount)
82
+ end
83
+
84
+ def proteina(name, amount)
85
+ insert_food(name, amount)
86
+ end
87
+
88
+ def aceite(name, amount)
89
+ insert_food(name, amount)
90
+ end
91
+
92
+ def to_s
93
+ puts @name
94
+
95
+ i = 0
96
+ while(i < @name.size)
97
+ print "="
98
+ i = i + 1
99
+ end
100
+ puts
101
+ puts "Composición nutricional:"
102
+ puts " Glúcidos Proteínas Lípidos Valor energético Valor porcion"
103
+
104
+ @alimentos.map{|x| print x[0], "%8s" % x[1], "\n"}
105
+ print "Valor energético total: ", "%44s" % @total
106
+
107
+ end
108
+ end