J'ai récemment essayé de résoudre un problème sur Hackerrank qui nous demandait de déterminer si une chaîne contenant des crochets (par exemple {},() et []) était équilibrée ou non (source: https://www.hackerrank.com/challenges/balanced-brackets). Je voulais résoudre cela en utilisant l'approche suivante qui a également intégré le format initial HackerRank fourni:Comment comprendre ce code en termes de construction et d'évaluation d'une pile?
import sys
def isBalanced(s):
#insert code here
if __name__ == "__main__":
t = int(raw_input().strip())
for a0 in xrange(t):
s = raw_input().strip()
result = isBalanced(s)
print result
Je tiens également à noter que le site a configuré les éléments suivants comme étant l'entrée standard afin de tester la fonctionnalité du code:
3
{[()]}
{[(])}
{{[[(())]]}}
afin d'obtenir la sortie suivante:
YES
NO
YES
Cependant, je ne comprenais pas comment aborder ce code, principalement parce que Je ne comprenais pas pourquoi Hackerrank utilisait la clause if __name__ == "__main__":
, car je pensais que cette clause n'était utilisée que si quelqu'un voulait que son module soit exécuté directement plutôt qu'exécuté en étant importé dans un autre script (source: What does if __name__ == "__main__": do?). Je n'ai pas non plus compris la boucle for contenant for a0 in xrange(t):
puisque a0
n'est pas utilisé dans la boucle for pour quoi que ce soit, donc je ne sais pas vraiment comment l'entrée standard serait traitée.
donc j'ai fini regardant la solution sur la page de discussion, et ici il est ci-dessous:
lefts = '{[('
rights = '}])'
closes = { a:b for a,b in zip(rights,lefts)}
def valid(s):
stack = []
for c in s:
if c in lefts:
stack.append(c)
elif c in rights:
if not stack or stack.pop() != closes[c]:
return False
return not stack # stack must be empty at the end
t = int(raw_input().strip())
for a0 in xrange(t):
s = raw_input().strip()
if valid(s):
print 'YES'
else:
print 'NO'
Ce code me confond aussi, comme l'auteur prétendait utiliser une structure de données appelée « pile "(bien que cela semble être juste une liste de Python pour moi). Et bien que l'auteur a supprimé l'instruction if __name__ == "__main__":
, ils ont conservé le for a0 in xrange(t):
, dont je ne suis pas sûr comment il traite l'entier de l'entrée standard et les chaînes correspondantes.
En outre, bien que la fonction isBalanced
me perturbe car elle renvoie not stack
. Dans un commentaire de hachage sur l'instruction return
de la fonction, l'auteur indique également le # stack must be empty at the end
. Qu'est-ce que ça veut dire? Et comment cette liste peut-elle être vide si, au cours de la clause if c in lefts:
, la pile est ajoutée avec le caractère de la chaîne qui est itérée dans la boucle for. Alors pourquoi la fonction retournerait not stack
? Ne serait-il pas cohérent avec return True
pour que la fonction agisse comme un testeur booléen (c'est-à-dire reviendrait vrai si un certain objet adhérait à certains critères, et faux si l'objet ne le faisait pas)? Je ne suis pas encore familiarisé avec le codage. Il y a donc beaucoup de principes que je ne connais pas. Quelqu'un peut-il éclairer sur la façon dont cela fonctionnerait?