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 sechsten Frage (Einige Summen) von "At Coder Beginners Selection". https://atcoder.jp/contests/abs
Von ganzen Zahlen zwischen 1 und N. Suchen Sie die Summe derjenigen, die größer oder gleich A und kleiner oder gleich B in Dezimalschreibweise sind.
Zwang 1 ≤ N ≤ 10,000 1 ≤ A ≤ B ≤ 36 Alle Eingaben sind ganze Zahlen
Die Eingabe erfolgt in folgender Form.
N A B
#Beispiel
20 2 5
Ausgabebeispiel
#Im Fall des obigen Beispiels
=> 84
Von den ganzen Zahlen von 20 oder weniger beträgt die Summe jeder Ziffer 2 oder mehr und 5 oder weniger Es ist 2,3,4,5,11,12,13,14,20. Ausgänge 84, das ist die Summe davon.
Zunächst aus meiner Antwort.
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
Die Methoden, die ich bei der Beantwortung dieser Frage gelernt habe, sind unten zusammengefasst.
Ich habe es verwendet, als ich Eingaben erhielt. Indem ich es diesmal in jeder Anweisung verwendete, konnte ich es wieder als Methode der String-Klasse erkennen. Die Antwort besteht darin, es einmal in einen String-Typ zu konvertieren, die Split-Methode zu verwenden und dann in den Integer-Typ zurückzukehren.
#Beispiel
print "1234".split("")
=> ["1", "2", "3", "4"]
self.between?(min, max)
#Selbst ist zwischen min und max (min,Gibt true zurück, wenn (einschließlich max)
#Beispiel
print 6.between?(1, 5)
=> false
Mit dieser Methode, die den Minimal- und Maximalwert angibt und true zurückgibt, wenn self innerhalb dieses Bereichs liegt, Es wird beurteilt, ob die Summe jeder Ziffer im Bereich von a oder mehr und b oder weniger liegt.
Lassen Sie uns die Antwort der anderen Person sehen.
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(&:+)
Bis zum Empfang der Eingabe entspricht dies fast der Antwort ①. Betrachtet man den Fluss danach, (1) Verwenden Sie die include? -Methode, um zu bestimmen, ob die Summe jeder Ziffer der Ganzzahl größer oder gleich a und kleiner als oder gleich b ist. (2) Verwenden Sie für übergebene Ganzzahlen (1) die select-Methode, um ein neues Array zu erstellen und es hinzuzufügen. (3) Wenn alle Ganzzahlen verfügbar sind, die die Bedingungen erfüllen, verwenden Sie am Ende die Injektionsmethode, um die Summe der Ganzzahlen zu ermitteln und auszugeben.
Hier ist eine kurze Zusammenfassung der hier verwendeten Methoden.
Gibt true zurück, wenn sich das Objekt innerhalb des Bereichs befindet.
#Beispiel
print (1..5).include?(4)
=> true
Ruft die Elemente ab, die den Kriterien entsprechen, und gibt sie als neues Array zurück.
#Beispiel
print [1,2,3,4,5].select { |num| num > 3 }
=> [4, 5]
Bisher habe ich die Methoden vorgestellt, die ich beim Lösen von AtCoder Beginners Selection [Some Sums] gelernt habe.
Wenn Sie Fehler haben, wäre ich Ihnen dankbar, wenn Sie darauf hinweisen könnten.
Recommended Posts