[Anfänger] Lösen wir das AtCoder-Problem mit Ruby, während wir uns den Artikel ansehen!

Einführung

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.

Teilen Sie die eingegebene Zeichenfolge (Fehlerbeispiel)

gets.split('')
aaa
=> ["a", "a", "a", "\n"]

/ n ist enthalten.

Teilen Sie die eingegebene Zeichenfolge (Erfolgsbeispiel)

gets.chomp.split('')
aaa
=> ["a", "a", "a"]

Ich konnte es durch Einfügen von Chomp in ein schönes Gefühl aufteilen.

So geben Sie Zahlen ein (Fehlerbeispiel)

gets.chomp
1
=> "1"

Die Eingabe ist eine Zeichenfolge.

So geben Sie Zahlen ein (Erfolgsbeispiel)

gets.to_i
1
=> 1

get wird als String eingegeben.

So geben Sie ein nummeriertes Array ein a

gets.split.map(&:to_i)
1 2 3
=> [1, 2, 3]

Bitte geben Sie für jede Nummer ein Leerzeichen ein.

So erstellen Sie mehrere verschachtelte Sequenzen

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.

Eine Eingabemethode + N-maliges Wiederholen, um ein Array von Eingabewerten zu erstellen

N = gets.to_i
3
=> 3
b = N.times.map{gets.to_i}
1
2
3
=> [1, 2, 3]

So bestimmen Sie, ob es gerade oder ungerade ist

a = 2
=> 2

a.even?
=> true

a.odd?
=> false

Bestimmen Sie, ob gerade? Ist gerade ungerade? Bestimmt, ob es ungerade ist.

Überprüfen Sie die Länge der Variablen

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.

Ermitteln Sie den absoluten Wert einer Zahl

a = -10
=> -10

a
=> -10

a.abs
=> 10

Schreiben Sie einen ternären Operator

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!

Geben Sie die Maximal- und Minimalwerte im Array aus

a = [0, 1 ,2, 3]
=> [0, 1, 2, 3]

 a.min
=> 0

a.max
=> 3

Beseitigen Sie Duplikate im Array

 a = [1, 1, 2, 2, 3]
=> [1, 1, 2, 2, 3]

a.uniq
=> [1, 2, 3]

Geben Sie den Gesamtwert im Array aus

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!

Am Ende des Arrays hinzufügen

 a = []
=> []

 a << 1
=> [1]

 a << 2
=> [1, 2]

a << 3
=> [1, 2, 3]

Löschen Sie das Ende des Arrays

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

Löschen Sie die angegebene Nummer im Array

 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

Geben Sie das Ende des Arrays an

 a = [1, 1, 2, 2, 3]
=> [1, 1, 2, 2, 3]

 a[-1]
=> 3

Ruft ein Array angegebener Zahlen ab


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

Verlassen Sie die Schleife, wenn der Wert des Arrays erreicht ist

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.

Rückgabe von true, wenn alle Elemente des Arrays true sind

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.

Sortieren Sie das Array + wechseln Sie von aufsteigend zu absteigend

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

Löschen Sie das erste Element des Arrays

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

Extrahieren Sie das erste Element des Arrays

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.

Wie man bei einem bestimmten Wert zählt

a = [1, 2, 3, 4]

count = 0

a.each do |i|
  if i == 1
    count += 1
  end
end

puts count

=>1

Bedingte Verzweigung, wenn sie durch einen bestimmten Wert teilbar ist

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

Wie man so lange schleift, bis es wahr ist

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.

Fügen Sie Arrays zu einer Zeichenfolge hinzu

a = ["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]

 a.join
=> "abcd"

Finden Sie heraus, wie viele angegebene Zeichen vorhanden sind, nachdem Sie die Arrays zu einer Zeichenfolge zusammengefügt haben

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

Geben Sie den Inhalt und den Index des Array-Blocks an (Wert, der jedes Mal wiederholt wird).

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.

So erstellen Sie ein eindimensionales oder zweidimensionales Array

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

Wiederholen Sie eine Zeichenfolge mehrmals.

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.

Zahlen abschneiden, aufrunden, abrunden

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

Maximale und minimale Zusagen von Zahlen

#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

Ob mit Puts, P oder Print ausgegeben werden soll

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

Ruft den Index des Werts ab, der die Indexmethode ist

#String
a = ["3","4"]
=> ["3", "4"]

 a
=> ["3", "4"]

a.index("3")
=> 0

a.index("4")
=> 1

Anwendung

Array-Multiplikation

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

Verwenden Sie to_d, da ein Fehler auftritt, wenn to_f als Dezimalpunkt verwendet wird.

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

Primfaktorisierung durchführen

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

Holen Sie sich alle Muster in einem Array (Reihenfolge)

 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!

Löschen Sie das angegebene Zeichen in der Zeichenfolge mehrmals

n = "testrestdest"
=> "testrestdest"

a
=> ["test", "rest", "pest", "dest"]

a.each do |i|
  n.gsub!(/#{i}/, '')
end

n
=> ""

Alles verschwand Es ist destruktiv mit gsub!

Lösen Sie, ohne das Array zu durchsuchen

#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

Achten Sie auf absolute Zahlen, wenn Sie auf einer geraden Linie sind!

a und b sind die ersten Koordinaten

a = 1
=> 1

a = -2
=> -2

 a - b
=> -5

(a - b).abs
=> 5

Ein Wert, der vom Eingabewert [Winkel] in einer linearen Funktion zur ursprünglichen Position zurückkehrt

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

[Anfänger] Lösen wir das AtCoder-Problem mit Ruby, während wir uns den Artikel ansehen!
[Bei Coder] Lösen Sie das ABC183 D-Problem mit Ruby
[Bei Coder] Lösen Sie das ABC182 D-Problem mit Ruby
[Competition Pro] Löse Rucksackprobleme mit Ruby
Lösen wir das FizzBuzz-Problem!
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Lösen mit Ruby AtCoder ABC177 D Union Find
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
AtCoder Anfängerwettbewerb 169 A, B, C mit Rubin
AtCoder ABC127 D Hash mit Ruby 2.7.1 zu lösen
Löse das diskrete Logarithmusproblem mit einem beliebigen Mod
AtCoder Beginner Contest 182 Teilnahmeartikel
AtCoder Anfängerwettbewerb 132 D Problem
[Ruby] Problem mit der if-Anweisung
Lösen mit Ruby AtCoder ACL Anfängerwettbewerb C Union Find (DSU)