Nous allons contester la «programmation de la compétition (compétition pro)» dans le cadre de l'apprentissage de Ruby. Nous sortirons ce que nous avons appris dans l'apprentissage à cette fin. Cette fois à partir de la cinquième question (Pièces) de "Chez Coder Beginners Selection". https://atcoder.jp/contests/abs
J'ai A pour 500 yens, B pour 100 yens et C pour 50 yens. De combien de façons existe-t-il pour choisir certaines de ces pièces et obtenir un montant total de X yens? Les pièces de même type ne peuvent pas être distinguées les unes des autres.
Contrainte 0 ≤ A,B,C ≤ 50 A + B + C ≥ 1 50 ≤ X ≤ 20,000 A, B, C sont des nombres entiers. X est multiple de 50.
L'entrée est donnée sous la forme suivante.
A
B
C
X
#Exemple
2
2
2
100
Exemple de sortie
#Dans le cas de l'exemple ci-dessus
=> 2
Il existe deux façons de sélectionner les conditions. 0 feuille pour 500 yens, 1 feuille pour 100 yens, 0 feuille pour 50 yens 0 pour 500 yens, 0 pour 100 yens, 2 pour 50 yens
Le premier est le code que j'ai écrit en premier.
a = gets.to_i
b = gets.to_i
c = gets.to_i
x = gets.to_i
count = 0
a_array = []
b_array = []
c_array = []
for i in 0..a do
a_array.push(500 * i)
end
for i in 0..b do
b_array.push(100 * i)
end
for i in 0..c do
c_array.push(50 * i)
end
all_array = a_array.product(b_array, c_array)
all_array.each do |one_array|
if one_array.inject(:+) == x
count += 1
end
end
print count
(1) Pour chaque type de pièce, générez un tableau avec le montant d'argent qui peut être sélectionné de 0 à n (pour ~ do ~ end).
J'ai répondu dans le flux ci-dessus. Les méthodes que j'ai apprises en répondant à cette question sont résumées ci-dessous.
pour la variable dans l'objet faire
Processus à exécuter
end
Spécifie la plage à répéter pour l'objet. La réponse est une image de prendre 0, 1 et 2 pièces dans l'ordre de 0 au nombre de pièces que vous avez et de les mettre dans une variable. Après cela, le processus spécifié dans le bloc est répété. Dans la réponse, le montant d'argent en fonction du nombre de feuilles est mis en ordre dans le tableau généré juste avant.
Objet Array.push(élément, …)
La méthode push ajoute l'élément spécifié à la fin du tableau.
#Exemple
[1,2].product([3,4],[5,6])
=> [[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]]
Renvoie un tableau qui combine tous les éléments de plusieurs tableaux.
Objet Array.each do |variable|
Processus à exécuter
end
Prenez les éléments un par un du tableau, attribuez-les à des variables, puis Exécute le traitement spécifié pour le nombre d'éléments.
Calcule et renvoie la somme des éléments du tableau. Cette fois, nous utilisons la notation utilisant le symbole (: +).
#Exemple
array = [1, 2, 3]
result = array.inject(:+)
print result
=> 6
Je l'ai découvert en examinant à nouveau, mais il semble qu'il soit plus facile d'écrire en utilisant la méthode de la somme.
#Exemple
array = [1, 2, 3]
result = array.sum
print result
=> 6
De là, je vais abréger cette réponse.
A, B, C, x = 4.times.map{gets.to_i}
Il est utilisé pour répéter le processus un nombre de fois spécifié.
#Exemple
3.times { puts "Hello, World!" }
=>Hello, World!
=>Hello, World!
=>Hello, World!
Dans la réponse, je faisais pour générer un tableau et ajouter le montant d'argent pour tous les modèles, Cela a rendu la réponse très longue. La longueur du code a été réduite en utilisant l'entier saisi comme c'est le cas pour le jugement en utilisant chaque instruction.
(0..A).each{|a|
(0..B).each{|b|
(0..C).each{|c|
x == (500*a + 100*b + 50*c) ? count +=1 : count += 0
}
}
}
A, B, C, x = 4.times.map{gets.to_i}
count = 0
(0..A).each{|a|
(0..B).each{|b|
(0..C).each{|c|
x == (500*a + 100*b + 50*c) ? count +=1 : count += 0
}
}
}
print count
Le code, qui avait 32 lignes avec des blancs, est maintenant de 9 lignes.
Jusqu'à présent, nous avons présenté les méthodes et les notations apprises grâce à l'apprentissage Ruby [Coins] chez AtCoder Beginners Selection. Je veux toujours m'entraîner à répondre avec un code court comme cette fois. En regardant les réponses d'autres personnes, certaines d'entre elles ont répondu en une seule ligne. C'est un long chemin à parcourir, mais c'est aussi gratifiant!
Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.
Recommended Posts