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éé.
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:
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.
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
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.
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).
Presque comme vous pouvez le voir. En gros, tout ce que vous avez à faire est de modifier la zone au-dessus du fichier.
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.
Cela le rendra encore plus pratique! Si vous avez les connaissances, veuillez commenter.
Recommended Posts