2013-09-28 2 views
1

Comment puis-je multiplier un nombre dans un tableau par sa position dans le tableau, puis additionner la somme du tableau dans ruby? Je ne comprends pas comment accéder à l'index du tableau dans la fonction de carteComment puis-je multiplier un nombre dans un tableau par sa position dans le tableau, puis additionner la somme du tableau dans ruby?

Par exemple: comment puis-je obtenir [5, 7, 13, 2] aller à [5 * 0, 7 * 1 , 13 * 2, 2 * 3] puis obtenir la somme de ce tableau.

-à-dire

def array_method (numbers) 
    numbers.map{|i| i* ?????} 
end 
array_method([5, 7, 13, 2]) 

cela ne fonctionne pas, soit son retour un tableau vide et je ne sais pas ce que je fais mal.

+0

Vous n'utilisez pas du tout votre paramètre dans votre méthode. Vérifiez ce que 'map' renvoie également dans les documents. – squiguy

+0

Vous n'avez pas utilisé de nombres dans votre méthode. Et si du tout vous l'aviez utilisé avec ce que vous avez écrit, vous auriez un tableau ayant tous les nombres entiers incrémentés de 1. – AshwinKumarS

+0

ok j'ai référencé les nombres dans la méthode mais je ne sais toujours pas comment appeler l'index dans le array.map numbers.map {| i | i *? (connaître son index mais je n'arrive pas à comprendre comment le référencer.)} – wfmonster

Répondre

1
[5,7,13,2].each_with_index.map{|value,index|value*index}.reduce{|a,b|a+b} 
+0

mais comment définir une méthode dans laquelle je peux l'utiliser sur n'importe quel tableau – wfmonster

+0

@wfmonster 'def doit (arr) arr.each_with_index .map {| valeur, index | valeur * index} .reduce {| a, b | a + b} fin' –

4

Vous pouvez singe patcher la classe Array si vous voulez que la méthode soit disponible à tous les tableaux:

class Array 
    def sum_with_index 
    self.map.with_index { |element, index| element * index }.inject(:+) 
    end 
end 

Sortie de la console

2.0.0-p247 :001 > [5, 7, 13, 2].sum_with_index 
=> 39 
+0

Belle solution. Mais duno pourquoi je ne suis pas un grand fan de monkeypatching :) – AshwinKumarS

+2

Cela dépend vraiment du contexte. Si vous créez une nouvelle méthode plutôt que d'en remplacer une existante, et que vous avez besoin qu'elle soit disponible pour toutes les instances de cette classe, elle est plutôt propre. – depa

0

Utiliser l'injection

def dot_product_with_index(array) 
    (0..array.count-1).inject(0) {|r,i| r + array[i]*i} 
end 
3
[5,7,13,2].map.with_index(&:*).inject(:+) 
# => 39 
+1

+1. Bien fait. Le vieux symbole-proc "hack" sûr a simplifié Ruby. –

1
def array_method (numbers) 
    ans = 0 
    numbers.each_with_index {| num, idx | ans += (idx) * num } 
end 
Questions connexes