minprog / adventure

3 stars 5 forks source link

Adventure/more volgorde van items maakt uit #3

Open Jelleas opened 4 years ago

Jelleas commented 4 years ago

Een uitwerking had

self.items = set()

Waardoor de volgorde van uitprinten kan verschillen, en dat deed het ook tussen check50, de IDE, en onze grading server.

We kunnen daardoor bij https://github.com/minprog/cs50x/blob/031ea998e34049ee3e5caf3828fa9f3fc2dee622/adventure/more/__init__.py#L32-L35 niet vertrouwen op de volgorde van printen. Waarschijnlijk is output = check.stdout() en vervolgens handmatig checken een beter idee.

bjorn-out commented 4 years ago

Ik heb geprobeerd je suggestie te implementeren, echter resulteert output = check.stdout() bij deze opdracht altijd in een check50.Failure en geen output. Dit komt omdat stdout() blijkbaar probeert alle output totdat het programma afsluit te verzamelen. Adventure sluit niet af in ruimte 3, en dus timed stdout() altijd uit. Als dit gebeurt verzamelt hij helaas ook geen enkele output in de variabele (anders had het nog wel mogelijk geweest de exception zelf af te vangen en de output gewoon te gebruiken).

Is dit iets wat mogelijk in check50 zelf aangepast moet worden? Het lijkt me wel ontzettend handig om ook alle output op te kunnen vangen van een niet-afsluitend programma. Anders moeten we wellicht aangeven dat de volgorde niet mag veranderen t.o.v. de dataset.

bjorn-out commented 4 years ago

Nog even extra ter illustratie. Met onderstaande check code:

import check50

@check50.check()
def test():
    output = ''
    try:
        output = check50.run("python test.py").stdout()
    except check50.Failure:
        pass

    check50.log(output)

En onderstaande test.py:

while True:
    print('Hello, world!')

Krijg ik onderstaande output:

Screenshot 2019-12-12 at 02 12 50

Ik zou verwachten 3 seconden aan 'Hello, world!' in de output te hebben, maar helaas, hij blijft leeg.

Jelleas commented 4 years ago

"Is dit iets wat mogelijk in check50 zelf aangepast moet worden? Het lijkt me wel ontzettend handig om ook alle output op te kunnen vangen van een niet-afsluitend programma. Anders moeten we wellicht aangeven dat de volgorde niet mag veranderen t.o.v. de dataset." Yup! Maak hiervoor even een Engelstalige issue aan bij cs50: https://github.com/cs50/check50 (of evt. een pr als je een ideetje hebt :)

Wat we wel kunnen doen is het spel stoppen d.m.v. .stdin("quit"), dan kunnen we wel alle output opvangen.

bjorn-out commented 4 years ago

Ik heb het nog even geprobeerd met .stdin("quit"), maar dit resulteert ook in geen output, of ik dit nu vóór of na de .stdout() aanroep. Komende week zal ik even kijken of ik er zelf iets van kan maken in check50, anders maak ik een issue aan.