Automatische Übermittlung von AtCoder (Python)

Einführung

Ich habe ein MacBook gekauft. Es ist ein Modell der Air 2020 i7 16GBRAM 512GB SSD. Natürlich war ich mit der Leistung zufrieden, da der Benchmark, der doppelt so hoch ist wie das schwere (physische) Windows, das ich bisher verwendet habe, herauskommt, aber das Attraktivste an Mac ist das Design innerhalb und außerhalb des Bildschirms und das Rendern von Schriftarten. .. Die Benutzeroberfläche ist auch wunderschön und ich bin sehr zufrieden. Da es eine große Sache ist, habe ich beschlossen, die Übermittlung von AtCoder, von dem ich in letzter Zeit abhängig bin, beim Aufbau der Umgebung zu automatisieren. Die Einreichungssprache ist Python, aber das Gleiche gilt für andere Sprachen. ** 20/5/1 Nachtrag: [Informationen zur Änderung der AtCoder-Spezifikation](Änderung der # AtCoder-Spezifikation) **

Vorbereitung

Dinge notwendig

Wenn Sie dies noch nicht getan haben, geben Sie Folgendes im Voraus an. Übrigens wird der Editor sowohl für VS Code für den Wettbewerb als auch für Atom für den üblichen Editor verwendet. Bitte lesen Sie die entsprechenden Informationen unten. Hyper Das Mac-Terminal ist viel besser als Windows, aber es ist immer noch etwas klobig. Nach der Suche nach verschiedenen Dingen ist das Terminal mit dem Namen Hyper sehr schön. Es scheint, dass es bei Dritten auch ein Pokemon-Anzieh-Thema gibt, und es ist süß. Im Folgenden bedeutet die Zeile mit dem Vorzeichen "", dass Sie den folgenden Befehl (ohne "") in das Terminal eingeben und mit Return (Enter) ausführen können. image.png Während des Wettbewerbs habe ich beschlossen, vom VS Code-Terminal aus zu arbeiten.

Homebrew Es ist ein berühmtes Paketverwaltungssystem. Kopieren Sie den auf der offiziellen Seite eingefügten Befehl, fügen Sie ihn in das Terminal ein und führen Sie ihn aus. Es gibt eine Stelle, an der Sie unterwegs die RETURN-Taste drücken müssen.

==> The Xcode Command Line Tools will be installed.
Press RETURN to continue or any other key to abort

Unmittelbar danach werden Sie aufgefordert, Ihr Passwort einzugeben. Terminal Ich weiß nichts, ich bin hier festgefahren. Wenn ich mein Passwort eingegeben habe und dachte, dass nichts angezeigt wird, wurde es nur aus Sicherheitsgründen ausgeblendet ... Geben Sie Ihr Mac-Passwort ein, um fortzufahren.

==> /usr/bin/sudo /bin/...
  Password:
 ==> Installation successful!

Python Laden Sie das Installationsprogramm von Python Official herunter und richten Sie es ein. Oder verwenden Sie Gebräu.

$ brew install python3

Node.js Laden Sie das Installationsprogramm auch von Node.js Official herunter. Das Installationsprogramm ist schneller.

Werkzeug

Ich werde andere notwendige Werkzeuge hinzufügen. Verwenden Sie Online-Richter-Tools zum Testen. Atcoder-cli wird hauptsächlich für die Übermittlung, Verzeichniserstellung und Testfallerfassung verwendet. Selen wird für die Hinrichtung des Richters benötigt.

$ pip3 install online-judge-tools
$ oj --version    # check

$ npm install -g atcoder-cli
$ acc -v          # check
$ acc check-oj    # check

$ pip3 install selenium

Sie brauchen es möglicherweise nicht, aber ich möchte die Baumansicht verwenden, um die Verzeichnisstruktur zu verstehen. Installieren Sie es also.

$ brew install tree

Ich möchte den VSCode-Befehl "code" verwenden. Überprüfen Sie daher die Version ("-v") und installieren Sie sie, wenn sie nicht installiert ist. Öffnen Sie die VS-Code-Befehlspalette mit + Shift + P und geben Sie shell usw. ein, um den Befehl" Shell Command: Install'code 'in PATH "auszuführen.

$ code -v   # check

Aufbau

Zunächst war es unpraktisch, zu dem im Finder eröffneten Terminal zu wechseln. Lesen Sie daher diesen Artikel (Maru Pakuri) ) Ich habe das Drehbuch geschrieben. Verwenden Sie einen Texteditor, um die folgenden Inhalte direkt unter dem Ausgangsverzeichnis (/ Users / _username_ =~) mit der Spracheinstellung ShellScript / extension .sh zu speichern.

Finderset.sh



#!/usr/bin/osascript

tell application "Finder"
    if exists Finder window 1 then
        set currentDir to target of Finder window 1 as Unicode text
        set posixPath to get POSIX path of currentDir
    end if
end tell

Als nächstes platzieren Sie .zshrc, das Einstellungen wie Aliase verwaltet, direkt unter dem Home-Verzeichnis. Wenn Sie es noch nicht haben, setzen Sie die Spracheinstellung auf ShellScript und erstellen Sie den Dateinamen ".zshrc". (Da es sich um eine versteckte Datei im Finder handelt, kann sie nicht angezeigt werden, wenn sie ausgeblendet ist. Das Umschalten ist "Strg" + "Umschalt" + ".") Das Folgende ist ein Beispiel für den von mir hinzugefügten Alias. "cdf" ist eine Verknüpfung, mit der der Befehl zum Terminal in dem oben im Finder geöffneten Verzeichnis verschoben werden kann. "atc" dient zum Verschieben an den Speicherort, an dem sich das Verzeichnis befindet. Ansonsten schreibe ich es weiter unten. (Cd ist der Befehl zum Verschieben des aktuellen Verzeichnisses des Terminals) Persönlich habe ich beschlossen, das Verzeichnis an dem Ort zu erstellen, an dem sich das lokale Repository von GitHub befindet.

.zshrc


# vscode
alias vs='code -r main.py'

# cd
alias cdf='cd $(osascript ~/xxx.sh)'  #Der Name der Datei, die Sie zuvor geschrieben haben
alias atc='cd /Users/xxx...'  #Wo Sie ein Verzeichnis erstellen möchten
alias a='cd ../a ; vs'
alias b='cd ../b ; vs'
alias c='cd ../c ; vs'
alias d='cd ../d ; vs'

# test
alias test='oj t -c "python3 main.py" -d ./tests/'
alias py='python3 main.py'

# start
sta () {
  atc
  acc new $1
  code -r $1
  source cd $1/a
  vs
}

# submit
sd () {
  problem=`pwd | xargs basename`
  contest=`echo $(basename $(pwd | xargs dirname)) | tr '[:upper:]' '[:lower:]'`
  echo "${contest:0:3}$problem" | acc s
  source cd ../`echo $(printf "\x$(printf "%x" $(($(printf "%d" \'$problem)+1)))")`
  vs
}
alias sf='if test ; then sd ; fi'
スクリーンショット 2020-04-28 19.03.35.png

Ich habe eine Verknüpfung festgelegt, um das Terminal bequem mit VS Code zu verwenden. Verwenden Sie + Shift + P, um die Befehlspalette aufzurufen, geben Sie Tastatur usw. ein und wählen Sie" Grundeinstellungen: Öffnen der Tastaturkürzeldatei (JSON) / Einstellungen: Öffnen der Tastaturkürzeldatei (JSON) ". Fügen Sie zwei zu keybinding.json hinzu. Shift + l scheint unbenutzt zu sein, also habe ich es zugewiesen. Auf diese Weise können Sie mit nur "Umschalt" + "l" zwischen Terminal und Editor wechseln.

keybinding.json


[
    { "key": "shift+l", 
    "command": "workbench.action.terminal.focus" },
    { "key": "shift+l", 
    "command": "workbench.action.focusActiveEditorGroup", "when":"terminalFocus" },
]

Melden Sie sich als Nächstes bei AtCoder an.

$ acc login
$ oj login https://atcoder.jp/

Legen Sie ein Verzeichnis fest, das gleichzeitig für alle Probleme im Wettbewerb erstellt werden soll.

$ acc config default-task-choice all

Holen Sie sich den Speicherort des Konfigurationsverzeichnisses und verschieben Sie es. Um das Ergebnis von acc an cd zu übergeben, verwenden Sie`` ``Anführungszeichen anstelle von 'einfachen Anführungszeichen. Erstellen Sie einen Ordner und erstellen Sie die Vorlage main.py und die Vorlagenkonfigurationsdatei template.json darin.

$ cd `acc config-dir`
$ mkdir py
$ cd py
$ touch main.py template.json

Öffnen Sie template.json und schreiben Sie. Jetzt können Sie "main.py" gleichzeitig mit dem Erstellen des Verzeichnisses und des Ziels "main.py" beim Senden öffnen.

$ open -a Atom template.json

template.json


{
  "task":{
    "program": ["main.py"],
    "submit": "main.py"
  }
}

Öffnen Sie main.py und schreiben Sie. Schreiben Sie "Shebung" in die erste Zeile, wie unten gezeigt (erforderlich). Da es sich um eine Vorlage handelt, möchten Sie möglicherweise häufig verwendeten Code in die zweite und die folgenden Zeilen schreiben.

$ open -a Atom main.py

main.py


#!/usr/bin/env python3

Setzen Sie die Vorlage auf py.

$ acc config default-template py
$ acc templates   # check
search template directories in /Users/../Library/Preferences/atcoder-cli-nodejs
[NAME]  SUBMIT-PROGRAM
[py]    main.py

Eigentlich verwenden

Verzeichnis erstellen

Gehen Sie zu dem Ort, an dem Sie das Verzeichnis mit "atc" erstellen möchten, und erstellen Sie ein neues Verzeichnis mit "acc new [Contest Name]". Insbesondere ist dies der Name des relevanten Teils der AtCoder-URL. Wenn Sie den folgenden "Baum" sehen können, ist dies erfolgreich.

$ atc
$ acc new ABC164    # name of contest 
$ tree
.
├── a
│   ├── main.py
│   └── tests
│       ├── sample-1.in
│       ├── sample-1.out
...
│       └── sample-3.out
├── b
│   ├── main.py
│   └── tests
│       ├── sample-1.in
│       ├── sample-1.out
│       ├── sample-2.in
│       └── sample-2.out
├── c
│   ├── main.py
│   └── tests
│       ├── sample-1.in
...
│       └── sample-3.out
├── contest.acc.json
├── d
│   ├── main.py
│   └── tests
│       ├── sample-1.in
│       ├── sample-1.out
│       ├── sample-2.in
│       ├── sample-2.out
...

12 directories, 43 files

Schreiben Sie im vorherigen .zshrc Folgendes, um das aktuelle Verzeichnis automatisch in den Ordner A problem zu verschieben. Jetzt müssen Sie das Verzeichnis nicht mehr ändern, wenn Sie eine Frage senden. (Wenn Sie konsequent von der Verzeichniserstellung bis zur Übermittlung im selben Terminal arbeiten)

.zshrc(only_one_part)


sta () {
  atc
  acc new $1
  code -r $1
  source cd $1/a
  vs
}

Prüfung

Öffnen und lösen wir Problem A. Schreiben Sie nach der Ausführung von sta das Programm in die geöffnete a / main.py. Gehen Sie mit der zuvor festgelegten Verknüpfung zum Terminal, vergewissern Sie sich, dass Sie sich in dem betreffenden Verzeichnis befinden (a), und führen Sie oj t -c" python3 main.py "-d. / Tests / aus. Da es lang zu sein scheint, wird es im Alias ".zshrc" "test" zugewiesen. Es wurde richtig als "AC" beurteilt.

$ pwd     # check current directory (not necessary)
/Users/.../abc164/a

$ test
[*] 3 cases found
time: illegal option -- f
usage: time [-lp] command.
[!] GNU time is not available: time

[*] sample-1
[x] time: 0.022793 sec
[+] AC

...

[x] slowest: 0.022793 sec  (for sample-1)
[+] test success: 3 cases
スクリーンショット 2020-04-29 11.18.21.png

Es scheint, dass Sie nicht wissen werden, ob Sie nur Wettkampfprofis machen, aber wenn input () ursprünglich ausgeführt wird, befindet sich der Standardeingang des Terminals im Eingangs-Standby-Zustand. Wenn Sie es also in einem anderen Fall als dem Beispielfall ausführen möchten, können Sie normalerweise "python3 main.py" ausführen und die Standardeingabe zeilenweise eingeben. (Was ist mit open (0) ...)

Einreichung

Solange Sie sich im entsprechenden Verzeichnis befinden, können Sie dies mit nur "acc s" tun. Sie werden lediglich aufgefordert, einen Bestätigungscode einzugeben. Anscheinend scheinen es insgesamt 4 Zeichen zu sein, die die ersten 3 Buchstaben des Wettbewerbsnamens und der Fragennummer kombinieren ([ContestName; 3] [Problem]; ex.abca). Ich habe keine Zeit dafür, also habe ich eine sd Funktion vorbereitet. sd wechselt nach der Übermittlung automatisch zum nächsten Verzeichnis. In .zshrc gibt es einen anderen Befehl ( sf), der nur gesendet werden kann, wenn das Ergebnis vontest`` [AC]ist (= Rückgabewert ist 0).

.zshrc(only_one_part)


# submit
sd () {
  problem=`pwd | xargs basename`
  contest=`echo $(basename $(pwd | xargs dirname)) | tr '[:upper:]' '[:lower:]'`
  echo "${contest:0:3}$problem" | acc s
  source cd ../`echo $(printf "\x$(printf "%x" $(($(printf "%d" \'$problem)+1)))")`
  vs
}
alias sf='if test ; then sd ; fi'

Der Browser wird im Verlauf des Übermittlungsvorgangs automatisch geöffnet. Ich habe mich auch auf andere Themen konzentriert. Es funktioniert automatisch, aber wenn Sie zum vorherigen / vorherigen Problem wechseln möchten, können Sie das aktuelle Verzeichnis verschieben und die VS-Code-Datei mit nur "a", "b", "c" bearbeiten.

.zshrc(only_one_part)


alias a='cd ../a ; vs'
alias b='cd ../b ; vs'
alias c='cd ../c ; vs'
alias d='cd ../d ; vs' # ...

Dies ist perfekt! !!

Bonus (wo es stecken bleibt)

Wenn Sie ".zshrc" durch Ausprobieren bearbeiten und sofort wiedergeben möchten (starten Sie das Terminal neu, um es normal wiederzugeben).

$ source ~/.zshrc

Wenn die Funktion aus irgendeinem Grund nicht verwendet werden kann

.zshrc


function func () {
  # do_something
}
alias func=func

Im Shell-Skript kann function beim Definieren einer Funktion weggelassen werden. Wenn Sie jedoch einen Alias mit demselben Namen definieren möchten, wird der folgende Fehler angezeigt, sofern Sie ihn nicht explizit deklarieren.

$ source ~/.zshrc
/Users/xxx/.zshrc:19: defining function based on alias `func'
/Users/xxx/.zshrc:19: parse error near `()'

Informationen zu Änderungen der AtCoder-Spezifikationen (zusätzlicher Hinweis)

Ich dachte, ich könnte es ab dem 1. Mai nicht einreichen, aber es scheint ein Problem mit "oj" zu sein.

$ oj -v s [URL] main.py
...
  File "/Users/kazuhiroserizawa/.pyenv/versions/3.8.0/lib/python3.8/site-packages/onlinejudge/service/atcoder.py", line 728, in _parse_available_languages
    languages += [Language(option.attrs['value'], option.string)]
KeyError: 'value'

[ERROR] 'value'
スクリーンショット 2020-05-01 13.16.19.png

Du bist verrückt nach Zeile 728. GitHub hatte auch eine Pull-Anfrage. Ich denke, es wird bald behoben, aber ich werde es vorerst beheben.

# Install-Location
$ pip show online-judge-tools
...
Location: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
...
# Open
$ cd /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
$ open -a Atom onlinejudge/service/AtCoder.py

Klicken Sie hier für Codeänderungen (https://github.com/kmyk/online-judge-tools/pull/739/commits/577b1d9d9a505cea7835ac1c0a98ef9377b8b919). Der Rest wird wie folgt umgeschrieben.

Verweise

Vergiss nicht, einen Stern an GitHub zu schicken!

Haftungsausschluss

Obwohl dies in den AtCoder-Nutzungsbedingungen nicht ausdrücklich verboten ist, wird der Testfall nicht einmal durchgeführt, da er den Server nicht überfordern und zu Unannehmlichkeiten führen kann. Verwenden Sie im Rahmen des gesunden Menschenverstandes.

abschließend

Ich habe nach Unix-Befehlen gesucht, ohne sie überhaupt zu kennen!

Recommended Posts

Automatische Übermittlung von AtCoder (Python)
atCoder 173 Python
AtCoder ABC 174 Python
AtCoder ABC 175 Python
Täglicher AtCoder # 36 mit Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python
Täglicher AtCoder # 18 in Python
Täglicher AtCoder # 53 in Python
Täglicher AtCoder # 33 in Python
Täglicher AtCoder # 7 in Python
AtCoder # 24 jeden Tag mit Python
Täglicher AtCoder # 37 in Python
Löse AtCoder 167 mit Python
AtCoder # 8 jeden Tag mit Python
Täglicher AtCoder # 42 in Python
Täglicher AtCoder # 21 mit Python
Täglicher AtCoder # 17 mit Python
Täglicher AtCoder # 38 in Python
Täglicher AtCoder # 54 in Python
Täglicher AtCoder # 11 in Python
Täglicher AtCoder # 15 in Python
Täglicher AtCoder # 47 mit Python
Täglicher AtCoder # 45 mit Python
AtCoder: Python: Automatisieren Sie Beispieltests so weit wie möglich.
AtCoder # 30 jeden Tag in Python
Täglicher AtCoder # 40 mit Python
Täglicher AtCoder # 10 mit Python
AtCoder # 5 jeden Tag mit Python
Täglicher AtCoder # 28 in Python
Täglicher AtCoder # 39 in Python
Täglicher AtCoder # 20 in Python
Täglicher AtCoder # 19 in Python
Täglicher AtCoder # 52 in Python
Täglicher AtCoder # 3 in Python
Täglicher AtCoder # 14 mit Python
Täglicher AtCoder # 50 mit Python
Täglicher AtCoder # 26 mit Python
Täglicher AtCoder # 4 mit Python
Täglicher AtCoder # 43 in Python
Täglicher AtCoder # 29 in Python
Jeden Tag mit Python AtCoder # 22
Täglicher AtCoder # 49 in Python
Täglicher AtCoder # 27 in Python
AtCoder # 1 jeden Tag mit Python
Täglicher AtCoder # 25 mit Python
Täglicher AtCoder # 16 in Python
Täglicher AtCoder # 12 in Python
Python Golf Tech (AtCoder)
Täglicher AtCoder # 48 in Python
Täglicher AtCoder # 23 in Python
Täglicher AtCoder # 34 in Python
Täglicher AtCoder # 51 mit Python
Täglicher AtCoder # 31 in Python
Jeden Tag mit Python AtCoder # 46
Täglicher AtCoder # 35 mit Python
AtCoder # 9 jeden Tag mit Python
Täglicher AtCoder # 44 mit Python