[At Coder] Einführung von Competitive Pro mit Ruby

Mein Name ist Yuya und ich bin ein Universitätsstudent im 4. Jahr (Stand Juli 2020). Ich mache wettbewerbsfähiges Programmieren (AtCoder) als Hobby. Ich wollte ein brauner Codierer werden und etwas ausgeben, also habe ich beschlossen, diesen Artikel zu schreiben.

Zielgruppe

Dieser Artikel richtet sich an Anfänger der Programmiersprache Ruby und an Wettkampfprofis. Ich schreibe über die grundlegende Grammatik und Methoden von Ruby sowie über die Grundlagen und Tipps von Wettkampfprofis.

Bitte beachten Sie, dass dies nur mein Schreibstil und meine Schreibmethode ist und daher möglicherweise nicht immer optimal ist.

Wenn Sie verstehen, was in diesem Artikel geschrieben steht, und einige Übungen lösen, sollten Sie in der Lage sein, die meisten A-Probleme von AtCoder (einfachstes Problem) und B-Probleme (zweitleichtestes Problem) zu lösen. ..

Über AtCoder

AtCoder ist die bekannteste Programmierwebsite für Wettbewerbe in Japan. Ich sage es, aber ich denke, es ist ** wahrscheinlich **.

Überblick

Samstags und sonntags findet jede Woche ab 21:00 Uhr ein Wettbewerbsprogrammwettbewerb statt. Fragen aus vergangenen Wettbewerben sind immer verfügbar.

Es gibt drei Haupttypen von Wettbewerben.

Je tiefer Sie gehen, desto schwieriger wird es. Grundsätzlich wird ABC oft gehalten.

Darüber hinaus kann ein Wettbewerb, der einem der oben genannten Schwierigkeitsgrade entspricht, von einem Unternehmen oder dergleichen durchgeführt werden. Es gibt einige, bei denen Sie einen Preis erhalten können, wenn Sie höher werden. (!)

Schwierigkeit des Problems

Grundsätzlich werden in jedem Wettbewerb ca. 6 Fragen gestellt. Sie heißen jeweils A, B, C, D, E, F. Je später es wird, desto schwieriger wird es.

Übrigens, wenn ich ein brauner Programmierer bin, kann ich die Probleme A und B fast jedes Mal lösen. Manchmal kann das C-Problem nicht gelöst werden, und das D-Problem wurde nie gelöst.

Ich habe den Eindruck, dass Sie nach dem C-Problem so etwas wie das Talent eines Wettkampfprofis brauchen und nach dem D-Problem das richtige Wissen benötigen.

Ich habe einen hilfreichen Artikel gefunden, daher werde ich das Ausmaß des Problems zitieren.

Tipps zum AtCoder-Wettbewerb

  • Ein Problem: Einfache Grammatikbestätigung, oft mit einer Punktzahl von 100 --B Problem: Einfach für die Anweisung, Verarbeitung einschließlich if-Anweisung, erzielte oft 200 Punkte, ähnlich wie bei Fizz Buzz --C Problem: Sie müssen mit viel Berechnung codieren, was häufig einer Punktzahl von 300 entspricht. --D Problem: Die Punktzahl beträgt häufig 400 Punkte, und ab diesem Zeitpunkt muss der Algorithmus untersucht werden. --E Problem: Dies ist ein ernstes und schwieriges Problem, das häufig eine Punktzahl von 500 hat. --F Problem: Die Punktzahl beträgt oft 600 Punkte, was es sofort schwierig macht. Wenn Sie nach Gelb streben, ist dies ein Problem, das Sie lösen möchten.

Farbe (Bewertung)

Jeder Benutzer erhält eine Bewertung und eine entsprechende Farbe, je nachdem, wie gut er auf den Wettbewerb reagiert hat. Ich zitiere aus diesem Artikel von Herrn Chokudai, dem Präsidenten von AtCoder.

AtCoder (Wettbewerbsprogrammierung) Bewertung von Farbe / Rang und Fähigkeiten, Problembeispiel

Alle 400 sind in der Reihenfolge Rot, Orange, Gelb, Blau, Wasser, Grün, Braun, Grau und Schwarz gefärbt.

Wenn Sie eine sehr grobe Bewertung ohne Angst vor Missverständnissen vornehmen möchten,

--Gray kann jeder sein, wenn Sie teilnehmen. Es gibt also keine andere Garantie als Motivation.

  • Wenn Sie Student und braun sind, ist es ausgezeichnet, aber als Ingenieur ist es ein wenig unbefriedigend. Es ist eine Erleichterung, wenn der Ingenieur, der per Versand gekommen ist, braun ist.
  • Grün ist für die meisten Unternehmen ausreichend. Obwohl es in Bezug auf AtCoder nicht hoch eingestuft ist, ist es die höchste Bewertung auf den Bewertungsseiten anderer Unternehmen.
  • Es besteht kein Zweifel an der grundlegenden Verarbeitungsleistung des Algorithmus, wenn er hellblau ist.
  • Blau und höher befinden sich auf einem Niveau, auf dem selbst einige börsennotierte IT-Unternehmen keine haben.
  • Ein Monster aus Gelb. Stellen Sie sich das als eine Maschine vor, die die Probleme wettbewerbsfähiger Profis löst. --Orange ist seltsam. --Red wurde bereits zu Weltwettbewerben eingeladen.

Grundwissen

Standardeingabe / -ausgabe

In wettbewerbsfähiger Programmierung Empfangen (eingeben) Sie den angegebenen Wert, Verarbeiten Sie es, um den gewünschten Wert (Ausgabe) zu erhalten. Diese werden als ** Standardeingabe / -ausgabe ** bezeichnet.

Ich werde jede Methode der Eingabe und Ausgabe erklären. Es gibt verschiedene Methoden, aber hier werde ich meine Methode vorstellen.

Eingang

Erhalten Sie den Wert mit "bekommt". Sie erhalten nun eine Wertzeile. Wenn mehrere Werte in einer Zeile angegeben sind, verwenden Sie "split", um sie zu empfangen.

#Eingang
# Hello

input = gets
puts input

#Ausgabe
# Hello
#Eingang
# Hello World

input = gets.split(" ") #Empfangen Sie als Array, getrennt durch Leerzeichen
puts input

#Ausgabe
# Hello
# World

Ausgabe

Die Ausgabe verwendet "Puts" wie im obigen Beispiel. Es gibt den Wert aus und unterbricht die Zeile.

Datentyp

Die von "get" empfangenen Werte werden als Zeichenfolgen behandelt. Wenn Sie also eine Nummer erhalten möchten, müssen Sie den Datentyp konvertieren. Hier verwenden wir to_i, weil es in einen numerischen Wert konvertiert wird.

#Eingang
# 10

input = gets.to_i
puts input + 5

#Ausgabe
# 15

Andere umfassen "to_f" für Bruchzahlen, "to_s" für die Konvertierung in Zeichenfolgen und "to_a" für die Konvertierung in Arrays.

Referenz

Wiederholung

Die Iterationen umfassen Folgendes:

Ich werde jedes mit konkreten Beispielen erklären.

times

Eine Methode für Zahlen. Wiederholen Sie die Anzahl dieser Male.

3.times do
    puts "Hello"
end

#Ausgabe
# Hello
# Hello
# Hello

each

Führen Sie für jeden von mehreren Werten aus.

["red", "blue", "green"].each do |color|
    puts color
end

#Ausgabe
# red
# blue
# green

while

Wiederholen Sie diesen Vorgang, solange der bedingte Ausdruck erfüllt ist. Wenn Sie einen Wert für einen bedingten Ausdruck verwenden möchten, vergessen Sie nicht, ihn zu aktualisieren.

i = 0
while i < 3
    puts i
    i += 1
end

#Ausgabe
# 0
# 1
# 2

loop

Ich denke, es ist am besten, dies nicht zu verwenden (** wenn es ** ist, schreibe es nicht **). Der Grund ist, dass Sie in einer Endlosschleife enden, wenn Sie es nicht entkommen lassen. Es kann verwendet werden, indem zwangsweise mit "Pause" beendet wird.

(Zusatz) Jede andere Schleife, nicht nur "Schleife", kann in eine Endlosschleife fallen. Es ist notwendig, einen Prozess zu schreiben, um die Schleife ordnungsgemäß zu verlassen und die Bedingungen sorgfältig festzulegen.

i = 0
loop do
    if i >= 3
        break
    end
    puts i
    i += 1
end

#Ausgabe
# 0
# 1
# 2

Bequeme Methode

Stringlänge, Anzahl der Elemente im Array

length und size geben die Länge des Strings und die Anzahl der Elemente im Array zurück.

str = "Hello"
puts str.length

#Ausgabe
# 5
arr = ["red", "blue", "green"]
puts arr.length

#Ausgabe
# 3

Beide geben das gleiche Ergebnis zurück, wenn "Länge" in "Größe" geändert wird.

Sortieren im Zusammenhang

sort, reverse

sort sortiert die Elemente des Arrays in aufsteigender Reihenfolge. reverse kehrt die Reihenfolge um.

arr = [3, 1, 2]
arr.sort
# [1, 2, 3]
arr = [3, 1, 2]
arr.sort.reverse
# [3, 2, 1]
arr = ["red", "blue", "green"]
arr.sort
# ["blue", "green", "red"]

Maximum, Minimum: max, min

Es gibt Methoden, die die Maximal- und Minimalwerte der Elemente des Arrays zurückgeben. Der Maximalwert ist "max" und der Minimalwert ist "min".

arr = [4, 5, 1, 3, 2]
puts arr.max
puts arr.min

#Ausgabe
# 5
# 1

Zuerst, zuletzt: zuerst, zuletzt

Es gibt eine Methode, die den ersten und den letzten Wert der Elemente des Arrays zurückgibt. Der erste ist "zuerst" und der letzte ist "zuletzt".

arr = [4, 5, 1, 3, 2]
puts arr.first
puts arr.last

#Ausgabe
# 4
# 2

Reihenfolge, Kombination

Bestellung mit Permutation, Sie können Kombinationen mit "Kombination" erzeugen. Wir verwenden auch eine Methode, die ein Array namens "to_a" erstellt.

arr = [1, 2, 3]
arr.permutation.to_a
# [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
a = [1, 2, 3, 4]
a.combination(1).to_a
# [[1],[2],[3],[4]]
a.combination(2).to_a
# [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
a.combination(3).to_a
# [[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
a.combination(4).to_a
# [[1,2,3,4]]

Dinge, die gelegentlich verwendet werden müssen

Maximales Engagement

Verwenden Sie die Methode gcd () für ganze Zahlen. Übrigens ist das maximale Engagement "größter gemeinsamer Teiler" in Englisch. Daher wird es als "gcd" abgekürzt.

num = 9
puts num.gcd(6)

#Ausgabe
# 3

Minimales gemeinsames Vielfaches

Verwenden Sie die Methode lcm () für ganze Zahlen. Übrigens ist das minimale gemeinsame Vielfache im Englischen das "kleinste gemeinsame Vielfache". Daher wird es als "lcm" abgekürzt.

num = 9
puts num.lcm(6)

#Ausgabe
# 18

Primzahl

Verwenden Sie ein Modul namens "prime". Die Primzahl ist übrigens "Primzahl" in Englisch.

Sie müssen "require'prime" ausführen, um das Modul zu verwenden.

(Zusatz) Es war ein Fehler von "Bibliothek" anstelle von "Modul".

#Eingang
# 7

require 'prime'
num = gets.to_i
if Prime.prime?(num)
  puts "#{num}Ist eine Primzahl."
else
  puts "#{num}Ist keine Primzahl."
end

#Ausgabe
#7 ist eine Primzahl.

(Zusatz) Die Art und Weise, die if-Anweisung zu schreiben, war ein langer Ausdruck. Es ist besser, wie folgt zu schreiben.

if num.prime?

Häufige Fehler

TLE

Wenn ich gerade erst anfange zu konkurrieren, denke ich, dass dies in rascher Folge geschehen wird. Lol TLE ist eine Abkürzung für Time Limit Exceeded.

Bei Wettkampfprofis ist es wichtig, effizient zu rechnen. Unnötige Berechnungen sollten vermieden werden.

In diesem Zusammenhang werde ich jedoch nach einiger Zeit verstehen, dass "** Dies wird nicht TLE ... ** sein". Und Sie werden bis zu einem gewissen Grad verstehen, wie Sie dies vermeiden können.

Ich lerne noch, aber ich glaube, ich habe keine andere Wahl, als die Erklärung des Problems zu lesen, das zu TLE geworden ist, und nach und nach zu lernen, wie man effizient berechnet.

Auf jeden Fall ist es wichtig, sich daran zu gewöhnen, sich selbst zu überprüfen, um festzustellen, ob Sie unnötige Berechnungen durchführen.

Verstehe das Problem falsch

Die Fragen A und B haben einen relativ geringen Schwierigkeitsgrad. Wenn Sie sich an sie gewöhnt haben, können Sie die Fragensätze überspringen. (mich selber) Wenn Sie dies tun, können Sie aufgrund eines leichten Missverständnisses vom Sumpf abhängig sein.

Ich habe während des Prüfungszeitraums oft gehört, dass ** mathematische Texte wichtiger zu lesen sind als Berechnungen **, aber das Gleiche gilt für Wettkampfprofis. Wenn Sie die Problemstellung nicht richtig verstehen, können Sie das Problem nicht lösen, egal wie viele schnelle Algorithmen Sie kennen.

Je schneller Sie das Problem lösen, desto besser ist die Leistung, sodass Sie ungeduldig sind. Es ist jedoch wichtig, die Problemstellung richtig zu lesen und die Bedingungen richtig zu verstehen, bevor Sie mit der Lösung des Problems beginnen.

Gibt an, ob 0 enthalten sein soll

Dies ist eine häufige Gefahr. ** Wie oft bist du in dieser Falle gefangen ... **

Wie oben erwähnt, ist es wichtig, die Problemstellung richtig zu lesen und die Bedingungen richtig zu verstehen. Was oft übersehen wird, ist, ob diese "0" enthalten ist oder nicht.

Dies kann der Grund sein, warum die Berechnung mit allen Mitteln rechtzeitig abgeschlossen wird, und obwohl es kein Problem beim Zusammenstellen der Logik gibt, wird sie zu "WA (Falsche Antwort)".

Serpentin

Es ist in Ordnung, wenn Sie es nicht wissen, aber hier sind drei Dinge, die nur ein wenig zeiteffizienter sind (?).

If-Anweisung in einer Zeile

num = gets.to_i
if num > 0
    puts num
end

Apropos if-Anweisung, ich denke, dies ist die Grundform, aber Sie können sie auch wie folgt schreiben.

num = gets.to_i
puts num if num > 0

Dreiecksoperator

num = gets.to_i
if num > 0
    puts num
else
    puts 0
end

Mit einem ternären Operator können Sie auch schreiben:

num = gets.to_i
puts num > 0 ? num : 0

OR

if x == "a" || x == "b" || x == "c"
    #wird bearbeitet
end

Wenn Sie dies etwas cooler schreiben möchten, können Sie es auch wie folgt schreiben.

if ["a", "b", "c"].include?(x)
    #wird bearbeitet
end

Übungslink

Ich werde hier einige Links setzen. Die Top "10 vergangenen Fragen" wurden gelöst, als ich gerade anfing.

―― Was ist als nächstes nach der Registrierung bei AtCoder zu tun? ~ Sie können genug kämpfen, wenn Sie so viel lösen! Frühere Fragen ausgewählt 10 Fragen ~

Zusammenfassung

Ich schrieb über die Grundlagen von Ruby und Wettkampfprofis. Ich denke nicht, dass es so schwierig ist, braun zu werden, wenn man sich daran gewöhnen kann, indem man frühere Fragen löst.

Ich arbeite hart daran, jetzt grün zu werden, aber mein ehrlicher Eindruck ist, dass es Zeit ist, Algorithmen und Datenstrukturen zu studieren. Ich möchte grün werden, während ich ein Student bin.

Recommended Posts

[At Coder] Einführung von Competitive Pro mit Ruby
[Bei Coder] Lösen Sie das ABC182 D-Problem mit Ruby
Einführung in Rspec mit Ruby on Rails x Docker
[Competition Pro] Löse Rucksackprobleme mit Ruby
Erste Schritte mit Ruby
Studieren bei CodeWar (Rubin) ②
Evolve Eve mit Ruby