Étudier à CodeWar (ruby) ⑥ inject

À propos de cet article

Petit à petit, sortie de ce que j'ai appris grâce au Codewar récemment lancé

problème

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Finish the solution so that it returns the sum of all the multiples of 3 or 5 below the number passed in. Note: If the number is a multiple of both 3 and 5, only count it once. Also, if a number is negative, return 0(for languages that do have them)

Créez une méthode qui additionne les nombres inférieurs à 10 et est un multiple de 3 et 5 et renvoie cette valeur. Si le nombre est un multiple de 3 et 5 (un multiple de 15), ne comptez qu'une seule fois.

Ma réponse

Presque presque la réponse de FizzBuzz. https://qiita.com/Fendo181/items/425293e8e638d7fd7cea

def solution(number)
 i = 1
 nums_array = []
 number -= 1
 number.times do
   nums_array << i
   i += 1
 end
  
 sum = 0
 nums_array.each do |num|
   if num % 3 == 0 && num % 5 == 0
     sum += num
   elsif num % 3 == 0
     sum += num
   elsif num % 5 == 0
     sum += num
   end
 end
 sum
end

meilleur entrainement

«Je vois» et «Qu'est-ce que c'est?» Sont mélangés.

def solution(number)
  (1...number).select {|i| i%3==0 || i%5==0}.inject(:+)
end

Je vois ~

(1...number) Comme vous pouvez le voir dans l'énoncé du problème, je recherche le multiple correspondant avec un nombre inférieur à ** 10, donc je le donne comme «1 ... 10», qui n'inclut pas le dernier nombre. Au fait, si vous voulez inclure le dernier nombre, utilisez «1..10» et deux virgules.

select {|i| i%3==0 || i%5==0}

Chaque élément est évalué par blocs par select, et les éléments multiples de 3 ou 5 sont extraits. Même s'il s'agit d'un multiple de 15, il ne sera pas compté deux fois.

Qu'est-ce que c'est ça?

inject(:+) inject est une méthode qui se répète comme chacun et map. Autrement dit, nous essayons d'ajouter les résultats de l'extraction d'éléments qui sont des multiples de 3 ou 5 dans l'ordre. Il semble que les calculs itératifs soient souvent utilisés.

Utilisation de base

https://blog.toshimaru.net/ruby-inject/

Objet Array.inject {|valeur initiale,élément|Traitement des blocs}

array = 1..6
array.inject (0){ |sum,num| p sum+=num}

=>1
3
6
10
15
21

#inject(0)0 définit la valeur initiale de la somme.
#Cependant, comme le paramètre par défaut de l'argument inject est 0, il peut être omis comme indiqué ci-dessous.
#num est un élément du tableau

Qui est cet ʻinject (: +) `?

Une méthode pratique qui peut être abrégée comme suit en passant un opérateur sous forme de symbole.

array = 1..10
array.inject {|sum,num|  sum+=num}

=> 55

#Même résultat même si omis
array = 1..10
array.inject(:+)

=> 55

Résumé

J'avais l'habitude d'essayer de calculer dans ce bloc en utilisant la méthode ʻeach`, mais à l'avenir j'utiliserai la méthode inject lors du calcul par traitement itératif! !! !!

Recommended Posts

Étudier à CodeWar (ruby) ⑥ inject
Étudier à CodeWar (ruby) ②
Étudier chez CodeWar
Étudier à CodeWar (ruby) ③ squeeze, gsub
Étudier à CodeWar (ruby) ⑤ Proc
Étudier à CodeWar (ruby) ④ cas ~ quand
Algorithme Ruby (injection, définition de méthode)
Comment utiliser la méthode Ruby inject