Dans le cadre de l'apprentissage de Ruby, nous mettrons au défi la «programmation de concours (compétition pro)». Nous sortirons ce que nous avons appris dans l'apprentissage à cette fin. Cette fois à partir de la sixième question (Quelques sommes) de "Chez Coder Beginners Selection". https://atcoder.jp/contests/abs
D'entiers entre 1 et N Trouvez la somme de ceux qui sont supérieurs ou égaux à A et inférieurs ou égaux à B en notation décimale.
Contrainte 1 ≤ N ≤ 10,000 1 ≤ A ≤ B ≤ 36 Toutes les entrées sont des entiers
L'entrée est donnée sous la forme suivante.
N A B
#Exemple
20 2 5
Exemple de sortie
#Dans le cas de l'exemple ci-dessus
=> 84
Parmi les nombres entiers de 20 ou moins, la somme de chaque chiffre est de 2 ou plus et de 5 ou moins Il est 2,3,4,5,11,12,13,14,20. Sorties 84, qui est la somme de celles-ci.
Tout d'abord, d'après ma réponse.
n, a, b = gets.split(" ").map(&:to_i)
r = 0
(1..n).each do |i|
r += i if i.to_s.split("").map(&:to_i).inject(:+).between?(a, b)
end
print r
Les méthodes que j'ai apprises en répondant à cette question sont résumées ci-dessous.
J'avais l'habitude de l'utiliser lorsque je recevais des entrées, En l'utilisant dans chaque instruction cette fois, j'ai pu la reconnaître à nouveau comme une méthode de la classe String. La réponse est de le convertir une fois en type String, d'utiliser la méthode de fractionnement, puis de le renvoyer au type Integer.
#Exemple
print "1234".split("")
=> ["1", "2", "3", "4"]
self.between?(min, max)
#self est compris entre min et max (min,Renvoie vrai si (y compris max)
#Exemple
print 6.between?(1, 5)
=> false
En utilisant cette méthode, qui spécifie les valeurs minimum et maximum et renvoie true si self est dans cette plage, Il est jugé si la somme de chaque chiffre est dans la plage de a ou plus et b ou moins.
Voyons la réponse de l'autre personne.
n, a, b = gets.split.map(&:to_i)
puts (1..n).select{|e|(a..b).include?(e.to_s.chars.map(&:to_i).inject(&:+))}.inject(&:+)
Jusqu'au point de réception de l'entrée, c'est presque la même chose que la réponse ①. En regardant le flux après ça, (1) Utilisez la méthode include? Pour déterminer si la somme de chaque chiffre de l'entier est supérieure ou égale à a et inférieure ou égale à b. (2) Pour les entiers qui ont passé (1), utilisez la méthode select pour créer un nouveau tableau et l'ajouter à celui-ci. (3) Lorsque tous les entiers qui remplissent les conditions sont disponibles, utilisez la méthode inject à la fin pour trouver la somme des entiers et la sortir.
Voici un bref résumé des méthodes utilisées ici.
Renvoie true si l'objet est à portée.
#Exemple
print (1..5).include?(4)
=> true
Obtient les éléments qui correspondent aux critères et les renvoie sous la forme d'un nouveau tableau.
#Exemple
print [1,2,3,4,5].select { |num| num > 3 }
=> [4, 5]
Jusqu'à présent, j'ai présenté les méthodes que j'ai apprises en résolvant AtCoder Beginners Selection [Some Sums].
Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.
Recommended Posts