Lernen Sie Ruby mit AtCoder Anfänger Auswahl [Münzen] Antworten Sie mit Funktionscode

Einführung

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

Problem

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

Antworten

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.

zur Aussage

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.

Push-Methode

Array-Objekt.push(Element, …)

Die Push-Methode fügt das angegebene Element am Ende des Arrays hinzu.

Produktmethode

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

jede Methode

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.

Injektionsmethode

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

Antworte mit einem Funktionscode

Von hier aus werde ich diese Antwort verkürzen.

Empfängt mehrere vertikal angeordnete ganzzahlige Eingaben

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

mal Methode

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!

Verwenden Sie die eingegebene Ganzzahl zur direkten Beurteilung, ohne ein Array zu generieren

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

Komplett

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.

Schließlich

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

Lernen Sie Ruby mit AtCoder Anfänger Auswahl [Münzen] Antworten Sie mit Funktionscode
Formatieren Sie Ruby mit VS-Code
Lernen Sie Ruby mit AtCoder Anfänger Auswahl [Einige Summen] Erhöhen Sie die Methoden, die verwendet werden können
Ruby mit AtCoder 6 lernen [Contest 168 Daher]
Lösen mit Ruby AtCoder ABC177 D Union Find
Ruby mit AtCoder 7 lernen [Contest 168 Triple Dots]
Lernen Sie aus "Na und", den Grundlagen von Java [für Anfänger]