Wir werden "Competition Programming (Competition Pro)" als Teil des Lernens von Ruby herausfordern. Wir werden das, was wir beim Lernen gelernt haben, zu diesem Zweck ausgeben. Diesmal aus der fünften Frage (Münzen) von "At Coder Beginners Selection". https://atcoder.jp/contests/abs
Ich habe A für 500 Yen, B für 100 Yen und C für 50 Yen. Wie viele Möglichkeiten gibt es, einige dieser Münzen auszuwählen und den Gesamtbetrag X Yen zu machen? Münzen des gleichen Typs können nicht voneinander unterschieden werden.
Zwang 0 ≤ A,B,C ≤ 50 A + B + C ≥ 1 50 ≤ X ≤ 20,000 A, B, C sind ganze Zahlen. X ist ein Vielfaches von 50.
Die Eingabe erfolgt in folgender Form.
A
B
C
X
#Beispiel
2
2
2
100
Ausgabebeispiel
#Im Fall des obigen Beispiels
=> 2
Es gibt zwei Möglichkeiten, die Bedingungen auszuwählen. 0 Blatt für 500 Yen, 1 Blatt für 100 Yen, 0 Blatt für 50 Yen 0 für 500 Yen, 0 für 100 Yen, 2 für 50 Yen
Zuerst ist der Code, den ich zuerst geschrieben habe.
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) Generieren Sie für jeden Münztyp ein Array mit dem Geldbetrag, der von 0 bis n ausgewählt werden kann (für ~ do ~ end).
Ich antwortete im obigen Ablauf. Die Methoden, die ich bei der Beantwortung dieser Frage gelernt habe, sind unten zusammengefasst.
für Variable im Objekt tun
Auszuführender Prozess
end
Gibt den Bereich an, der für das Objekt wiederholt werden soll. Die Antwort ist ein Bild, in dem Sie 0, 1 und 2 Münzen in der Reihenfolge von 0 bis zur Anzahl der Münzen herausnehmen und in eine Variable einfügen. Danach wird der im Block angegebene Vorgang wiederholt. In der Antwort wird der Geldbetrag entsprechend der Anzahl der Blätter in dem unmittelbar zuvor generierten Array in der richtigen Reihenfolge angeordnet.
Array-Objekt.push(Element, …)
Die Push-Methode fügt das angegebene Element am Ende des Arrays hinzu.
#Beispiel
[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]]
Gibt ein Array zurück, das alle Elemente mehrerer Arrays kombiniert.
Array-Objekt.each do |Variable|
Auszuführender Prozess
end
Nehmen Sie die Elemente einzeln aus dem Array, weisen Sie sie Variablen zu und dann Führt die angegebene Verarbeitung für die Anzahl der Elemente aus.
Berechnet die Summe der Elemente für das Array und gibt sie zurück. Dieses Mal verwenden wir die Notation mit dem Symbol (: +).
#Beispiel
array = [1, 2, 3]
result = array.inject(:+)
print result
=> 6
Ich habe es herausgefunden, indem ich es erneut untersucht habe, aber es scheint, dass es einfacher ist, mit der Summenmethode zu schreiben.
#Beispiel
array = [1, 2, 3]
result = array.sum
print result
=> 6
Von hier aus werde ich diese Antwort verkürzen.
A, B, C, x = 4.times.map{gets.to_i}
Es wird verwendet, um den Vorgang eine bestimmte Anzahl von Malen zu wiederholen.
#Beispiel
3.times { puts "Hello, World!" }
=>Hello, World!
=>Hello, World!
=>Hello, World!
Die Antwort war, ein Array zu generieren und den Geldbetrag für alle Muster hinzuzufügen. Dies machte die Antwort sehr lang. Die Länge des Codes wurde durch Verwendung der eingegebenen Ganzzahl reduziert, da dies zur Beurteilung unter Verwendung jeder Anweisung dient.
(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
Der Code, der 32 Zeilen mit Leerzeichen hatte, besteht jetzt aus 9 Zeilen.
Bisher haben wir die Methoden und Notationen vorgestellt, die aus dem Ruby-Lernen [Münzen] bei AtCoder Beginners Selection gelernt wurden. Ich möchte immer üben, wie diesmal mit einem Funktionscode zu antworten. Einige von ihnen antworteten auf die Antworten anderer Personen und antworteten in einer Zeile. Es ist ein langer Weg, aber es lohnt sich auch!
Wenn Sie Fehler haben, wäre ich Ihnen dankbar, wenn Sie darauf hinweisen könnten.
Recommended Posts