Apprendre Ruby avec la sélection des débutants AtCoder [Coins] Réponse avec un code court

introduction

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

problème

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

répondre

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 déclaration

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.

méthode push

Objet Array.push(élément, …)

La méthode push ajoute l'élément spécifié à la fin du tableau.

méthode du produit

#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.

chaque méthode

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.

méthode d'injection

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

Répondre avec un code court

De là, je vais abréger cette réponse.

Reçoit plusieurs entrées entières disposées verticalement

A, B, C, x = 4.times.map{gets.to_i}

méthode des temps

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!

Utilisez l'entier saisi pour un jugement direct sans générer de tableau

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
    }
  }
}

Achevée

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.

finalement

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

Apprendre Ruby avec la sélection des débutants AtCoder [Coins] Réponse avec un code court
Formater Ruby avec VS Code
Apprendre Ruby avec la sélection des débutants AtCoder [Quelques sommes] Augmentez les méthodes qui peuvent être utilisées
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
Résolution avec Ruby AtCoder ABC177 D Union Find
Apprendre Ruby avec AtCoder 7 [Contest 168 Triple Dots]
Apprenez de «Et alors», les bases de Java [pour les débutants]