[PYTHON] Pratique! Présentation des outils AtCoder, qui sont utiles lors de la programmation de compétitions avec AtCoder

introduction

Comment programmez-vous lors de la résolution des problèmes AtCoder? En gros, je pense que vous allez écrire et soumettre le programme avec l'éditeur de l'environnement local.

Lorsque vous résolvez un problème, ces demandes surviennent.

«Tout est fait! Je veux tester avec les valeurs d'entrée répertoriées dans le texte de la question! ――La première valeur d'entrée était correcte, mais qu'en est-il de la deuxième et de la troisième? C'est ennuyeux de vérifier un par un ...

AtCoder Tools est un outil CLI qui répond à ces besoins. Cet article vous présentera de l'installation à l'utilisation de base.

Je veux l'utiliser rapidement car la longue explication est bonne?

_Terminé. Je n'expliquerai que l'utilisation minimale. _

#Installation
$ pip install atcoder-tools

#Téléchargement par lots des valeurs d'entrée / sortie et génération de code à partir du modèle
##abs est l'identifiant du concours
## --Spécifiez le chemin à télécharger dans l'espace de travail
## --Spécifiez la langue du code généré automatiquement par lang
## --without-Télécharger sans se connecter avec login
$ atcoder-tools gen abs --workspace=path/to/atcoder-workspace/ --lang=python --without-login

#Exécutez des tests ensemble pour plusieurs valeurs d'entrée
$ cd path/to/program-location
$ atcoder-tools test

#Soumission du programme
$ atcoder-tools submit

environnement

environnement version Source d'installation
AtCoder Tools 1.1.7.1 pipenv(pip)
pipenv 2020.8.13 pip
pip 20.1.1 (python 3.8) pyenv
Python 3.8.5 pyenv
pyenv 1.2.20-3-g58c776a1 anyenv
anyenv 1.1.1 Homebrew
Homebrew 2.4.9 n/a
macOS 10.15.6 n/a

Comment installer

AtCoder Tools est un outil écrit en Python. Il peut être installé à l'aide de pip. J'aimerais installer à partir de Homebrew, mais comme il n'y a pas de formule disponible, il n'y a actuellement qu'une méthode d'installation utilisant pip.

$ pip install atcoder-tools

Ou

Pipfile


[[source]]
url = 'https://pypi.python.org/simple'
verify_ssl = true
name = 'pypi'

[requires]
python_version = '3.8'

[packages]
atcoder-tools = '*'
$ pip install pipenv #Si pipenv n'est pas installé
$ pipenv install --system

: avertissement: Attention

AtCoder Tools semble être garanti de fonctionner uniquement avec Python 3.5 et supérieur. Par conséquent, vous devez utiliser la série pip 3 (série Python 3) lors de l'installation.

Vous devez remplacer «pip» par «pip3», «pip3.8», etc. si nécessaire. Exécutez la commande suivante pour confirmer à l'avance qu'il s'agit de la série Python 3.

#Si le résultat est la série Python 2, utilisez pip3 etc.
$ pip --version
pip 20.1.1 from /Users/noraworld/.anyenv/envs/pyenv/versions/3.8.5/lib/python3.8/site-packages/pip (python 3.8)

Vous devrez peut-être également redémarrer le shell après l'installation.

$ exec -l $SHELL

Lorsque vous souhaitez télécharger des valeurs d'entrée / sortie à la fois

Vous pouvez copier les valeurs d'entrée / sortie répertoriées dans l'énoncé du problème et les coller dans un fichier ... mais il est difficile de le faire chaque fois que vous résolvez le problème.

Avec AtCoder Tools, vous pouvez télécharger toutes les valeurs d'entrée / sortie de toutes les questions du concours à la fois avec la commande suivante.

Par exemple, pour télécharger toutes les valeurs d'entrée / sortie des 11 questions de AtCoder Beginners Selection, ce qui est dit être la première chose à faire après l'enregistrement avec AtCoder: Exécutez la commande de.

$ atcoder-tools gen abs --workspace=path/to/atcoder-workspace/ --lang=python --without-login

Ensuite, il sera téléchargé sous chemin / vers / atcoder-workspace / comme ceci.

<détails>

Arborescence de répertoires (cliquez pour développer) </ summary>

.
├── ABC049C
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  └── out_3.txt
├── ABC081A
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  └── out_2.txt
├── ABC081B
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  └── out_3.txt
├── ABC083B
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  └── out_3.txt
├── ABC085B
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  └── out_3.txt
├── ABC085C
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── in_4.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  ├── out_3.txt
│  └── out_4.txt
├── ABC086A
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  └── out_2.txt
├── ABC086C
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  └── out_3.txt
├── ABC087B
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  └── out_3.txt
├── ABC088B
│  ├── in_1.txt
│  ├── in_2.txt
│  ├── in_3.txt
│  ├── main.py
│  ├── metadata.json
│  ├── out_1.txt
│  ├── out_2.txt
│  └── out_3.txt
└── PracticeA
   ├── in_1.txt
   ├── in_2.txt
   ├── main.py
   ├── metadata.json
   ├── out_1.txt
   └── out_2.txt

Le fichier ʻin_ * .txt est la valeur d'entrée et ʻout_ * .txt est la valeur de sortie. main.py est le code généré automatiquement à partir du modèle.

Explication sur les arguments

Utilisez la sous-commande gen.

Les «ab» suivants sont le nom du concours (identifiant du concours). C'est la partie de <CONTEST_ID> '' de https://atcoder.jp/contests/ <CONTEST_ID> `.

Spécifiez le chemin de téléchargement avec l'option --workspace.

Spécifiez le langage de programmation avec --lang. Le code (qui semble analyser le format d'entrée, etc.) est automatiquement généré à partir du modèle de la langue spécifiée ici. Veuillez consulter ici pour les langues prises en charge. Il semble que mon Ruby préféré ne soit pas encore pris en charge. Pardon!

Si vous ajoutez --without-login, vous pouvez télécharger sans vous connecter. Sinon, il vous sera demandé votre identifiant et votre mot de passe. Si vous pouvez le télécharger sans vous connecter, il sera plus facile de l'ajouter.

En résumé, ça ressemble à ça.

argument La description Valeur par défaut si omis
gen Nom de la sous-commande (Ne peut pas être omis)
abs Identifiant du concours (Ne peut pas être omis)
--workspace Chemin de téléchargement ~/atcoder-workspace
--lang Langue du code de modèle généré automatiquement cpp (C++)
--without-login Utiliser sans se connecter nil (Il vous sera demandé de vous connecter)

Le problème "Je veux faire de - sans connexion de la commande gen la commande par défaut # 99" a été soulevé, donc peut-être une version future Dans, --without-login peut être la valeur par défaut.

C'est ennuyeux de spécifier des options à chaque fois ...

Il peut être ennuyeux de spécifier des options telles que «--workspace» et «--lang» à chaque fois.

AtCoder Tools vous permet d'écrire des paramètres dans ~ / .atcodertools.toml et d'omettre les options.

toml:~/.atcodertools.toml


[codestyle]
workspace_dir='~/Workspace/competitive_programming/atcoder/'
lang='python'

[etc]
download_without_login=true

Définissez le chemin spécifié par --workspace sur workspace_dir de[codestyle]et la langue spécifiée par --lang sur lang de [codestyle].

Je me suis demandé si je pouvais omettre --without-login en définissant download_without_login = true sur[etc], mais je ne pouvais pas (on m'a demandé de me connecter). Il peut être utilisé de manière incorrecte ou être un bogue.

Lorsque vous souhaitez tester avec plusieurs valeurs d'entrée / sortie à la fois

À propos, les valeurs d'entrée et de sortie sont toutes définies. Vous voulez donner la valeur d'entrée au programme et comparer le résultat de sortie avec la valeur de sortie correcte.

Si vous le faites honnêtement sans utiliser AtCoder Tools, cela se produira.

$ cat in_1.txt | python main.py
#Le résultat de la sortie s'affiche

$ cat out_1.txt
#Comparez si c'est le même que le résultat de sortie précédent

$ cat in_2.txt | python main.py
#Faites de même pour le deuxième cas de test

$ cat out_2.txt
#Même résultat vérifié

$ cat in_3.txt | python main.py
#Le troisième

$ cat out_3.txt
#vérifier

# ...La même chose s'applique ci-dessous

...... C'est ennuyeux, n'est-ce pas?

Avec AtCoder Tools, vous pouvez tout vérifier à la fois avec une seule commande.

$ cd path/to/program-location #Déplacer vers le répertoire contenant le programme et les fichiers d'entrée / sortie
$ atcoder-tools test
# in_1.txt ... PASSED 163 ms
# in_2.txt ... PASSED 136 ms
# in_3.txt ... PASSED 130 ms
Passed all test cases!!!

C'est très pratique!

Tout langage non compatible est OK tant qu'il s'agit d'un fichier exécutable!

Le programme testé par cette commande est un fichier avec l'autorisation d'exécution.

En d'autres termes, si vous définissez shebang dans votre programme et lui donnez l'autorisation d'exécution, vous pouvez tester des programmes dans des langages que AtCoder Tools ne prend pas en charge (par exemple, Ruby)!

main.rb


#!/usr/bin/env ruby

#↑ Ajouter shebang sur la première ligne
#Ecrire un programme
#Donner l'autorisation d'exécution
$ chmod +x main.rb

Que la langue soit prise en charge ou non, c'est simplement le code généré à partir du modèle, et il semble qu'il n'y ait pas de restrictions particulières sur la langue dans laquelle le test est exécuté.

À propos des options

Si vous souhaitez exécuter le test à partir d'un répertoire autre que le répertoire courant, vous pouvez le faire en ajoutant l'option --dir.

De plus, le programme (fichier avec autorisation d'exécution) est automatiquement détecté, mais s'il y a plusieurs fichiers, l'un d'eux est automatiquement sélectionné. Si vous avez plusieurs programmes et que vous souhaitez spécifier un programme spécifique, je pense qu'il serait préférable d'ajouter l'option --exec, mais dans mon environnement, j'ai un FileNotFoundError et cela n'a pas fonctionné.

Lorsque vous souhaitez soumettre un programme à partir de la CLI

Je ne l'ai pas encore utilisé, donc je l'écris par intuition. Je suis désolé si j'ai fait une erreur: arc:

Eh bien, le test a réussi et finalement soumis! Vous pouvez copier et soumettre le programme, mais AtCoder Tools dispose d'une fonction de soumission de programme. Il facilite la soumission de programmes à partir de la CLI.

$ atcoder-tools submit

Seulement ça.

Vous devrez probablement vous connecter (ou bien sûr avec la commande submit), alors entrez votre ID et votre mot de passe AtCoder lorsque vous êtes invité à entrer un ID et un mot de passe.

Je veux en savoir plus!

Veuillez consulter README. Il est écrit en japonais, donc même ceux qui ne sont pas bons en anglais peuvent le faire.

à la fin

Je suis toujours chezCoder (pro de la compétition) depuis 2 jours [^ 1], mais je me suis vite rendu compte qu'il serait plus pratique d'avoir cet outil, je l'ai donc installé à la hâte.

[^ 1]: Parce que c'est "2 jours", c'est une "personne non liée" ^ 2.

Depuis que je résous le problème avec Ruby jusqu'à présent, il y a des problèmes tels que la génération de code n'est pas compatible avec Ruby et les options et paramètres ne sont pas disponibles dans certains endroits, mais ceux-ci seront progressivement améliorés.

(Au fait, je pensais envoyer un PR pour Ruby, mais j'étais frustré parce que je suis nouveau sur Python et que je n'ai presque aucune expérience de contribution aux bibliothèques ... w).

Recommended Posts

Pratique! Présentation des outils AtCoder, qui sont utiles lors de la programmation de compétitions avec AtCoder
Précautions lors de l'utilisation de Python avec AtCoder