Modèle Python pour Codeforces-test manuel-

Contexte

Le contexte du problème est étonnamment amusant à lire.

Cela fait un moment que je ne suis pas passionné par la compétition, donc je résous des problèmes simples en rééducation depuis quelques jours. Comme c'est une bonne idée, j'ai changé l'environnement de C ++ + Emacs que j'avais utilisé dans le passé en Python + PyCharm.

À ce moment-là, j'ai créé un modèle qui facilite l'ajout de tests (tel quel), et je le posterai ici. Vous trouverez ci-dessous une description du modèle créé.

Objectifs et contraintes

Tout d'abord, c'est la règle de fer du professionnel de la compétition de vérifier les conditions de contrainte.

Cette fois, nous ciblerons Codeforces parmi les nombreux sites professionnels compétitifs. Codeforces présente les caractéristiques suivantes:

  1. Communiquez avec l'entrée / sortie standard
  2. Il y a au plus 3 cas de test
  3. Vous pouvez soumettre le fichier tel quel

Tout d'abord, comme il y a peu de cas de test disponibles, la clé est la facilité avec laquelle il est d'ajouter vos propres tests. (Inversement, il est peu nécessaire de générer automatiquement des cas de test à partir d'énoncés de problème.)

La principale caractéristique est que cela devient un goulot d'étranglement à ce moment-là. Lors de l'échange d'arguments de fonction et de valeurs de retour (concours tels que TopCoder), vous pouvez écrire des tests unitaires normalement, il est donc facile de recevoir le support IDE. Cependant, l'entrée / sortie standard n'est pas tellement prise en charge, et il semble difficile de tester même avec jUnit. Par conséquent, il est nécessaire de prendre une méthode légèrement gênante.

De plus, si vous soumettez le fichier tel quel, ce sera plus facile, donc je veux le faire pour qu'il puisse être soumis tel quel.

Le modèle que j'ai fait

Insérez dans le moule.

L'introduction est devenue longue, mais je vais mettre ici le modèle que j'ai réalisé. Il y a 2 fichiers, L'un est un fichier dans lequel vous pouvez écrire le code et le soumettre tel quel, L'autre est un fichier qui décrit le test.

Tout d'abord, le fichier qui écrit le code. Ne regarde pas! Après (CV: Umes), c'est une partie que vous n'avez pas besoin de voir pour résoudre le problème.

main.py


# -*- coding: utf-8 -*-
import sys
#Augmentez l'importation requise


class Solver(object):

    def run(self):
        ###Listez la réponse ici###


####################################
#Ne regardez pas d'ici!

###Listez la bibliothèque ici###

if __name__ == '__main__':
    Solver().run()

Ensuite, le fichier pour écrire le test.

test_solver.py


# -*- coding: utf-8 -*-
from unittest import TestCase


data = [
    (
        """
Entrée 1
""".strip()
        ,
        """
Réponse 1
""".strip()
    ),

    (
        """
Entrée 2
""".strip()
        ,
        """
Réponse 2
""".strip()
    ),
]


########################################
#Ne regardez pas d'ici!

class TestSolver(TestCase):
    def test_run(self):
        import os
        import sys
        from StringIO import StringIO
        import main

        for i, testdata in enumerate(data):
            print(str(i) + " test...")
            saved_stdout = sys.stdout
            try:
                with open("temp_data.txt", "w+") as temp:
                    temp.write(testdata[0])

                fd = os.open("temp_data.txt", os.O_RDONLY)
                os.dup2(fd, sys.stdin.fileno())

                out = StringIO()
                sys.stdout = out

                main.Solver().run()
                output = out.getvalue().strip()

                self.assertEquals(output, testdata[1])
            finally:
                sys.stdout = saved_stdout

La description

L'exécution de TestSolver.test_run () dans test_solver.py exécute le groupe de cas de test défini vers le début du fichier. Dans cette fonction Reçoit l'entrée standard du fichier Rediriger la sortie standard vers des variables Faire. Cela vous permet de remplacer l'entrée standard par la sortie standard.

Ingéniosité

Les cas de test utilisent ici des documents, vous pouvez donc les ajouter facilement en les copiant. Aucune formation de souris n'est requise.

L'entrée standard n'a-t-elle pas besoin de passer par un fichier? J'ai pensé, mais pour une raison quelconque, je ne pouvais pas le faire, alors j'ai abandonné (une personne détaillée plz). De plus, j'écris volontairement l'endroit où je pourrais écrire en utilisant tempfile dans le fichier réel, mais Windows? Dans un système d'exploitation mineur tel que, je me fâche parce que je n'ai pas la permission de lire tempfile. Il est difficile de l'éviter ... Je ne pouvais pas le faire, alors j'ai abandonné (une personne détaillée plz).

Comment utiliser

Presque comme vous pouvez le voir. En gros, tout ce que vous avez à faire est de modifier la zone au-dessus du fichier.

Résumé

appel récursif

Le modèle n'est qu'un fichier, vous pouvez donc l'utiliser en combinaison avec votre éditeur préféré. PyCharm est facile et agréable en tant que codeur confortable. Il existe également une complétion automatique et l'exécution est facile avec des touches de raccourci. Bien sûr, c'est aussi une bonne idée de le combiner avec Emacs ou Vim et de se battre avec un éditeur familier. Il ne sert à rien d'avoir Emacs en premier.

finalement

Cela le rendra encore plus pratique! Si vous avez les connaissances, veuillez commenter.

Recommended Posts

Modèle Python pour Codeforces-test manuel-
modèle de test unitaire python
Modèle de prétraitement pour l'analyse des données (Python)
Création d'un outil de test AtCoder pour Python
python [pour moi]
Modèle pour l'écriture de scripts batch en python
Test d'intégrité Python
modèle argparse python
[Python] Modèle Tkinter
Modèle pour créer des applications de ligne de commande en Python
Modèle Python qui effectue une analyse des journaux à une vitesse explosive
Jugement des nombres premiers par Python
Jugement des nombres premiers avec Python
Bases de Python ② pour déclaration
Test numpy Python Basic 8
Modèle Pro compétitif (Python)
À propos de Python, pour ~ (plage)
Jugement des nombres premiers avec python
Manuel python pour les débutants
Toolchain pour Python pour Android
Modèle d'analyse de données Python
Moteur de template Jinja2 2 Python
test de coopération de balises python
OpenCV pour les débutants en Python
Automatisation des tests pour le travail
Installez Python (pour Windows)
[Python] pour une erreur d'instruction
Maintenance de l'environnement Python pour les projets
Mémo Python (pour moi): Array
Liste Python, pour instruction, dictionnaire
Python pour l'analyse des données Chapitre 4
J'ai touché au dernier outil de test automatique "Playwright for Python"
Flux d'apprentissage pour les débutants en Python
Procédure d'installation de Python 3.6 [pour Windows]
Algorithme en Python (jugement premier)
Intégration BigQuery pour les utilisateurs Python
Pour se préparer au test G 2020 # 2
Modèle de pipeline de prétraitement pour DataLiner
Plan d'apprentissage Python pour l'apprentissage de l'IA
Configurer pour Mac (Python)
Mémo Python Tkinter (pour moi)
Installation d'OpenCV3 pour Python3 @macOS
Balise xmp [Python] pour les photos
Construction de l'environnement Python pour Mac
Code de test pour évaluer les décorateurs
Techniques de tri en Python
pp4 (puissance python pour tout)
Construction de l'environnement Python3 (pour les débutants)
Installation de la série Python 3 pour Mac
Python #function 2 pour les super débutants
Grammaire de base Python pour les débutants
Notes depuis 3 mois depuis que j'ai commencé Python
Mise à jour automatique de l'application Qt pour Python
Module de débogage et de test Python
Examen du centre 2015 Math IIB Résolution avec Python
Python pour l'analyse des données Chapitre 2
Pandas 100 coups pour les débutants en Python