HackInScience et les prints

Encore un sujet HackInScience, sur la rigueur à avoir avec les prints, j’aimerai votre avis…

Globalement on a deux types d’exercices :

Basés sur des prints (on demande à l’élève d’afficher la solution) et basé sur des fonctions (on demande à l’élève d’écrire une fonction).

Dans le cas d’un exercice basé sur des prints, HackInScience est pour le moment super strict : si je demande 42 je veux 42, pas un octet de plus (bon ok je passe toujours un petit .strip() avant de vérifier donc j’autorise les blancs avant et après, houlala).

Mais on pourrait faire plus souple, typiquement si je demande 42 autoriser La réponse est : 42 ou qq prints de débug avant ou après :

Exercices basé sur print
  • Interdire tout caractère supplémentaire.
  • Autoriser des prints de debug (sur des lignes à part).
  • Autoriser n’importe quoi tant que le résultat est là.

0 votant

Dans le cas d’un exercice basé sur des fonctions, mes exos sont aussi en mode super strict : j’importe le module de l’élève donc tout print caché dans un if __name__ == "__main__" me sera caché, et donc autorisé. Mais tout autre print fait systématiquement échouer la moulinette (qui dit explicitement que je ne veut pas de print ici).

Le souci c’est que les gens sont obligés de faire des “aller-retour” entre print et pas print :

  • Je fait mon exo sans print
  • Je soumet, ça me dit que c’est faux
  • Je rajoute des prints de débug
  • Je fix et je pense que ça marche
  • Je soumet, ça me dit que j’ai laissé des print
  • j’enlève les print, je soumet, ça me dit que c’est encore faux
  • Je remet les print de debug

On pourrait donc autoriser des prints hors du if __name__... ou carrément dans la fonction. On pourrait aussi corriger l’exercice (print ou pas) et seulement une fois qu’il est juste dire : OK il est juste, mais vire tes prints STP.

Exercices basés sur des fonctions
  • N’autoriser les print que dans le if __name__ ...
  • Autoriser tous les print de debug
  • Autoriser tous les print hors de la fonction
  • Demander d’enlever les print quand l’exercice est le bon

0 votant

Les spécifications sont les spécifications, donc si tu demandes que le programme affiche 42, il ne doit afficher que 42, sur la sortie standard. Tu peux peut-être dans le mode d’emploi préciser qu’il est possible de déboguer via la sortie stderr

1 J'aime

Je mène une expérience avec les deux premiers exercices basés sur des fonctions.

Le premier (circle_perimeter) demande de renvoyer la valeur, donc autoriser les print est facile. Le 2ǹd (print_even_numbers), demande d’afficher les nombres pairs dans l’intervalle donnée, ça se corse.

Mais ça y est je commence à avoir qqch de raisonable : si quelqu’un test ça fonction en l’appelant comme ça :

def print_even_numbers(start, stop):
    for i in range(start, stop):
        print(i)

print_even_numbers(1, 10)

ça va réussir à lui montrer son print tout en corrigant son exercice :

1
2
3
4
5
6
7
8
9

One line 2, you gave an odd number, I need even numbers:

I tried print_even_numbers(0, 45)

Got:

0
1
2
...

et si son exo est bon, ça lui affiche toujour son print, et ça lui dit que c’est bon.

Malgré le « succès » à l’implèmentation côté moulinette de correction, je ne suis pas convaincu convaincu que ce soit parfaitement digeste pour celui qui le lis.

Après c’est un peu de sa faute, il n’avait qu’a pas laisser un print þ

Exactement, on est tous passé par là, il n’a pas répondu à l’énoncé. Certains concept nécessitent un apprentissage et une compréhension d’autres concepts, en informatique la rigueur strict et rigide des systèmes électronique est à comprendre impérativement.

Pour la fonction qui affiche, j’aurai en effet tendance à interdire d’autres print. Mais pour une fonction qui renvoie une valeur, j’autoriserai n’importe quoi après tout…

Ou alors, tu fournis une fonction “log” qui permet de faire des print sans en faire ? (affichage à l’écran mais dont tu sais ne pas tenir compte)

1 J'aime

J’approuve, c’est peut être mieux de fournir une fonction utilitaire dans les exercices pour ce cas de figure, si c’est expliqué dans l’énoncé je pense que c’est suffisant.

+1 pour une fonction genre log() ou debug() que les élèves peuvent utiliser. J´ai déjà vu ça sur un site similiaire je crois.

Et je suis aussi assez partisan d´avoir une spécifcation scricte .

Hum. C´est pas parce que c´est facile à implémenter que c´est une bonne idée :slight_smile: