Ich habe AtCoder mit Ruby gestartet. Das war lustig und süchtig machend, und es war der Moment, in dem ich den Spaß am Programmieren von ganzem Herzen erkannte.
Nun, ich bin kein Programmierer, Hier sind einige Tipps, die Sie kennen sollten, um mit AtCoder zu beginnen. Ich denke, dass Sie es schaffen können, zu kämpfen, indem Sie AtCoder in Bezug auf Folgendes herausfordern.
Durch das Studium von AtCoder-Algorithmen Ich hoffe, es vermittelt den Spaß von Ruby und den Spaß am Programmieren.
Ich kann A und B normal lösen, und manchmal kann C gelöst werden, Wenn Sie sich das Folgende ansehen und es anwenden, wird es wahrscheinlich auf dem gleichen Niveau sein. ..
Bis auf mysteriöse Algorithmen und Formeln Die Grundlagen sind alle folgenden Anwendungen.
gets.split('')
aaa
=> ["a", "a", "a", "\n"]
/ n ist enthalten.
gets.chomp.split('')
aaa
=> ["a", "a", "a"]
Ich konnte es durch Einfügen von Chomp in ein schönes Gefühl aufteilen.
gets.chomp
1
=> "1"
Die Eingabe ist eine Zeichenfolge.
gets.to_i
1
=> 1
get wird als String eingegeben.
gets.split.map(&:to_i)
1 2 3
=> [1, 2, 3]
Bitte geben Sie für jede Nummer ein Leerzeichen ein.
3.times.map{gets.split.map(&:to_i)}
1 2 3
1 2 3
1 2 3
=> [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
Sie haben jetzt ein verschachteltes Array mit mehreren Zahlen.
N = gets.to_i
3
=> 3
b = N.times.map{gets.to_i}
1
2
3
=> [1, 2, 3]
a = 2
=> 2
a.even?
=> true
a.odd?
=> false
Bestimmen Sie, ob gerade? Ist gerade ungerade? Bestimmt, ob es ungerade ist.
a = "aaaa"
=> "aaaa"
a.size
=> 4
a.length
=> 4
a = [1,2]
=> [1, 2]
a.size
=> 2
a.length
=> 2
Größe und Länge sind gleich. Sie können auch Zeichenfolgen anordnen.
a = -10
=> -10
a
=> -10
a.abs
=> 10
if true
puts "Yes"
else
puts "No"
end
#Das Obige kann in einer Zeile geschrieben werden
puts true ? "Yes": "No"
Dies wird oft in Frage A gesehen, also denken Sie daran!
a = [0, 1 ,2, 3]
=> [0, 1, 2, 3]
a.min
=> 0
a.max
=> 3
a = [1, 1, 2, 2, 3]
=> [1, 1, 2, 2, 3]
a.uniq
=> [1, 2, 3]
a = [1, 1, 2, 2, 3]
=> [1, 1, 2, 2, 3]
a.sum
=> 9
a.inject(:+)
=> 9
#Anmerkungen: Die Multiplikation ist wie folgt
a.inject(:*)
=> 12
Entweder Summe oder Injektion ist in Ordnung. Wenn es sich um die Ruby2.3.3-Serie handelt, können Sie möglicherweise keine Summe verwenden!
a = []
=> []
a << 1
=> [1]
a << 2
=> [1, 2]
a << 3
=> [1, 2, 3]
a = [1,2,3]
=> [1, 2, 3]
a.delete_at(-1)
=> 3
a
=> [1, 2]
Praktisch, da Sie die Position eines Arrays angeben können
a = [1,2,3]
=> [1, 2, 3]
a.delete(1)
=> 1
a
=> [2, 3]
a = [1,1,2,3]
=> [1, 1, 2, 3]
a.delete(1)
=> 1
a
=> [2, 3]
Ich habe es anders geschrieben als delete_at, Es kann selten vorkommen, dass die angegebene Nummer gelöscht wird Ich sehe oft doppelte Entfernung mit uniq
a = [1, 1, 2, 2, 3]
=> [1, 1, 2, 2, 3]
a[-1]
=> 3
#Nehmen Sie den 5. heraus
n = 5
=> 5
a = [1, 1, 2, 2, 3]
=> [1, 1, 2, 2, 3]
a[n]
=> nil
a[n - 1]
=> 3
Das Array beginnt bei 0, Sie müssen also -1.
a = [1, 2, 3, 4]
a.each do |i|
if i == 2
puts i
break
end
end
Der Unterschied zwischen Break und Return besteht übrigens darin, ob die Schleife oder die Methode verlassen werden soll. Return kann nur innerhalb einer Methode verwendet werden.
a = [2,2,2,2]
=> [2, 2, 2, 2]
a.all?{|n| n.even?}
=> true
a
=> [2, 2, 2, 2]
a.all?{|n| n == 2}
=> true
a = [2,2,2,3]
=> [2, 2, 2, 3]
a.all?{|n| n == 2}
=> false
Gibt true zurück, da alle Elemente des Arrays gerade sind.
a = [3,1,2]
=> [3, 1, 2]
a.sort
=> [1, 2, 3]
a.sort.reverse
=> [3, 2, 1]
#Übrigens die Zeichenketten im Array. ..
a = [ "aaa", "ccc","bbb"]
=> ["aaa", "ccc", "bbb"]
a.sort
=> ["aaa", "bbb", "ccc"]
a.sort.reverse
=> ["ccc", "bbb", "aaa"]
Sehen Sie ziemlich viel
a = [5,6,7]
=> [5, 6, 7]
a.drop(1)
=> [6, 7]
#Es scheint nicht destruktiv zu sein.
a
=> [5, 6, 7]
a.drop(1)
=> [6, 7]
a.drop(2)
=> [7]
a.drop(3)
=> []
Tropfen scheint nicht destruktiv zu sein
a[0]
=> 5
a.shift
=> 5
#↑ Gleich?
a = [5,6,7]
=> [5, 6, 7]
a.shift
=> 5
a.shift
=> 6
a.shift
=> 7
a = [5,6,7]
=> [5, 6, 7]
a[0]
=> 5
a[0]
=> 5
Verschiebung scheint destruktiv. Ich dachte es wäre das gleiche.
a = [1, 2, 3, 4]
count = 0
a.each do |i|
if i == 1
count += 1
end
end
puts count
=>1
k = 2
a, b = [1, 3]
(a..b).each do |c|
if c % k == 0
puts 'OK'
break
end
if c == b
puts 'NG'
end
end
x = 2
yen = 100
count = 0
while yen > x do
yen += yen / 100
count = count + 1
end
puts count
While wird so lange wiederholt, wie es wahr bleibt. Sie brauchen keinen bedingten Ausdruck, brechen Sie sich einfach Wenn Sie beenden und beenden möchten, verwenden Sie loop do ... end! Natürlich ist das Ende in Ordnung, solange es wahr ist.
a = ["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]
a.join
=> "abcd"
a = ["a","b","a","b","a"]
=> ["a", "b", "a", "b", "a"]
a.join
=> "ababa"
a.join.scan("ab")
=> ["ab", "ab"]
#des Weiteren"ab"Nehmen Sie die Nummer von heraus.
a.join.scan("ab").length
=> 2
Es scheint, dass Scan ziemlich gut verwendet werden kann. ..
c = gets.chomp
alf = []
("a".."z").each do |i|
alf << i
end
#Geben Sie den Inhalt und den Index des Arrays als Blöcke an
alf.each_with_index do |k, i|
if k == c
puts alf[i+1]
break
end
end
Wenn nur k verwendet wird, wird der Inhalt des Arrays "a", "b" ... "z" extrahiert. Sie können keinen Index angeben, oder? each.with.Index verwenden|k, i|Dann Sie können den Index des Arrays in i angeben. Es ist 0 in alf [0]. Der Inhalt des tatsächlichen Arrays ist k.
a = Array.new(3)
=> [nil, nil, nil]
a = Array.new(3).map{Array.new(3, 0)}
=> [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
a[0][1] = 1
=> 1
a
=> [[0, 1, 0], [0, 0, 0], [0, 0, 0]]
a[2][1] = 1
=> 1
a
=> [[0, 1, 0], [0, 0, 0], [0, 1, 0]]
a[2][0] = 1
=> 1
a
=> [[0, 1, 0], [0, 0, 0], [1, 1, 0]]
Es ist kompliziert, wenn es um zwei Dimensionen geht
a = 2
=> 2
b = 3
=> 3
a.to_s * b
=> "222"
Die Eingabe von a als Zahl wird in eine Zeichenfolge umgewandelt und b wird dreimal wiederholt.
a = 1.4
=> 1.4
a.floor
=> 1
a.ceil
=> 2
a.round
=> 1
a =1.5
=> 1.5
a.floor
=> 1
a.ceil
=> 2
a.round
=> 2
#Maximales Engagement
4.gcd(2)
=> 2
4.gcd(4)
=> 4
4.gcd(6)
=> 2
#Minimales gemeinsames Vielfaches
4.lcm(2)
=> 4
4.lcm(4)
=> 4
4.lcm(6)
=> 12
Zunächst einmal sind Puts gut. Die Antwort stimmt nicht überein, da p "" hat.
a = "aaa"
=> "aaa"
p a
"aaa"
=> "aaa"
puts a
aaa
=> nil
print a
aaa=> nil
#String
a = ["3","4"]
=> ["3", "4"]
a
=> ["3", "4"]
a.index("3")
=> 0
a.index("4")
=> 1
n = gets.to_i
a = gets.split.map(&:to_i)
sum = 1
#Grundsätzlich mit jedem drehen, aber beachten Sie, dass die Multiplikation 0 enthält
a.each do |i|
if i == 0
sum = 0
break
end
#Summe für große Zahlen<=Lass uns machen 〇〇!
sum *= i if sum <= 〇〇
end
require 'bigdecimal'
require 'bigdecimal/util'
l = gets.chomp.split(" ")
a = l[0].to_i
#to_Es scheint, dass ein Fehler auftritt, wenn er auf f gesetzt ist
#Die Antwort stimmt möglicherweise nicht überein.
b = l[1].to_d
puts (b * a).floor
require 'prime'
a = 100
=> 100
n = a.prime_division
=> [[2, 2], [5, 2]]
#[[2, 2], [5, 2]]Ist"(2**2) * (5**2) = 100"Das bedeutet
#Da es sich um ein zweidimensionales Array handelt, geben Sie zwei Elemente an
n.each do |i, k|
puts i
puts k
end
2
2
5
2
=> [[2, 2], [5, 2]]
n = 3
=> 3
a = [1,2,3]
=> [1, 2, 3]
a.permutation(n).to_a
=> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
Sehr angenehm!
n = "testrestdest"
=> "testrestdest"
a
=> ["test", "rest", "pest", "dest"]
a.each do |i|
n.gsub!(/#{i}/, '')
end
n
=> ""
Alles verschwand Es ist destruktiv mit gsub!
#Atcoder149B
#https://atcoder.jp/contests/abc149/tasks/abc149_b
a,b,k = gets.chomp.split.map(&:to_i)
k.times do
if a >= 1
a = a - 1
elsif b >= 1
b = b- 1
elsif a = 0 && b = 0
end
end
puts "#{a} #{b}"
#Die Zeit ist um
a, b, k = gets.split().map(&:to_i)
if a >= k
puts "#{a-k} #{b}"
elsif a+b <= k
puts "#{0} #{0}"
else
puts "#{0} #{b-(k-a)}"
end
#OK
a und b sind die ersten Koordinaten
a = 1
=> 1
a = -2
=> -2
a - b
=> -5
(a - b).abs
=> 5
x = gets.to_i
puts 360.lcm(x) / x
Wenn die Zahl durch 360 Grad teilbar ist, können Sie sie normal teilen. Wenn der Wert nicht durch 360 Grad teilbar ist, ermitteln Sie das gemeinsame Mindestmultiplikator von 360 Grad. Es scheint, dass Sie es brechen müssen.
Recommended Posts