checkutf8.py 2.65 KB
Newer Older
1
2
# -*- coding:utf-8; -*-
    
3
def check_utf8(s, oikea, makspisteet, binary=False):
4
5
6
7
8
9
10
11
    '''
    Testaa opiskelija antamaa binäärilukua: Onko se validi utf-8 binäärimuoto ja onko se sama kuin 'oikea'
    :param s: utf-8 binääriluku string:inä
    :param oikea: Oikea utf-8 string, esim. 'ä' tai Unicode koodipisteen arvo heksana, esim. '\u00F4'
    :param binary: tulostetaanko virhe utf-8 binäärinä (kun kysytään merkkejä, niin ei tulosteta oikeita merkkejä vaan bin esitys)
    :return: tehtävästä saadut pisteet, virheet (tai "" jos oikein)
    '''
    #print(oikea)
arjuvi's avatar
arjuvi committed
12
    # s = s.replace(" ", "").replace("\n", "") # Strip if someone give eg '10101110 10110101'
13
14
    s = re.sub(r'\s+', '', s) # remove (all) (white)spaces

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    palaute_viesti = ""
    try:
        if not len(s) % 8 == 0:
            palaute_viesti += 'Bittiesi lukumäärä ' + str(len(s)) + ' ei ole kahdeksalla jaollinen.\n'
            return 0, palaute_viesti
        test = bytes.fromhex(hex(int(s,2))[2:].zfill(2)).decode('utf-8') # .zfill(2) varmistetaan että on 2 hexalukua
    except UnicodeDecodeError:
        palaute_viesti += 'Bitit eivät ole validia utf-8:aa'
        return 0, palaute_viesti
    except ValueError:
        palaute_viesti += 'Vastauksesi ei ollut binääriluku.'
        return 0, palaute_viesti
    points = 0
    if test == oikea:
        points = makspisteet
        palaute_viesti = "Oikein, täydet pisteet!\nVastauksesi utf-8 "
    else:
        palaute_viesti = "Väärin, vastauksesi utf-8 "
    if (binary):
        bina = ' '.join(str(bin(i)[2:].zfill(8)) for i in oikea.encode('utf-8')) # separate binaries to 8 bit groups, i.e. group by bytes
        bina = ''.join("\n" if i % 72 == 0 else char for i, char in enumerate(bina, 1)) # long binaries separated to groups of 8 bytes on one line (8 * 8 bits + 8 spaces = 72)
        palaute_viesti += "binäärinä on:\n" + bina
    else:
        palaute_viesti += "binääri tulostuu merkeiksi: "  + test
    return points, palaute_viesti
40

41
if __name__ == '__main__':
42
    import sys
arjuvi's avatar
arjuvi committed
43
    import re
44
45
46
47
48
49
50
51
52
53
54
55
    try:
        p,v = check_utf8(open(sys.argv[1], 'r').read(), sys.argv[2], float(sys.argv[3]))
    #except FileNotFoundError: # voidaan käyttää myös tekstin tarkastamiseen, jolloin oikea vastaus annetaan binäärisenä ja parametrien järjestystä muutetaan
    except: # Napataan myös liian pitkä tiedostonimi error
        try:
            p,v = check_utf8(sys.argv[1], open(sys.argv[2], 'r').read(), float(sys.argv[3]), True)
        except FileNotFoundError:
            print('Tarkistin ei löydä tiedostoa, ilmoita virheestä opettajalle')
            exit()
    print('Pisteet: ' + str(p) + '\n')
    if v != '':
        print(v)