Skip to content
Extraits de code Groupes Projets
Valider aab31a1d rédigé par Martin Gyselinck's avatar Martin Gyselinck
Parcourir les fichiers

Ex Part 4

parent 3ad98aa6
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Affichage de
avec 1174 ajouts et 0 suppression
1000 100 10 3
1 2 1 1 1 1 2 2 1 1 1 2 0 1 2 0 1 1 1 2 2 2 1 0 0 2 2 2 0 1 0 2 2 0 2 0 2 2 0 0 0 2 2 0 0 2 2 1 1 0 2 0 0 1 2 1 0 2 2 2 1 1 0 2 1 1 1 1 2 0 1 2 0 2 0 2 1 1 0 2 1 0 2 0 2 1 1 2 1 2 2 0 0 0 0 0 1 2 2 2 2 2 1 2 0 1 0 2 1 0 0 2 2 0 1 1 0 0 0 1 1 2 1 0 2 2 1 0 1 0 0 0 1 0 2 1 1 2 0 0 1 0 0 1 2 2 0 0 1 1 2 0 2 0 1 2 2 1 0 1 0 2 0 2 0 1 0 2 1 2 1 2 0 0 0 0 2 1 2 0 0 0 2 1 1 0 0 0 2 0 2 0 0 1 0 0 1 0 1 2 1 2 1 1 0 0 0 2 2 1 2 1 1 2 1 0 1 1 2 2 1 2 1 0 0 2 2 0 0 2 0 0 0 1 1 2 2 1 1 0 1 1 0 2 2 1 1 1 2 1 1 0 0 1 2 1 1 0 2 2 1 0 2 1 1 2 2 0 0 2 1 1 0 1 0 2 2 0 0 2 0 1 1 1 1 0 0 0 0 1 2 0 1 0 0 0 0 2 0 1 1 0 0 0 1 1 0 1 0 2 1 1 1 1 2 2 1 1 1 1 0 1 1 1 2 0 2 1 0 1 2 1 1 2 0 2 1 2 2 1 1 0 2 2 2 1 2 2 2 2 2 2 2 1 0 2 1 1 1 0 2 0 0 2 1 1 1 2 1 0 0 2 1 0 2 2 2 2 1 0 2 1 2 2 0 1 1 1 1 2 2 2 2 1 2 1 0 0 0 1 0 2 2 0 1 1 2 0 1 2 1 0 0 0 1 0 2 1 0 2 1 2 0 2 2 1 2 0 0 0 0 0 2 1 1 0 2 2 2 1 0 0 2 2 0 0 0 1 2 1 1 2 0 0 2 1 2 2 2 1 0 1 2 2 2 1 2 1 0 2 0 2 1 2 1 1 1 0 2 2 0 1 2 0 0 2 1 2 1 1 2 0 2 0 0 2 2 1 1 2 0 0 1 1 0 1 1 1 1 2 2 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 2 0 2 2 1 2 1 0 2 0 0 2 2 1 1 2 2 0 2 0 2 1 1 2 0 2 1 0 0 2 1 2 1 1 2 1 2 2 2 2 2 0 0 2 1 2 0 2 0 0 2 1 0 2 0 1 2 2 0 2 2 1 1 1 1 2 2 0 2 2 2 0 0 0 1 1 1 0 1 2 0 2 1 1 2 0 2 2 1 2 1 1 1 0 2 0 0 0 1 0 2 2 0 2 2 2 0 0 0 2 0 2 2 0 2 2 2 2 2 0 0 0 2 1 1 0 2 1 1 1 1 2 2 1 2 2 1 1 1 1 1 1 1 2 1 1 2 2 1 1 1 0 2 2 0 0 1 1 0 1 1 2 0 1 0 2 1 2 1 0 1 2 0 0 0 2 1 1 1 0 1 2 0 1 0 1 2 2 0 1 1 1 0 2 2 2 2 2 2 0 1 2 2 1 0 2 2 2 1 1 0 2 2 1 0 2 2 1 2 1 1 2 1 2 1 2 0 1 1 1 1 1 2 2 1 2 0 1 0 1 2 0 2 1 1 0 0 0 0 0 2 2 0 0 1 0 0 0 0 0 2 1 2 1 0 2 1 2 2 2 0 1 2 0 2 1 0 1 2 2 1 0 2 0 2 2 0 2 2 0 1 1 2 0 2 0 0 2 2 0 1 2 0 1 2 1 2 1 0 2 0 0 1 1 2 0 2 2 2 0 0 2 1 0 1 0 1 2 0 2 2 0 1 1 1 2 1 1 0 0 2 1 1 1 1 2 2 2 1 0 2 0 0 0 1 0 2 1 1 2 1 0 0 0 0 2 0 2 0 0 0 0 1 0 0 1 1 2 0 2 2 0 1 1 2 0 2 2 0 2 1 2 0 1 1 1 0 1 1 0 0 0 2 2 2 1 0 0 2 1 2 1 0 2 0 2 2 0 0 0 1 1 2 1 2 1 0 0 1 2 1 2 1 0 2 0 2 0 0 1 0 0 1 0 0 0 0 1 1 2 2 0 2 0 1 1 0 2 1 2 1 2 1 1 1 0 2 1 2 0 1 2 0
53 43 33 22 82 43 32 91 20 20 21 52 12 73 62 20 22 83 74 93 82 40 40 41 71 3 91 21 51 81 10 10 10 10 10 8 50 50 49 20 20 22 80 78 19 91 20 18 59 30 32 91 22 82 43 32 92 53 42 2 60 60 61 91 21 50 51 81 11 39 11 41 69 41 69 41 70 70 71 2 62 23 13 1 31 59 28 68 8 49 19 89 61 92 54 74 95 44 64 83 71 99 69 40 38 79 49 19 87 96 77 88 28 67 77 88 29 0 0 1 30 29 97 7 17 27 36 16 98 37 47 58 98 37 48 88 29 98 36 17 28 69 39 11 40 39 9 81 12 71 1 29 1 29 1 30 29 97 8 49 20 21 51 81 9 79 48 90 89 60 58 97 5 57 68 9 79 47 56 36 16 98 38 76 56 35 85 36 16 95 47 56 38 79 49 19 89 58 0 1 30 31 60 60 61 92 52 13 2 62 23 12 73 63 51 80 82 43 32 90 90 89 57 66 47 58 98 38 79 50 48 89 60 60 61 92 51 80 80 81 12 72 31 61 90 90 90 90 89 59 30 30 30 32 92 51 82 43 33 21 51 81 12 70 70 69 39 9 79 49 19 88 28 69 39 10 8 46 26 6 85 37 46 26 5 54 74 94 16 96 76 55 5 54 74 95 46 26 5 55 6 86 67 78 19 90 91 22 82 43 32 91 21 51 81 11 39 10 10 9 79 51 81 11 42 0 2 61 92 54 74 93 82 43 33 25 74 95 45 95 46 27 39 9 78 16 97 6 85 34 52 12 70 68 9 80 79 49 20 20 20 18 60 61 89 60 61 92 52 12 72 34 53 44 66 44 63 52 11 41 73 63 54 74 93 85 35 84 3 92 51 79 49 19 88 27 37 49 19 90 91 22 80 78 18 58 97 7 18 57 67 77 89 59 31 62 23 13 2 62 20 19 87 99 68 7 16 96 78 20 21 51 81 11 42 1 31 59 28 68 8 49 21 49 17 29 0 2 63 53 43 32 91 23 15 65 15 65 14 32 93 83 74 93 83 72 32 91 20 22 82 42 1 32 90 89 60 60 62 21 50 52 11 41 71 1 31 62 21 51 82 40 40 39 10 10 9 78 18 58 98 40 40 40 39 10 10 10 9 79 47 56 37 46 27 36 16 96 78 17 29 0 0 2 62 22 83 72 30 32 92 51 81 11 42 2 62 22 84 3 92 53 42 2 61 91 19 91 20 21 51 80 82 41 72 34 56 36 17 25 74 95 44 65 13 3 91 19 89 60 60 60 59 28 70 70 70 72 32 92 53 42 3 94 14 32 94 14 34 53 42 1 31 60 59 29 98 38 76 58 99 70 71 0 1 33 23 13 4 23 13 2 62 22 80 78 18 56 37 48 87 99 69 41 71 1 30 32 90 90 92 50 50 50 52 14 36 14 34 52 12 73 62 20 20 19 88 29 0 2 62 22 83 75 24 44 64 84 4 23 12 73 62 21 52 13 3 93 83 72 33 23 12 71 0 99 68 8 48 90 88 27 37 49 19 90 91 20 20 20 20 19 89 59 29 98 38 78 18 58 98 39 9 78 19 90 89 60 60 59 29 0 2 63 53 43 35 84 4 25 77 86 64 84 4 24 43 34 53 43 33 23 13 3 93 82 43 33 24 44 63 54 75 25 73 63 52 12 72 31 62 22 82 42 2 62 21 51 82 41 71 0 0 98 38 77 87 96 76 58 96 75 25 75 25 75 25 75 25 74 96 77 86 68 9 81 13 5 53 43 33 22 84 3 92 51 81 11 42 1 31 61 91 22 82 43 33 21 51 82 42 2 62 20 20 20 20 20 20 21 49 20 20 21 53 42 0 2 61 89 60 60 60 59 29 0 2 60 60 62 22 81 10 10 9 79 47 59 31 59 29 0 0 2 62 21 51 79 49 20 20 20 20 20 21 52 13 3 93 82 41 70 70 68 8 47 57 69 38 78 18 58 97 9 77 88 27 35 84 4 25 75 25 74 95 45 95 47 59 29 99 70 72 31 62 22 82 42 1 33 22 82 41 72 30 29 0 98 37 45 97 8 49 19 89 58 99 70 72 33 21 51 79 50 52 12 70 69 38 78 20 19 91 20 18 58 99 71 1 32 91 20 20 19 91 21 50 49 18 56 36 16 94 14 32 93 84 5 57 67 78 18 59 30 30 31 61 91 20 22 81 12 72 31 63 52 13 1 31 61
1000 100 10 3
0 2 2 2 0 2 2 0 2 1 0 1 1 1 2 2 1 0 0 0 2 0 0 0 1 0 2 2 2 0 1 1 0 2 1 2 0 1 2 0 2 2 1 0 0 0 1 1 0 1 0 0 1 0 2 0 2 1 1 2 0 0 2 2 2 1 2 0 0 0 1 2 0 1 0 2 0 2 1 2 0 0 1 1 2 2 1 2 0 0 0 2 0 0 1 1 1 1 0 2 2 0 1 2 1 1 0 0 2 1 1 1 0 2 1 1 1 0 0 1 2 1 0 1 0 0 0 0 1 2 1 2 0 2 0 1 2 0 0 1 0 1 0 2 2 1 2 0 1 1 1 0 2 1 2 1 1 1 2 2 1 1 2 1 2 0 0 0 1 1 2 1 1 1 2 1 0 2 1 2 1 1 0 2 0 0 1 0 0 2 2 1 0 0 1 1 1 1 1 2 0 0 0 2 1 1 1 1 1 2 1 2 2 0 0 2 2 1 1 2 2 1 1 2 2 1 0 0 2 1 2 0 1 0 1 2 2 2 0 2 1 2 0 2 2 2 2 1 2 2 0 1 1 2 2 0 0 1 2 1 2 2 2 2 2 2 1 0 2 2 0 1 1 1 0 2 2 0 1 0 2 0 0 2 0 0 1 1 0 1 1 2 1 1 1 1 0 1 0 2 0 0 1 1 0 2 2 1 2 1 1 2 0 1 2 0 0 0 2 2 2 0 0 1 1 1 2 1 1 2 0 1 0 1 1 1 1 2 0 1 0 1 2 2 2 2 1 1 0 1 1 2 0 0 1 0 2 0 2 2 1 1 1 2 1 2 0 2 1 2 1 2 1 2 2 1 0 2 0 1 0 1 2 0 2 2 2 1 1 2 2 1 1 1 0 0 2 0 2 1 1 0 0 2 2 1 2 2 0 2 2 2 1 1 2 0 0 0 0 2 0 1 0 2 1 1 2 1 2 2 1 2 2 2 1 0 1 1 1 1 2 0 1 0 1 2 2 2 2 0 2 1 0 1 1 0 2 0 1 0 0 2 2 2 1 2 1 0 0 0 2 0 0 2 0 1 2 0 1 0 1 1 2 0 0 1 0 2 0 0 0 0 0 1 1 0 2 2 2 0 0 0 1 2 2 0 2 2 1 2 2 2 1 0 1 1 1 0 1 0 0 0 0 0 0 1 2 1 0 1 0 1 0 0 0 0 2 2 0 2 1 1 0 2 1 2 0 2 2 0 2 0 2 1 2 2 2 0 0 0 0 1 1 2 0 0 1 0 2 1 0 0 2 2 0 2 1 0 0 1 2 1 0 1 1 2 0 2 2 2 1 0 0 2 0 1 1 0 2 0 0 2 0 2 1 1 1 2 0 1 2 1 2 0 2 2 0 2 2 1 2 2 1 1 0 2 0 0 0 2 1 2 1 1 0 1 0 0 2 2 2 0 1 0 0 1 0 2 2 0 1 1 1 2 1 0 1 1 2 2 2 2 0 1 1 1 2 0 0 2 1 0 2 2 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 2 0 0 0 0 2 0 2 1 1 2 0 1 2 0 1 2 2 0 2 0 0 0 1 0 0 2 2 1 2 2 2 0 1 1 2 1 1 1 1 0 0 1 0 2 0 0 2 1 1 0 0 1 2 1 0 1 1 2 2 1 2 0 2 2 1 2 2 1 2 1 2 0 1 2 0 2 0 1 1 0 0 1 1 0 2 0 1 2 0 0 2 2 1 2 2 2 2 2 1 1 0 1 0 0 2 1 2 1 0 2 2 0 2 1 0 0 2 2 2 1 1 1 1 1 2 2 0 2 0 0 0 0 1 2 0 2 2 2 1 2 2 1 0 1 0 2 2 2 2 2 2 1 0 1 1 1 2 1 0 2 0 1 1 2 2 2 2 0 0 0 0 0 2 0 2 2 0 0 1 0 2 2 2 2 1 1 2 1 2 1 0 2 0 1 0 2 2 0 0 2 0 1 0 2 2 0 2 2 2 1 0 1 0 2 2 0 1 0 1 1 1 0 0 1 0 1 2 1 2 0 2 0 2 2 0 2 0 1 1 0 1 0 0 2 0 0 2 1 2 2 0 1 0 2 2 1 1 2 2 1 2 1 0 2 0 2 0 1 1 1 2 1 1 0 0 0 2 1 0 0 2 0 1 2 2 2 0 0 2 1 2 1 0 0 0 1 2 2 1 2 1 0 2 1 0 1 0 2 1
53 43 32 91 20 22 82 41 71 99 68 10 9 78 17 26 4 25 77 89 59 28 69 39 11 41 73 61 90 90 90 91 22 83 71 0 98 39 9 77 88 26 4 24 44 66 46 27 37 48 89 59 29 0 2 62 23 13 2 61 89 60 62 20 19 87 98 36 18 59 31 60 58 99 69 41 71 2 62 21 49 19 91 20 19 88 27 37 46 26 8 50 48 89 61 91 21 50 49 21 50 49 20 19 89 59 29 0 0 98 38 79 49 19 88 27 36 15 65 16 97 6 87 97 8 48 89 61 91 20 19 88 27 37 47 59 29 99 69 40 40 41 70 72 31 61 91 20 21 52 13 3 94 14 34 54 73 62 21 50 49 20 20 19 89 59 30 30 32 92 53 42 2 61 92 50 49 20 18 57 67 78 18 58 96 77 88 28 69 40 40 38 77 87 99 69 39 9 79 49 19 90 92 54 72 31 62 23 13 3 93 84 3 92 54 76 55 3 92 53 42 2 61 91 19 88 29 1 33 21 52 11 43 32 94 15 65 15 64 86 66 45 94 15 65 15 63 51 81 11 40 42 3 94 14 34 56 37 46 26 7 15 64 83 72 30 30 31 61 90 88 30 29 98 39 9 77 86 67 76 57 66 48 89 58 99 70 69 39 9 80 79 47 57 67 76 57 69 39 11 40 41 73 62 22 84 2 60 59 29 0 1 29 99 69 38 79 51 82 41 71 99 70 70 70 70 70 69 40 39 8 48 88 30 31 62 23 13 2 62 22 83 74 92 50 49 17 28 67 79 50 50 49 20 22 82 44 62 24 43 33 23 14 34 54 75 24 44 64 83 72 31 60 61 89 59 30 32 91 22 83 75 25 74 95 43 31 61 90 91 20 19 88 27 38 80 81 11 43 31 62 23 15 66 45 95 44 62 20 20 20 18 57 66 47 56 37 49 20 22 82 43 34 56 36 16 95 44 64 83 72 33 21 50 48 88 30 31 62 23 12 72 33 22 83 73 61 91 19 88 28 66 47 59 30 30 32 91 21 50 50 52 10 8 48 87 96 77 87 98 38 77 88 30 28 68 8 46 28 67 77 86 65 13 4 25 74 96 76 58 98 38 78 19 90 91 21 51 81 10 12 74 96 76 54 73 64 83 71 1 29 97 5 54 74 93 83 74 95 44 65 15 66 46 26 6 85 35 86 66 47 58 98 38 80 81 13 1 31 63 51 82 41 73 62 23 13 5 53 41 71 99 70 69 40 38 76 55 5 57 68 8 47 58 98 38 80 80 80 78 18 60 61 89 58 99 69 38 80 82 43 32 91 21 52 11 40 41 69 39 7 16 98 38 78 19 89 59 31 59 30 32 91 23 11 42 3 92 52 14 34 54 75 24 45 93 83 73 61 89 60 59 29 99 69 39 8 48 88 30 30 31 59 29 98 38 78 18 60 60 58 97 8 48 90 91 20 21 50 50 52 13 4 23 12 72 33 24 43 31 61 90 88 30 31 60 60 58 99 69 38 77 88 27 36 16 95 46 26 7 17 29 98 37 46 26 8 47 58 98 38 78 18 59 31 61 90 92 52 11 42 0 0 99 68 8 47 57 67 78 18 60 62 22 82 43 35 84 3 93 82 40 38 79 48 89 57 66 47 57 67 77 87 97 9 78 18 59 28 69 40 41 73 62 22 83 74 95 46 25 75 25 75 25 74 94 13 3 91 21 50 49 17 28 68 6 88 26 7 18 57 67 79 50 50 52 12 74 95 45 96 77 85 34 53 41 71 0 0 99 68 9 81 10 12 73 61 90 90 91 23 12 71 2 61 91 23 15 63 53 41 70 69 38 78 19 87 97 9 79 50 52 14 35 84 3 93 83 73 63 54 74 94 14 34 54 75 24 44 63 51 81 9 79 50 51 82 43 33 22 82 40 40 39 10 8 48 88 26 6 87 97 9 81 11 43 32 91 23 14 35 86 64 84 2 61 90 91 21 50 48 89 59 28 68 9 81 9 79 51 83 72 32 92 52 12 72 32 91 19 88 28 69 38 78 17 25 76 57 68 9 78 19 89 61 92 52 13 1 31 60 60 59 29 97 7 17 25 77 87 98 40 39 10 10 10 12 73 62 23 13 2 64 84 4 24 42 3 92 51 80 80 80 80 81 9 79 47 59 29 98 37 47 56 36 18 60 62 20 19 91 22 82 43 32 90 88 27 39 11 40 41 70 69 41 72 32 92 50 50
1000 20 20 5
2 0 2 0 4 3 0 4 1 3 3 0 2 2 0 3 4 1 0 4 0 2 0 1 1 2 4 0 1 1 4 2 2 0 2 1 2 4 1 3 4 3 0 1 0 3 3 3 4 4 4 2 0 1 0 4 0 2 1 4 2 1 0 2 1 2 4 4 2 3 4 0 1 1 1 0 2 3 4 0 1 1 0 0 0 4 3 4 3 1 0 3 0 1 0 0 2 0 1 4 4 3 2 4 1 2 2 1 4 4 0 1 0 0 3 2 2 0 1 1 0 4 3 3 1 1 0 3 4 0 4 0 4 3 3 1 4 3 3 0 4 4 1 1 3 3 0 4 4 2 2 1 2 3 2 2 3 3 1 2 2 0 2 4 0 4 4 0 4 2 2 4 1 3 3 3 1 0 2 1 3 4 1 3 3 1 1 4 1 1 3 2 1 2 2 1 3 0 4 4 1 2 1 4 2 2 2 1 1 3 3 2 0 3 0 2 2 3 4 3 0 3 0 1 0 2 1 1 3 1 0 2 1 4 0 2 0 3 3 3 1 0 0 1 3 1 0 1 2 2 1 0 3 3 4 4 1 0 3 2 1 2 2 2 0 1 2 0 3 2 0 3 3 1 1 0 4 0 4 0 4 1 1 2 4 3 1 0 2 0 0 3 4 3 4 4 1 1 4 2 4 1 0 1 3 1 0 3 2 0 2 3 2 2 4 1 1 2 2 2 0 3 1 3 2 0 2 3 0 4 0 2 1 3 0 0 4 4 1 0 0 1 0 3 2 2 4 4 3 3 1 3 2 4 1 1 2 0 3 1 0 1 1 1 1 0 0 0 4 1 0 3 3 1 3 4 3 0 4 0 4 4 0 0 3 0 4 4 0 4 0 3 4 3 0 1 3 3 1 1 2 2 1 3 1 3 2 4 1 0 2 2 1 2 2 4 3 3 2 0 0 3 1 0 2 2 1 3 4 3 0 4 0 2 1 1 0 0 4 3 1 3 0 2 4 3 1 4 1 1 3 0 4 1 4 1 2 0 0 2 0 3 2 1 4 4 2 0 4 3 1 1 1 4 4 1 4 0 0 3 2 4 4 4 2 0 0 3 4 4 3 0 0 0 1 3 4 4 1 3 1 4 1 3 0 1 2 0 4 1 1 0 2 3 2 2 1 2 1 0 1 2 2 0 4 4 0 0 0 3 0 2 3 4 0 2 3 4 4 3 2 1 3 4 3 1 4 2 2 2 4 0 0 1 1 0 0 2 2 1 3 2 4 2 4 4 0 0 1 1 4 1 2 1 0 2 2 0 4 4 3 2 3 1 2 3 0 1 2 4 4 0 1 4 4 1 0 1 1 4 2 4 1 3 3 2 0 4 2 3 2 1 0 4 3 1 1 2 3 4 4 0 2 1 3 0 4 0 1 2 3 2 4 4 3 4 2 4 4 3 3 1 3 0 4 3 2 2 4 4 2 3 4 2 2 4 4 3 1 1 3 1 2 4 2 4 3 3 2 2 3 4 4 2 4 2 3 0 2 4 0 2 4 1 2 1 2 0 4 3 3 1 4 1 2 4 1 3 3 0 0 4 2 0 0 3 2 4 3 4 1 1 0 0 1 0 4 3 0 0 1 3 3 0 2 2 2 0 0 2 2 4 0 1 3 4 3 3 4 1 1 1 3 1 4 3 3 4 2 3 4 2 4 3 1 2 3 2 3 0 1 3 0 4 0 0 0 0 4 1 0 3 0 2 0 4 1 2 2 3 2 1 1 2 1 0 4 1 4 0 1 1 2 0 4 2 3 2 0 2 1 0 3 3 4 1 4 4 1 4 4 0 4 1 0 1 3 4 3 3 2 2 0 1 4 3 0 0 3 0 3 4 4 1 0 1 2 2 1 4 1 3 3 3 1 3 0 2 3 4 3 0 4 0 1 0 4 3 4 1 2 0 2 0 3 2 1 0 3 4 4 0 1 2 2 2 0 0 1 2 4 3 0 1 2 2 1 3 1 1 1 3 2 3 1 2 0 2 1 4 1 4 0 1 0 0 0 1 2 0 4 3 0 4 2 1 2 3 4 1 4 2 0 0 0 0 4 1 0 2 3 4 3 3 3 0 4 3 3 0 1 4 2 3 3 4 3 0 3 3 0 4 0 2 1 1 1 2 4 3 4 4 4 0 3 1 2 1 3 4 2 4 3 4 1 0 0 4 4 1 4 1 2 0 4 1 0 1 1 0 1 3 1 4 4 3 0 3 0 4
18 16 18 16 17 4 3 17 3 13 1 12 14 14 12 14 12 10 13 4 3 17 8 8 8 7 18 17 10 13 6 6 6 4 5 13 6 4 2 2 3 11 19 9 0 1 10 11 2 0 19 9 17 8 8 9 15 7 18 1 7 16 16 16 14 13 5 14 14 15 3 9 2 1 11 0 0 0 17 4 8 11 3 15 9 0 18 17 4 5 18 18 16 16 15 8 10 10 10 10 7 13 4 5 14 14 13 1 13 3 9 3 12 16 19 9 18 0 3 15 4 8 8 6 4 6 8 8 9 19 11 19 10 8 8 7 18 17 7 15 7 15 1 12 15 2 3 17 3 13 3 13 6 5 15 6 7 15 2 3 12 13 7 16 15 8 5 12 16 13 2 3 11 1 10 9 17 9 19 11 4 2 0 0 1 10 11 2 19 9 1 11 1 10 11 19 10 9 2 2 1 10 11 0 17 5 15 4 4 6 4 1 11 2 3 13 3 11 1 10 10 11 18 18 18 1 10 9 19 8 9 0 18 0 19 13 5 16 13 3 12 12 14 16 17 4 4 6 5 16 16 15 8 8 6 3 9 2 2 3 11 4 3 12 12 16 18 17 7 16 14 14 14 15 7 0 4 1 12 12 14 14 14 13 2 1 9 18 1 11 1 13 3 11 0 0 17 7 18 16 16 12 14 15 7 16 15 7 17 5 19 7 16 15 6 2 1 14 16 15 3 13 1 10 10 10 12 14 15 8 7 18 19 10 11 2 3 11 17 9 0 0 0 1 9 18 16 12 8 9 17 6 6 7 14 16 19 10 10 11 0 4 7 16 15 7 17 11 5 11 4 4 4 5 17 4 1 11 4 1 12 10 8 9 2 0 3 11 1 12 8 10 9 16 15 7 0 0 0 1 10 8 9 19 6 7 16 15 4 7 0 18 0 19 9 18 15 2 19 11 4 5 15 4 6 8 9 19 10 7 15 8 4 8 7 0 0 2 2 18 17 6 6 8 7 17 8 9 15 8 10 8 9 16 19 9 19 11 1 11 2 4 5 17 10 8 4 2 5 15 6 8 7 16 12 9 1 11 5 16 16 15 5 12 11 19 10 12 9 19 6 4 4 6 9 0 19 6 4 4 1 11 19 10 7 1 14 12 12 8 10 9 1 12 13 1 11 3 15 8 11 2 1 12 16 15 2 6 8 10 9 3 11 18 15 6 4 1 9 17 5 16 17 8 6 7 0 16 14 13 2 2 3 15 5 14 16 18 16 18 1 11 1 10 9 17 6 6 7 18 1 11 0 19 12 16 15 3 14 11 1 10 12 10 12 13 2 2 5 15 4 2 3 12 12 11 1 12 13 5 15 7 13 4 2 2 0 4 0 19 8 9 0 4 4 4 7 18 0 1 10 9 0 1 10 11 4 2 4 7 19 8 9 19 7 16 16 18 17 4 2 2 2 1 15 3 14 15 6 4 2 3 14 14 14 16 14 13 0 1 14 11 2 4 1 11 18 17 4 6 7 17 4 4 3 11 3 11 4 5 11 1 13 1 10 8 10 10 14 13 4 2 2 18 17 6 2 5 15 2 2 3 12 13 3 15 4 4 0 17 5 16 19 9 0 2 6 5 15 9 0 0 18 18 19 11 2 3 17 9 0 2 0 4 6 4 2 2 1 10 9 19 11 18 1 7 14 11 17 9 17 3 14 10 9 18 0 18 18 17 10 11 19 10 8 9 19 13 4 4 3 14 12 14 12 16 14 16 16 14 13 2 1 13 4 7 18 18 1 8 12 15 4 6 7 13 2 2 4 7 18 19 11 18 16 16 18 14 10 12 8 7 1 11 1 11 1 10 8 6 7 16 17 10 12 9 19 9 1 11 5 15 1 11 0 1 10 12 13 6 3 14 11 0 17 9 18 19 7 17 7 18 18 15 7 18 0 16 13 0 1 13 6 4 5 14 14 14 17 5 12 9 2 3 14 13 3 13 5 15 7 14 15 5 15 3 11 0 18 19 8 11 1 9 0 1 10 12 13 6 3 16 14 14 13 3 13 7 17 5 17 6 7 0 19 10 9 1 11 0 19 6 8 10 13 6 10 9 18 1 12 9 19 6 5 13 4 1 10 11 4 7 17 9 16 16 13 2 3 13 4 6 6 9 1 11 0 19 11 1 9 19 6 4 4 5 15 3 13 1 7 16 15 3 13 6 9 19 8 4
1000 20 20 5
2 4 2 4 0 1 1 1 1 4 2 2 1 1 3 3 0 0 1 1 4 3 0 1 2 4 1 3 3 4 2 3 1 0 4 3 3 4 0 3 1 0 2 4 2 4 0 3 2 2 4 3 0 3 3 2 2 1 4 2 2 1 0 1 1 2 4 0 4 3 0 1 0 0 2 2 1 2 2 4 4 2 1 0 2 1 0 1 4 2 1 4 4 2 3 1 1 2 0 2 2 2 3 2 1 3 4 1 2 2 3 4 2 1 1 2 4 1 1 0 3 1 0 3 1 4 0 2 1 3 2 0 3 0 2 4 4 3 2 1 1 0 1 1 0 0 0 3 3 1 3 4 0 4 4 2 1 2 3 4 4 1 1 0 3 1 3 2 2 3 2 2 3 1 1 2 4 2 0 0 1 3 3 3 4 0 1 3 2 1 4 1 4 1 0 1 2 0 1 4 3 4 2 4 2 4 4 3 1 4 1 0 0 4 4 2 1 2 0 2 4 0 3 3 3 4 4 0 3 3 4 4 4 3 3 3 4 0 2 4 0 1 3 2 2 3 2 2 0 0 0 2 4 4 1 3 0 0 1 2 0 2 0 4 2 3 1 4 2 2 2 3 0 1 0 3 1 0 3 0 0 2 4 0 1 1 4 1 4 0 0 2 4 2 2 3 4 1 2 4 2 2 1 0 0 3 3 3 4 2 1 0 4 3 4 3 0 2 4 0 1 3 1 2 3 4 2 1 4 4 1 4 4 0 0 1 2 1 2 0 1 0 4 4 1 3 1 1 2 4 1 4 2 4 2 2 1 4 0 1 3 2 2 1 0 3 2 2 0 1 1 2 3 2 3 0 3 3 0 0 3 0 1 1 2 4 1 2 0 2 3 1 2 1 4 3 4 2 4 4 2 2 2 3 2 1 0 2 0 1 0 3 2 0 1 2 1 0 4 2 1 2 2 2 0 4 4 0 3 2 1 3 2 4 1 3 1 1 0 2 0 1 0 4 1 4 3 4 1 2 2 1 3 2 3 4 1 0 2 3 2 4 1 4 4 1 2 3 4 3 3 0 4 1 0 2 1 2 0 1 2 0 3 0 3 4 0 0 1 1 0 3 1 4 1 2 3 1 0 3 1 3 1 0 2 3 2 3 0 0 4 3 2 2 1 2 4 2 2 1 2 0 4 1 4 0 0 4 1 4 3 1 3 2 0 2 0 4 0 1 4 0 4 0 3 1 1 0 0 2 0 1 1 1 1 2 2 3 4 2 4 4 1 4 4 1 0 0 3 2 2 0 3 4 4 0 4 3 0 2 0 0 2 0 1 4 0 1 0 1 0 3 0 1 0 1 1 3 0 1 4 2 1 0 4 1 0 3 0 2 1 4 3 2 3 0 0 3 4 0 0 0 4 0 3 2 1 0 4 2 0 3 1 1 0 4 1 2 4 3 3 1 4 1 1 3 2 2 0 2 2 2 2 0 4 0 2 1 0 4 0 3 1 0 0 4 3 0 4 0 1 3 0 3 1 4 4 4 4 4 1 2 2 3 4 4 1 3 2 1 3 0 1 4 3 0 4 2 0 2 0 1 0 3 0 0 2 3 0 3 4 1 3 0 1 1 0 0 1 4 0 3 4 3 1 3 3 4 2 4 4 3 0 3 0 3 0 2 4 0 3 1 3 4 4 4 1 1 0 0 2 0 1 2 1 1 1 3 4 3 3 3 3 0 0 3 2 3 3 2 2 4 3 0 0 4 2 0 3 1 4 3 3 1 1 0 0 1 3 1 4 0 1 4 4 2 0 4 2 0 3 2 2 0 1 1 0 3 3 0 0 1 0 3 4 0 4 4 3 1 3 1 3 1 4 0 1 2 3 4 4 4 4 3 4 2 2 4 2 4 0 0 0 2 1 2 1 0 3 0 3 1 0 0 3 3 3 0 3 2 0 3 3 0 2 1 0 0 1 2 3 0 0 1 1 3 0 3 3 0 0 2 4 3 2 0 3 4 1 4 3 3 2 3 2 1 2 0 1 0 2 4 0 0 2 1 3 3 1 3 2 3 3 1 1 1 3 2 4 4 3 2 0 0 1 0 2 4 1 1 3 2 3 2 1 4 1 1 3 0 1 3 3 2 0 4 1 3 2 3 1 3 1 2 2 3 4 1 1 1 3 4 4 2 2 0 3 1 4 0 0 3 4 2 1 0 3 0 3 4 0 4 3 1 0 4 0 2 2 3 4 2 3 4 2 0 1 1 0 0
4 6 5 13 0 2 5 15 7 19 9 19 10 10 9 0 0 3 17 6 8 5 12 14 17 7 17 6 6 5 13 5 15 4 7 16 15 4 1 15 4 5 16 14 11 0 18 2 19 11 2 18 16 16 13 2 2 1 12 10 12 14 15 6 5 16 15 1 12 12 11 2 5 19 11 2 1 11 1 9 17 5 15 7 19 8 10 14 14 12 12 14 14 12 11 19 10 13 2 3 11 2 1 8 9 19 10 6 7 16 17 6 2 3 12 13 5 15 7 18 19 7 16 17 5 14 10 10 11 3 11 2 6 3 17 9 17 4 3 14 17 10 11 1 10 13 4 7 16 15 7 16 14 17 4 1 11 4 4 1 7 14 16 18 1 12 11 19 10 10 8 10 9 0 0 19 8 6 4 5 19 11 2 1 12 10 14 17 7 16 19 6 5 11 4 8 9 18 0 19 7 18 14 15 4 5 15 5 12 14 13 6 10 14 13 2 3 16 14 16 18 14 15 5 14 13 2 0 2 19 6 2 0 0 1 9 19 5 15 4 2 2 3 10 12 12 12 11 3 15 7 19 10 6 3 12 12 13 3 15 3 13 3 17 3 12 10 13 0 2 0 18 17 11 2 4 4 7 18 17 11 3 13 0 0 19 11 0 2 2 4 5 13 3 14 16 16 12 13 5 11 0 1 11 3 16 17 6 4 4 6 6 10 10 7 13 1 13 2 0 0 0 17 10 12 10 9 18 18 16 16 16 16 14 18 0 1 10 13 1 12 14 16 14 11 0 0 1 12 10 7 17 5 16 14 15 3 15 4 4 3 13 1 10 10 12 13 2 2 2 3 15 4 3 12 13 6 7 16 0 4 3 15 6 8 8 5 14 14 14 13 0 2 2 1 8 7 14 12 12 10 9 19 9 18 16 19 13 1 14 15 6 6 6 10 10 11 1 12 8 8 7 16 14 16 17 7 16 0 18 18 19 7 18 16 18 19 9 18 0 1 13 6 7 17 10 7 16 15 8 9 0 19 10 9 16 14 14 16 14 12 12 8 10 6 5 18 16 13 0 18 15 8 5 18 19 9 1 10 10 12 11 4 2 2 1 10 12 15 4 3 17 7 18 16 16 16 17 8 10 8 9 16 19 10 12 9 17 8 9 3 12 10 11 1 10 10 6 8 6 6 8 8 8 7 16 17 8 4 3 11 18 18 16 15 6 6 8 7 1 12 12 16 13 7 18 18 17 7 0 0 2 1 13 6 9 17 9 19 5 15 1 7 18 14 11 4 4 5 12 11 19 12 9 16 12 13 0 0 0 19 13 5 14 14 17 4 4 6 6 7 18 19 12 13 6 5 14 14 18 17 3 11 4 4 3 14 15 2 6 6 5 14 12 11 18 2 3 12 12 15 8 9 19 10 8 9 0 2 18 18 0 19 10 9 3 9 0 19 5 16 13 5 12 11 0 1 12 10 14 12 11 2 0 3 10 14 16 19 13 3 14 13 4 7 1 11 19 12 10 11 3 10 11 2 4 0 0 18 14 12 11 0 18 18 14 10 11 1 9 1 12 13 5 11 19 10 6 4 5 17 7 19 13 3 14 17 8 9 1 12 12 14 11 4 3 15 5 17 10 6 9 17 6 7 0 1 9 16 14 10 8 5 16 15 6 4 5 16 16 19 9 1 11 17 3 12 13 5 18 0 0 4 6 4 3 16 17 4 3 11 2 2 2 3 14 11 19 7 17 6 8 4 2 6 10 8 6 10 9 18 17 6 5 14 14 15 5 17 7 16 12 13 2 1 11 19 13 3 14 15 5 14 15 6 9 18 19 8 8 12 16 19 13 3 13 5 13 3 12 15 2 1 8 9 16 18 18 16 16 12 11 18 14 11 0 1 12 8 9 17 7 0 3 11 2 1 10 10 8 10 10 9 19 10 8 8 5 18 18 16 16 15 6 9 19 8 11 5 15 7 17 10 12 14 15 3 15 2 0 0 2 4 0 17 7 18 18 17 7 16 15 5 16 14 13 3 14 16 19 13 4 2 2 2 1 10 9 0 0 18 19 8 8 9 19 12 10 9 18 14 12 13 6 8 7 1 10 9 0 2 0 1 9 19 10 9 2 2 0 1 13 4 5 15 7 13 5 13 5 12 11 1 14 14 13 0 19 8 10 13 0 0 19 8 6 10 7 18 16 19 13 2 1 13 4 4 2 3 10
2000 30 40 10
8 2 2 1 1 2 1 6 7 6 0 2 9 1 0 9 0 3 3 1 2 0 2 6 6 2 7 6 5 4 8 5 6 0 9 0 6 1 0 6 2 3 0 3 0 2 0 8 8 0 6 5 9 6 0 7 5 4 7 8 0 1 1 4 5 6 6 5 8 7 7 7 3 2 3 7 6 5 6 9 9 9 1 3 3 0 3 8 5 2 4 9 7 1 7 9 1 3 6 5 4 3 9 2 8 2 3 9 5 3 2 0 1 4 8 0 1 8 9 5 2 5 8 8 2 5 1 5 0 0 8 2 7 3 0 4 1 3 1 8 5 0 5 7 6 2 4 0 1 0 2 9 6 2 6 9 0 8 1 3 8 0 8 5 8 9 3 9 4 6 2 1 6 2 1 2 8 4 0 4 8 0 9 6 1 7 9 2 1 4 3 7 1 5 3 6 2 3 8 7 9 2 0 0 7 0 0 4 9 5 6 3 2 4 1 4 7 1 1 4 0 0 2 9 5 0 7 4 2 9 5 2 0 0 0 3 6 2 1 5 0 8 4 4 2 1 0 9 8 3 9 2 2 2 6 5 9 2 2 6 0 0 4 2 7 5 8 1 7 2 2 3 5 1 1 9 6 0 4 4 8 6 4 1 4 7 9 5 3 6 0 8 1 2 5 8 9 5 8 9 7 2 2 1 9 5 0 1 9 5 0 7 2 5 6 8 3 8 2 0 6 5 1 4 5 9 9 4 2 7 6 4 1 0 2 7 2 5 9 7 0 1 4 2 3 9 8 3 2 6 8 4 4 4 3 0 5 5 1 8 3 4 2 5 8 0 8 7 3 6 7 5 2 3 8 6 9 4 6 4 8 1 5 1 8 9 9 2 1 6 2 3 2 3 4 0 4 6 8 4 2 1 2 0 2 3 9 9 7 5 6 2 8 0 3 2 8 5 6 8 8 0 2 1 6 9 5 1 2 5 8 6 3 1 6 7 7 0 6 9 9 5 0 5 7 9 3 7 2 1 5 2 2 4 2 9 7 6 0 9 2 5 3 9 8 4 9 7 4 7 9 8 7 1 8 9 4 4 9 6 4 8 0 8 4 0 1 1 2 1 9 6 4 0 0 6 6 9 8 0 3 0 6 5 6 8 4 8 8 5 2 2 2 7 3 6 0 0 8 7 0 7 0 2 5 3 7 1 0 3 8 2 7 3 0 5 2 4 3 1 2 2 6 9 8 0 3 7 1 0 2 1 1 9 7 5 9 6 8 4 4 3 0 6 0 4 9 9 0 4 6 3 7 2 5 9 4 0 4 5 6 6 2 5 0 0 8 8 6 4 0 7 0 0 5 3 3 1 3 5 6 5 1 7 1 9 4 3 2 0 3 2 6 7 5 2 6 4 9 8 5 9 7 9 1 4 7 2 5 7 3 3 8 4 8 5 9 1 2 7 6 1 3 5 0 3 6 9 9 8 5 6 1 2 5 5 8 6 3 0 1 4 8 1 8 4 7 2 5 2 3 9 2 0 2 1 7 8 2 2 5 9 7 6 5 6 5 2 7 9 7 7 5 0 6 0 4 2 6 1 6 2 3 4 0 1 3 2 6 0 7 4 0 0 5 5 2 7 4 4 5 0 8 0 2 1 3 5 2 0 9 8 0 2 3 6 1 9 0 5 2 3 2 4 8 6 3 2 8 6 6 0 1 8 5 6 7 4 4 3 0 5 1 2 2 4 1 5 5 1 0 3 4 8 5 9 6 7 9 5 6 4 5 3 5 2 8 9 5 5 2 2 4 8 4 2 9 2 6 0 3 8 9 1 6 9 8 3 3 6 7 1 4 3 2 1 0 6 0 4 7 7 9 6 7 5 9 0 6 4 2 3 1 7 9 8 3 9 4 2 1 6 1 1 3 9 5 4 6 1 7 6 0 3 5 3 1 2 1 7 0 6 7 6 0 0 0 2 7 9 4 3 1 6 0 1 6 3 1 4 8 2 3 1 9 6 6 9 5 8 0 4 8 6 6 9 0 2 5 7 9 6 0 8 4 1 0 0 6 5 3 7 4 1 2 0 5 3 9 1 3 9 5 9 9 5 6 7 9 2 6 0 9 8 8 7 2 8 0 9 9 8 8 2 9 5 4 0 1 4 3 4 4 0 9 7 6 9 5 0 7 3 7 0 2 4 5 0 4 0 7 9 0 0 5 0 9 8 9 1 0 0 8 3 8 0 8 9 6 4 1 6 4 2 6 6 0 6 3 1 6 1 3 6 4 5 7 1 6 9 2 6 5 1 8 1 0 5 2 6 0 6 7 4 4 8 8 3 0 5 2 7 4 2 9 5 0 7 6 8 8 6 6 2 7 9 7 7 3 0 0 6 5 3 7 2 1 7 2 9 8 6 3 3 8 2 1 3 9 5 8 2 5 1 8 3 3 6 4 6 9 7 7 0 3 2 1 8 9 8 9 9 5 1 5 1 5 1 2 2 0 7 9 2 9 5 0 8 9 1 2 9 9 4 1 1 7 5 4 3 0 4 7 6 0 3 4 9 3 0 3 7 4 2 2 0 6 0 0 4 6 2 1 6 0 7 4 5 5 2 9 3 6 0 6 6 4 1 2 5 3 1 8 6 4 3 6 4 4 1 8 2 4 6 4 3 2 6 3 1 8 7 4 2 5 5 5 5 4 1 9 3 5 0 9 0 1 1 6 6 2 2 3 2 2 8 9 3 3 2 3 5 6 0 3 1 1 7 3 8 9 1 4 6 7 3 7 8 6 8 5 7 4 7 8 5 8 1 8 6 6 1 4 4 6 0 0 0 4 5 1 7 8 9 4 5 4 8 5 3 8 1 8 5 7 1 2 0 1 0 6 2 4 8 1 3 6 9 0 1 6 2 7 8 1 7 9 4 6 6 1 4 4 4 6 2 9 0 2 5 4 1 1 6 9 2 1 3 2 9 2 1 2 3 9 5 9 2 4 8 6 7 6 5 9 5 0 3 7 3 0 3 4 3 6 0 3 2 0 7 1 6 0 6 6 5 4 0 8 0 1 6 6 4 2 8 1 4 7 4 9 2 0 9 2 4 9 8 4 5 1 7 8 6 3 8 5 3 5 1 7 1 2 3 0 8 8 2 1 7 4 3 2 6 2 5 9 0 2 3 7 1 2 6 8 0 1 0 2 1 6 4 8 7 8 7 0 0 3 7 7 5 9 7 5 0 7 8 6 0 2 1 8 3 7 3 2 3 4 5 3 8 1 5 2 3 9 0 5 9 1 5 0 2 9 0 8 6 6 9 0 6 0 8 0 4 4 4 5 7 5 8 4 5 9 8 5 3 8 2 3 3 6 6 2 9 8 2 0 7 4 8 0 5 4 1 7 7 3 9 6 8 4 2 5 5 7 9 8 7 1 6 1 1 3 9 0 1 4 2 8 6 3 4 7 0 0 2 4 1 4 5 1 2 2 8 1 3 1 8 5 9 0 6 2 8 9 5 7 9 2 0 6 0 7 2 2 6 3 1 5 2 8 8 8 4 1 5 1 7 0 6 9 1 8 4 4 5 4 7 8 7 2 0 8 6 5 9 7 4 5 9 0 7 4 4 0 8 1 2 6 2 1 3 3 5 3 7 9 1 9 3 1 9 3 4 8 7 6 3 3 8 7 6 7 1 2 1 5 7 5 1 3 3 4 7 2 7 2 9 5 6 3 2 8 4 6 7 6 5 9 2 6 5 5 2 8 7 0 0 2 1 0 6 6 1 7 5 7 2 2 2 4 1 4 9 0 1 7 1 3 1 0 5 3 1 5 9 5 4 8 0 9 0 0 7 3 5 3 2 9 0 5 7 4 1 0 0 4 9 0 4 8 9 7 0 4 8 4 0 4 2 2 2 9 1 7 0 2 1 1 6 1 1 9 2 3 5 4 2 2 9 3 1 7 1 9 9 0 2 8 9 9 6 2 6 2 3 2 0 8 2 7 8 8 4 2 1 7 0 5 0 0 3 1 8 7 7 7 2 5 5 2 8 4 7 5 1 9 0 5 3 0 9 2 1 1 9 5 7 0 3 7 0 9 4 7 6 5 6 5 3 8 6 1 4 7 0 5 6 9 1 9 9 8 3 7 8 2 9 1 4 4 0 5 7 0 0 5 7 3 7 1 0 7 1 3 1 4 2 1 5 1 0 0 3 3 3 6 6 0 5 6 0 3 6 1 6 0 9 7 7 8 1 2 9 5 8 4 7 3 2 2 9 1 4 6 3 7 9 3 9 7 3 8 5 4 0 0 7 7 6 7 0 8 5 9 2 1 3 8 7 1 9 4 1 5 1 8 6 6 8 7 7 2 5 4 0 7 8 9 1 0 9 0 4 1 6 7 1 0 0 6 3 6 9 8 2 3 8 4 2 4 1 7 9 1 2 0 1 1 8 0 1 1 8 9 2 1 7 4 8 3 8 5 5 7 8 3 6 1 4 7 7 3 7 1 8 9 6 6 0 2 7 1 5 7 9 6 8
25 19 20 18 20 19 19 18 20 21 15 21 24 24 29 29 27 2 3 7 14 12 13 12 10 9 13 12 11 14 17 16 18 15 17 11 18 18 22 28 1 8 14 15 15 18 16 19 19 16 18 16 20 18 13 20 22 18 17 16 13 17 19 27 25 28 24 21 25 22 18 13 6 4 6 11 4 29 2 5 1 24 20 27 2 1 6 4 1 26 24 28 21 21 23 16 11 11 11 6 9 10 7 3 8 6 6 7 28 24 21 21 0 5 3 1 10 9 9 1 29 5 0 0 27 3 7 9 13 17 23 17 16 15 14 15 13 20 21 20 16 19 19 23 22 17 22 27 29 29 3 4 2 27 0 27 24 26 21 28 2 3 5 27 22 21 12 9 4 9 8 12 14 10 12 12 14 13 10 11 11 3 3 26 29 3 26 24 26 27 2 4 29 28 23 20 17 21 20 13 11 2 8 12 16 11 12 12 17 16 14 17 16 16 14 19 20 22 23 24 26 26 26 28 21 23 28 29 26 1 24 21 22 27 28 29 5 5 3 6 5 13 11 11 8 10 16 25 21 16 19 10 16 15 15 14 17 17 20 26 29 6 8 6 5 7 7 29 29 1 4 2 6 3 7 12 11 8 16 14 10 8 7 4 7 8 10 10 9 8 9 15 11 11 9 6 5 28 28 29 27 20 19 21 22 16 20 28 0 23 24 2 29 1 0 27 19 21 18 17 25 22 21 22 23 26 17 16 19 20 19 20 21 22 25 1 0 7 6 3 0 8 8 9 8 13 13 14 13 12 12 6 5 3 2 3 3 2 3 10 6 5 2 2 27 21 24 25 27 1 0 29 26 2 29 24 20 19 20 20 24 24 23 20 20 18 18 14 13 14 13 19 22 23 21 23 0 3 27 25 0 7 11 9 14 19 25 19 17 12 8 7 7 1 5 4 11 10 11 5 6 0 5 6 14 16 11 15 21 23 25 26 28 2 2 4 6 3 7 10 7 2 5 5 8 5 26 24 18 18 18 22 26 28 24 22 19 18 21 29 20 21 16 19 15 13 17 12 13 17 15 8 2 27 3 28 25 21 17 16 17 13 12 12 6 7 10 16 16 14 16 15 11 14 17 17 16 12 7 2 3 2 4 4 8 10 2 1 0 23 18 18 17 16 18 22 21 0 6 6 3 7 3 3 7 2 3 5 13 13 14 12 13 13 12 17 21 23 19 20 24 28 2 28 24 16 16 21 22 27 1 29 5 4 25 23 21 15 10 5 6 8 10 11 12 13 18 13 7 9 5 2 1 0 5 5 28 0 4 9 12 11 14 19 23 24 28 27 21 20 23 26 22 0 4 7 9 15 15 14 16 16 12 14 12 11 5 7 13 20 28 0 4 29 24 24 27 29 1 25 17 13 8 9 1 8 8 8 8 8 3 3 9 3 29 23 19 17 24 24 19 18 26 0 1 6 9 8 1 29 0 2 3 7 5 6 1 27 23 26 27 2 0 25 28 20 17 13 13 14 12 16 11 9 9 12 16 11 10 12 14 14 5 6 0 27 22 20 23 18 9 11 12 7 9 6 12 9 16 10 14 10 11 10 10 18 23 23 23 25 1 0 26 27 5 5 6 11 8 8 7 2 7 0 2 2 5 3 3 6 7 28 23 27 3 5 8 13 11 20 20 24 25 28 27 24 20 25 2 29 28 24 26 29 29 28 24 26 24 26 23 26 29 7 6 10 15 22 20 18 23 0 28 28 23 20 12 6 5 26 25 26 29 3 6 8 11 12 3 4 3 3 4 1 0 5 11 5 12 10 12 10 8 0 0 27 27 24 25 28 23 23 28 24 24 27 29 0 26 27 0 23 22 20 20 13 8 29 1 2 7 9 9 9 8 29 22 25 19 16 18 25 21 23 23 29 26 27 2 1 8 1 29 7 10 11 17 16 16 20 20 29 29 22 24 28 29 29 27 26 22 21 25 28 23 25 24 23 23 1 28 23 0 2 10 10 9 9 7 11 5 11 7 8 10 12 10 12 18 13 15 15 17 25 19 24 28 2 2 27 26 26 23 23 22 29 6 7 13 9 8 12 6 8 29 22 21 20 13 8 6 7 16 7 29 26 19 26 26 5 27 18 10 10 11 10 5 9 18 23 23 21 23 23 25 22 21 15 12 10 11 10 8 4 10 12 13 15 16 18 27 22 19 24 25 28 29 20 17 10 15 15 21 20 21 17 25 25 19 13 14 15 16 16 16 19 18 18 19 22 29 1 6 9 5 8 12 12 18 15 6 4 4 4 6 5 6 7 9 9 12 20 20 16 15 19 13 6 6 15 15 21 16 17 16 15 13 16 15 13 11 12 13 14 12 8 1 25 26 2 10 19 22 22 20 18 17 21 15 15 8 0 1 7 6 7 10 9 14 14 10 4 11 15 18 11 9 13 12 12 9 0 27 27 3 0 1 4 5 29 21 15 13 12 13 10 9 10 9 7 9 15 10 2 6 27 29 3 0 26 27 4 28 25 21 26 1 28 24 22 24 27 24 25 25 29 29 1 26 27 28 3 28 28 2 4 7 3 9 12 9 11 16 19 15 20 18 19 19 18 17 17 17 16 16 19 13 10 10 14 15 14 15 10 6 4 9 12 11 10 11 6 9 11 5 4 2 1 2 2 9 10 4 4 8 10 8 10 13 15 22 18 22 21 28 27 2 9 9 11 11 15 14 15 17 21 13 4 1 2 5 3 5 7 16 17 21 24 25 27 22 21 21 25 24 24 22 17 9 4 26 27 22 22 23 16 14 12 20 12 7 7 8 11 15 10 17 26 0 2 3 3 0 26 21 23 20 25 17 14 16 12 12 5 6 8 9 8 11 12 21 17 16 14 9 17 19 22 15 19 26 26 1 0 27 5 3 24 23 24 21 20 19 19 18 18 16 10 12 10 12 9 14 13 13 10 13 16 13 19 10 9 14 18 19 12 15 7 9 12 8 11 6 0 4 27 26 5 10 7 9 10 14 18 21 18 26 28 29 4 28 4 29 1 28 22 25 29 1 24 1 4 1 27 29 29 26 4 0 25 24 22 21 23 20 26 22 14 6 4 0 5 2 2 3 8 7 2 29 27 3 3 7 14 18 23 15 14 20 25 18 16 14 20 17 22 20 13 16 18 20 16 23 22 21 15 18 26 26 29 7 2 3 25 20 21 14 22 28 1 3 26 27 18 19 14 18 15 11 10 17 20 27 23 25 27 2 5 5 9 6 6 1 6 7 7 13 12 14 9 7 10 13 13 16 11 12 11 12 9 9 15 17 21 15 20 21 24 29 2 2 28 26 23 19 13 14 9 7 3 3 8 11 8 6 11 2 24 24 28 22 22 19 20 17 15 22 16 12 10 9 8 9 5 9 6 9 11 7 6 8 9 3 8 7 11 4 6 11 10 9 6 2 7 11 12 16 17 20 17 23 19 20 28 27 3 29 2 4 7 6 9 7 9 3 9 7 3 7 7 2 5 14 8 15 12 14 12 14 12 13 14 14 7 2 27 28 0 2 10 4 13 10 2 10 5 5 9 11 13 9 4 5 10 16 15 10 7 29 27 0 0 22 25 21 21 24 26 25 26 3 2 6 8 7 12 11 14 14 11 15 15 14 19 15 17 15 15 15 9 6 5 28 21 21 20 20 25 29 1 26 23 24 25 23 23 25 23 17 22 14 12 7 4 7 2 29 28 0 29 28 27 25 28 23 18 23 18 16 19 21 28 27 2 3 1 1 24 19 16 23 21 23 27 5 8 29 3 10 7 6 7 8 10 7 13 13 15 6 3 0 23 29 21 22 1 26 26 26 27 27 20 29 27 21 24 24 3 12 8 1 9 14 15 12 7 13 11 6 4 4 8 8 13 19 18 21 16 17 22 21 25 19 18 20 12 18 22 24 27 27 0 26 25 2 29 5 1 23 2 0 27 21 12 15 15 10 9 15 18 25 17 18 18 10 11 11 16 21 19 25 25 28 6 9 9 5 5 28 26 0 4 0 7 8 12 8 10 17 10 19 15 16 20 11 14 20 19 10 10 10 13 17 11 11 9 6 2 27 26 22 18 20 13 7 6 5 1 4 5 5 26 0 27 18 13 16 10 8 6 6 12 15 19 20 17 19 24 2 1 1 1 26 27 6 0 3 6 8 11 18 20 24 0 3 11 13 14 11 5 6 13 14 15 15 20 19 27 23 24 18 19 19 12 20 22 14 14 7 11 10 13 19 24 22 23 24 22 19 19 18 24 16 9 15 7 6 3 9 16 10 3 27 26 29 27 1 0 0 2 7 3 28 1 23 26 4 0 1 23 18 13 13 6 0 29 2 7 9 3 2 27 4 7 6 11 12 18 20 16 21 22 26 27 1 28 26 19 25 1 29 1 29 27 3 27 23 29 6 12
2000 30 40 10
1 8 2 6 7 3 3 9 8 2 7 9 9 7 8 4 8 1 0 0 7 1 2 7 8 4 3 8 8 7 0 2 9 4 3 6 8 7 8 1 1 5 1 8 6 1 0 6 6 0 9 2 9 6 3 0 7 2 6 1 4 5 6 8 1 0 5 7 8 8 9 0 7 0 8 5 3 4 9 3 4 9 7 2 4 9 8 4 8 2 7 4 7 4 8 6 0 6 6 2 1 1 9 5 8 4 6 2 6 2 6 8 3 4 9 0 2 2 6 8 3 3 8 6 9 8 3 1 0 9 6 1 9 9 2 7 7 1 8 2 9 3 1 4 4 4 1 0 0 1 6 3 9 9 6 6 6 5 4 6 4 5 7 8 3 6 9 2 3 0 0 1 1 7 1 3 4 2 8 6 8 4 6 4 1 0 5 4 5 1 7 3 5 3 4 0 7 4 5 2 8 9 4 3 8 0 3 9 3 5 7 8 4 1 9 9 2 5 1 5 4 0 9 7 7 9 3 6 9 1 6 4 5 9 0 1 2 6 5 3 8 0 8 6 3 8 2 0 9 3 9 5 0 7 3 5 7 4 0 0 0 3 9 5 2 2 6 9 0 6 6 8 4 0 1 0 5 7 8 4 8 2 4 0 5 4 8 5 6 4 3 0 8 0 8 0 6 1 4 8 6 8 3 3 5 6 1 3 8 8 0 4 5 8 4 5 7 2 3 9 5 2 6 5 3 2 5 3 8 9 3 1 0 7 9 2 0 4 5 5 5 3 3 1 9 4 8 9 4 9 8 2 5 8 0 9 6 4 2 8 1 7 3 5 2 3 3 1 2 1 9 6 8 8 7 1 7 2 6 0 2 0 8 5 2 1 5 5 3 7 3 2 4 7 0 5 9 3 4 5 9 7 2 5 5 7 3 4 6 0 6 4 4 1 6 8 0 8 1 5 2 1 5 6 9 5 3 6 0 5 3 4 6 7 0 9 0 0 8 0 7 3 7 6 3 3 1 8 6 8 0 1 0 5 0 8 3 6 9 6 4 2 8 7 8 4 7 8 3 8 5 6 8 1 9 6 3 7 6 0 3 8 6 6 1 2 7 7 5 3 8 9 7 3 8 3 5 4 6 6 2 9 3 9 4 3 7 7 8 5 6 0 2 3 6 9 9 0 3 0 7 4 3 5 8 2 6 2 4 2 1 3 1 2 2 0 8 9 4 3 0 8 4 6 6 6 4 2 1 6 3 4 9 9 2 4 8 7 5 1 4 2 2 2 9 8 3 2 2 5 2 6 3 3 0 1 7 9 5 1 5 2 0 6 4 3 0 0 1 2 6 2 1 4 3 8 7 3 7 7 6 6 5 1 8 0 9 2 9 2 8 1 1 4 0 3 6 1 3 9 3 3 5 8 4 5 4 1 8 6 3 7 1 2 0 0 5 3 2 9 9 8 6 6 8 8 6 4 7 8 8 8 1 0 5 6 4 8 6 5 2 2 2 1 1 1 1 0 1 8 3 8 3 7 1 1 4 0 9 6 3 4 4 1 2 1 7 6 7 2 6 9 7 7 4 5 6 6 0 8 6 5 9 6 9 9 4 0 1 8 4 4 5 0 7 0 7 0 6 8 2 0 4 7 3 7 4 3 2 6 3 4 0 1 5 8 5 7 1 1 5 6 0 1 6 8 1 4 9 7 1 5 0 3 7 1 6 4 5 3 1 2 8 4 4 1 2 1 2 7 2 9 9 4 0 8 7 5 6 9 1 5 4 2 6 6 3 9 7 2 4 4 3 9 3 6 8 3 3 9 1 0 9 3 1 8 4 5 8 9 2 7 6 3 8 7 4 4 1 3 3 3 2 4 4 5 7 7 0 0 1 0 3 7 9 3 1 4 5 5 4 1 0 4 6 7 8 9 7 4 9 7 7 3 1 1 6 9 2 7 0 7 5 3 6 3 8 3 6 4 6 3 6 4 0 6 7 6 5 3 6 2 2 5 9 9 2 1 5 1 6 6 8 4 3 9 9 7 3 0 4 6 9 1 2 5 4 3 8 0 6 7 9 7 9 6 7 0 1 3 5 6 9 6 7 2 6 7 5 6 4 4 3 4 6 3 5 7 4 3 3 0 9 7 9 1 4 1 7 4 8 2 6 5 3 1 0 5 1 7 4 1 1 1 4 8 6 2 8 5 5 0 1 2 5 8 6 9 7 3 0 0 7 9 8 5 9 3 1 7 6 3 9 3 7 0 3 1 1 3 2 4 3 8 6 1 5 1 5 1 3 1 5 2 8 2 3 2 9 3 2 2 8 8 9 9 1 0 4 7 4 7 7 9 2 3 0 5 6 2 4 2 6 6 1 5 4 7 1 9 3 5 5 4 7 8 0 8 3 5 6 5 0 8 7 1 2 5 4 0 5 4 3 6 0 6 2 7 9 1 5 3 5 3 4 9 0 2 3 1 2 3 1 8 1 4 2 9 9 9 9 0 1 5 8 4 9 8 0 3 8 1 3 3 7 4 4 5 9 9 3 9 1 3 9 0 0 0 7 8 4 7 8 1 1 9 0 4 9 4 7 9 6 6 9 6 1 9 9 8 0 3 7 5 2 7 6 6 1 1 4 0 6 4 8 3 5 6 4 1 2 0 7 7 7 4 0 1 6 2 9 4 6 5 9 7 4 9 9 7 8 7 3 6 7 2 0 8 4 6 7 4 9 1 1 5 8 3 9 5 0 3 1 5 3 3 5 6 3 8 5 9 4 1 3 6 8 9 9 6 5 9 1 0 6 7 6 5 9 2 1 7 7 6 5 9 6 0 3 8 6 5 9 6 2 9 7 1 0 0 9 7 0 5 5 8 9 3 0 3 4 2 2 8 8 6 6 4 9 3 6 8 1 0 5 2 8 1 2 5 7 5 6 4 0 6 0 5 2 3 9 3 9 5 3 5 0 8 0 2 6 2 2 8 0 5 0 5 1 5 4 7 4 9 7 7 0 8 6 6 3 1 9 9 8 1 1 9 1 8 5 7 3 5 5 7 6 5 3 2 2 3 0 5 7 6 9 9 1 0 7 7 3 8 2 7 0 7 8 3 8 0 7 8 7 5 2 6 5 0 6 8 2 1 3 3 5 4 0 8 6 2 6 7 4 5 1 1 3 4 3 0 9 5 6 5 8 1 2 8 1 7 5 5 0 6 5 8 3 2 9 1 0 7 5 2 0 2 4 3 0 2 3 8 8 1 5 5 3 7 8 4 8 1 2 2 7 1 3 1 8 3 3 8 4 0 0 3 7 9 9 0 4 8 2 4 6 0 1 5 3 0 3 5 4 1 7 6 1 3 6 1 0 7 5 4 4 3 9 4 9 9 3 0 0 7 7 8 3 2 6 7 9 6 7 8 1 6 9 5 9 2 3 5 8 4 1 2 1 4 8 4 2 2 2 0 5 1 9 1 4 1 0 6 3 3 6 2 9 1 3 6 4 0 2 0 8 5 1 6 6 6 5 1 6 5 3 1 3 6 2 3 4 7 9 9 4 3 9 6 1 5 3 3 5 5 3 1 8 0 7 1 6 8 9 8 6 0 2 3 5 7 9 7 4 0 1 8 9 9 1 3 9 3 6 4 9 0 5 2 8 2 6 8 8 4 3 3 6 1 5 7 6 7 7 0 3 4 9 3 7 6 3 6 5 2 3 2 8 2 2 3 6 4 2 9 4 7 7 1 4 3 6 8 5 4 3 5 3 1 1 0 7 7 0 9 6 6 3 5 7 8 0 7 7 1 3 0 3 0 6 9 5 7 9 2 3 3 3 4 3 7 2 7 6 5 8 4 9 0 6 2 5 9 7 7 7 8 2 4 0 3 8 2 3 3 5 2 6 3 0 3 3 6 2 5 3 8 6 2 2 7 4 1 9 5 1 1 2 6 9 0 0 4 8 9 6 7 5 1 3 4 9 7 9 3 5 7 4 1 1 3 4 4 3 0 6 6 8 8 8 6 6 4 0 4 9 3 2 2 5 9 1 6 8 9 1 2 0 5 8 2 1 6 1 9 2 7 4 2 8 8 3 5 4 1 2 4 1 9 9 0 9 6 1 0 8 9 7 1 9 7 2 6 6 2 8 4 3 2 4 4 7 1 8 2 9 2 1 6 7 0 9 4 7 5 0 3 8 9 4 9 4 5 8 4 7 3 5 3 4 5 6 1 3 6 5 3 5 5 8 3 6 3 4 4 3 9 7 9 2 2 8 1 3 2 5 2 2 0 9 8 8 7 6 6 8 8 2 3 5 1 0 8 7 0 1 2 6 4 3 3 7 9 3 1 0 4 5 3 9 5 3 8 9 2 6 9 6 8 3 6 1 9 8 3 7 4 8 7 4 9 8 2 2 7 3 5 8 7 6 9 6 7 7 3 8 5 0 2 7 4 8 0 9 9 8 0 4 1 5 9 6 9 0 4 9 6 0 8 8 6 6 6 3 9 1 6 9 8 7 5 5 2 3 8 9 2 3 2
25 25 22 21 23 22 20 17 14 12 10 12 5 5 4 29 25 24 25 1 2 29 3 7 8 1 27 29 28 28 29 8 6 4 0 5 4 29 26 27 29 2 6 12 6 4 12 20 18 20 22 20 22 20 18 23 29 22 26 26 27 24 20 23 20 27 1 2 27 25 19 16 24 20 24 25 20 19 17 14 19 18 12 13 17 22 21 16 13 5 12 11 8 10 15 9 10 17 12 14 14 22 24 16 15 11 11 6 4 28 27 27 22 28 3 0 6 10 13 11 9 10 12 11 13 7 5 11 12 15 6 0 0 22 20 19 15 12 13 13 17 16 17 22 22 19 15 19 23 28 28 29 29 25 19 17 11 12 11 12 8 12 16 13 8 13 7 1 8 8 13 20 27 0 24 2 8 6 9 2 1 27 23 26 29 5 14 12 14 18 18 17 18 18 24 20 21 16 18 18 19 19 10 14 17 12 20 19 10 16 14 16 13 9 15 9 5 10 9 8 3 29 2 2 0 25 18 21 24 15 20 20 24 23 14 15 14 17 18 21 22 22 24 20 14 16 12 18 23 20 21 15 10 18 11 16 11 10 7 11 19 25 0 24 22 25 29 24 18 26 28 22 18 19 27 0 5 7 2 27 2 29 29 1 6 4 2 29 27 29 4 4 5 27 4 5 7 1 4 5 2 1 26 26 24 28 26 3 9 5 6 14 12 12 12 8 12 11 13 12 11 7 12 9 9 8 9 7 5 29 21 27 2 10 11 9 8 15 13 14 9 6 3 8 12 5 2 29 25 24 22 17 17 16 15 15 11 14 13 15 12 20 20 19 19 22 26 26 29 3 2 29 27 23 16 15 22 15 21 16 21 21 22 19 20 27 1 29 0 27 25 25 27 29 29 29 3 24 21 25 20 18 14 19 20 18 14 12 16 16 24 18 15 11 15 9 9 12 10 18 19 21 22 25 26 25 24 28 0 3 6 8 10 12 6 15 12 15 22 20 20 16 21 20 20 18 17 23 22 21 16 24 2 9 7 15 10 12 10 7 7 5 12 7 9 5 4 4 3 8 5 6 0 24 26 23 26 2 25 22 22 26 22 19 18 25 25 24 19 18 17 10 4 28 27 21 18 21 26 24 21 19 18 19 16 18 21 18 13 6 7 4 8 15 21 17 12 11 18 20 21 18 16 15 12 13 19 16 16 14 17 18 21 23 24 22 23 22 22 23 21 26 20 16 16 14 11 7 5 5 1 4 2 24 19 20 24 23 19 21 27 29 3 6 5 4 26 2 2 9 6 12 7 5 6 6 8 7 29 27 5 3 4 9 11 11 13 17 18 25 29 26 1 1 29 26 18 16 16 11 13 16 18 19 24 24 2 29 1 29 5 5 12 12 8 13 16 14 21 24 20 19 18 15 8 5 1 28 27 20 22 22 23 25 0 1 2 1 28 5 2 26 22 20 15 9 2 3 5 5 29 27 28 4 11 10 9 11 9 3 6 10 13 20 25 3 11 14 14 14 14 15 11 13 6 12 11 14 14 11 13 12 8 8 14 15 21 18 15 10 14 11 6 29 23 24 27 26 27 28 21 20 21 12 7 4 3 0 4 12 11 8 9 4 7 7 8 7 11 10 5 4 6 10 7 8 2 0 28 28 29 28 3 12 15 10 10 12 10 15 23 19 18 22 23 23 21 23 28 26 21 24 23 26 2 28 3 5 4 2 8 8 6 7 6 3 10 12 16 22 24 24 22 19 18 26 25 22 21 16 10 12 10 8 10 8 7 11 9 2 0 27 23 23 21 27 24 17 18 20 16 19 20 11 12 17 16 20 24 23 18 25 25 26 26 19 13 15 20 21 25 22 26 29 28 0 28 29 25 1 5 10 13 16 13 4 7 13 15 15 13 15 16 18 19 22 24 18 10 8 5 2 1 2 3 5 13 16 14 15 8 12 11 15 13 9 11 7 7 9 5 5 9 12 15 24 24 24 18 14 14 13 17 24 25 23 16 20 26 26 1 29 27 22 22 25 19 15 15 16 19 18 12 12 18 25 21 21 19 18 22 24 19 16 14 8 3 26 1 1 5 4 29 21 16 13 19 19 14 17 16 17 13 11 9 8 13 14 16 19 19 16 16 14 16 15 19 24 26 20 23 21 22 25 23 27 26 29 25 25 21 19 22 24 1 3 26 25 24 21 17 15 16 20 20 23 17 14 7 9 9 11 13 14 13 14 18 10 7 10 10 8 12 10 16 11 14 11 15 20 19 21 19 22 20 15 19 18 24 20 28 28 2 2 4 3 9 6 12 6 8 12 15 7 7 5 27 28 3 3 26 27 24 20 17 15 18 20 22 25 24 25 26 25 22 25 29 25 20 22 14 13 11 7 11 5 1 3 4 10 14 17 12 13 10 11 14 21 24 20 23 26 23 23 20 27 25 27 25 25 3 1 7 3 3 8 29 29 27 1 8 10 14 21 14 14 19 17 12 12 7 5 14 19 20 21 23 15 16 25 0 22 24 28 0 25 28 0 1 23 15 16 7 12 13 12 15 20 26 23 16 14 7 6 12 18 13 13 10 7 5 7 2 2 1 1 2 5 5 5 4 12 16 12 13 18 13 7 9 12 17 20 24 27 24 17 19 22 19 24 28 26 29 23 21 17 16 21 26 23 29 25 0 28 24 18 17 21 21 21 20 17 19 17 11 10 15 21 18 23 19 13 16 14 19 23 27 25 22 16 19 25 27 5 6 5 11 13 8 5 27 1 29 25 29 1 3 4 28 19 16 15 8 9 17 19 18 18 17 17 18 23 24 18 12 12 5 7 8 7 4 5 5 2 0 28 25 18 22 24 27 27 23 2 2 0 27 18 23 23 22 24 24 24 24 16 15 9 10 2 4 2 1 4 13 15 20 12 19 23 24 20 16 19 24 2 27 28 2 1 6 2 6 0 0 2 4 10 7 10 10 6 7 5 2 9 10 19 23 23 18 21 21 20 19 14 14 14 13 15 12 17 16 14 13 12 16 17 14 18 10 11 12 11 7 5 1 0 29 26 2 6 5 11 13 10 9 1 23 25 29 25 18 24 21 25 23 1 25 19 24 17 24 22 19 12 13 16 18 16 18 21 14 12 18 20 19 14 12 16 11 5 5 2 3 7 3 7 11 11 14 19 23 22 18 14 11 10 10 11 4 11 7 5 8 12 6 1 26 0 7 7 6 10 11 8 10 16 14 11 13 16 14 14 11 7 7 9 10 8 4 2 29 21 27 0 2 29 1 7 10 11 17 17 9 5 12 19 24 20 13 10 17 22 20 25 29 24 0 8 8 14 16 16 16 20 23 17 13 13 14 16 19 21 16 13 9 10 8 8 5 0 22 19 25 28 24 23 17 23 22 19 18 13 7 2 24 1 0 22 23 20 24 26 22 20 21 23 22 24 26 20 19 21 26 3 12 11 13 13 18 15 19 22 19 21 23 20 19 18 17 21 16 18 26 3 11 9 4 5 2 1 2 6 12 10 5 3 10 16 19 18 18 23 19 16 11 16 13 9 5 12 9 12 17 20 19 19 21 19 20 18 24 24 23 21 13 10 14 21 21 23 22 16 15 16 18 20 14 13 6 7 7 4 5 1 6 1 8 10 9 5 6 6 6 3 3 3 5 2 2 28 21 22 22 15 24 27 29 23 25 25 27 24 25 27 26 26 24 19 17 21 27 26 29 6 29 28 24 20 23 22 26 22 21 22 23 28 27 3 2 7 9 7 9 16 14 15 17 16 15 8 3 11 6 2 4 6 8 11 14 8 2 0 29 22 25 25 0 3 1 0 0 2 26 29 29 22 19 12 18 21 19 14 9 10 12 11 10 13 10 13 14 15 20 26 26 26 1 29 27 28 28 29 27 28 23 26 24 26 2 8 7 9 12 3 2 10 12 12 8 4 13 14 16 16 16 11 6 1 5 10 8 0 29 21 27 24 24 24 25 2 7 6 7 8 9 5 3 26 27 28 22 25 27 28 24 23 29 4 3 7 5 6 6 4 27 4 6 9 6 2 4 10 5 12 5 12 7 4 8 7 29 5 4 7 11 9 8 15 15 10 19 14 13 20 24 23 17 15 17 12 10 14 9 6 10 7 6 8 11 15 14 13 15 11 13 7 14 20 23 18 20 19 16 12 9 14 13 7 28 3 2 6 8 6 8 9 14 11 11 12 8 2 9 13 7 3 2 3 2 27 27 28 4 3 0 27 22 20 14 21 24 19 26 2 2 3 10 14 22 16 14 7 9 11 8 7 3 9 13 12 20 28 22 17 24 26 29 1 4 7 13 12 10 14 16 24 25 20 19 17 16 21 13 13 20 22 13 11 4 6 9 14 14 6 7 9 11 3 4 8 5 3 7 8 10 8 9 10 11 12 8 7 2 28 3 4 1 4
Ce diff est replié.
Ce diff est replié.
Ce diff est replié.
Ce diff est replié.
Ce diff est replié.
Ce diff est replié.
package strings;
import com.github.guillaumederval.javagrading.Grade;
import com.github.guillaumederval.javagrading.GradeFeedback;
import org.junit.Test;
import java.util.Random;
import static org.junit.Assert.assertEquals;
/**
* Author: Pierre Schaus
*
* You have to implement an incremental hash function on a string represented as an array of char's.
* This is the hash function that is used by the Rabin-Karp algorithm.
*
* We advise you to debug your code using the first two small unit-tests provided with string of length 2 and 3
*/
public class IncrementalHash {
public static final int R = 31;
private int M;
private int RM;
private int Q;
/**
*
* @param Q is the modulo to apply
* @param M is the length of the words to hash
*/
public IncrementalHash(int Q, int M) {
assert (M > 0);
assert (Q > 0);
this.Q = Q;
this.M = M;
// Computes (R ^(M-1)) % Q using the Horner's method
// This precomputed result is useful for implementing nextHash in O(1)
RM = 1;
for (int i = 1; i <= M - 1; i++) {
RM = (RM * R) % Q;
}
}
/**
* Computes the hash(t) function on the substring
* t[from,...,from+M-1] in O(1) defined as
* hash[t] = (t[from] * R^(M-1) + t[from+1] * R^(M-2) + ... + t[from+M-1]) % Q
* Remark: ^ is the exponent operator, and % the modulo operator
*
* The formula given below can be computed in O(M) but
* it is possible to compute it in O(1) by using the previousHash = hash(t-1)
*
* @param t the input array
* @param previousHash = hash(t-1) that is the one on t[from-1,...from+M-2]
* @param from the index of the substring window, must be on the inteveral [1...t.length-M]
* @return hash[t] = (t[from] * R^(M-1) + t[from+1] * R^(M-2) + ... + t[from+M-1]) % Q
*
*/
public int nextHash(char[] t, int previousHash, int from) {
// TODO
// Hint1: To compute hash[t] in O(1) you should not iterate over M entries of t,
// // by developing h[t], you should realize that is has a lot of common with h[t-1] = previousHash
// The RM values computed above might help you as well in the computation.
// Hint2: Modulo operator is distributive (A + B) % Q = (A % Q + B % Q) % Q (property exploited by Horners's method)
// Hint3: To compute B % Q if you have x = (A + B) % Q, you should do (x + Q - A % Q) % Q
int previous = previousHash - (t[from - 1] * RM) % Q + Q;
return (previous * R + t[from + M - 1]) % Q;
}
}
\ No newline at end of file
package strings;
public class LinearProbingHashST<Key, Value> {
private static final int INIT_CAPACITY = 4;
// Please do not add/remove variables/modify their visibility.
protected int n; // number of key-value pairs in the symbol table
protected int m; // size of linear probing table
protected Key[] keys; // the keys
protected Value[] vals; // the values
public LinearProbingHashST() {
this(INIT_CAPACITY);
}
public LinearProbingHashST(int capacity) {
m = capacity;
n = 0;
keys = (Key[]) new Object[m];
vals = (Value[]) new Object[m];
}
public int size() {
return n;
}
public int capacity() {
return m;
}
public boolean isEmpty() {
return size() == 0;
}
public boolean contains(Key key) {
if (key == null) throw new IllegalArgumentException("argument to contains() is null");
return get(key) != null;
}
// hash function for keys - returns value between 0 and M-1
protected int hash(Key key) {
return (key.hashCode() & 0x7fffffff) % m;
}
/**
* resizes the hash table to the given capacity by re-hashing all of the keys
*/
private void resize(int capacity) {
LinearProbingHashST<Key, Value> newTable = new LinearProbingHashST<>(capacity);
for (int i = 0; i < m; i++) {
if (this.keys[i] != null) {
newTable.put(this.keys[i], this.vals[i]);
}
}
this.keys = newTable.keys;
this.vals = newTable.vals;
m = newTable.m;
}
/**
* Inserts the specified key-value pair into the symbol table, overwriting the old
* value with the new value if the symbol table already contains the specified key.
* The load factor should never exceed 50% so make sure to resize correctly
*
* @param key the key
* @param val the value
* @throws IllegalArgumentException if {@code key} is {@code null}
*/
public void put(Key key, Value val) {
if (n >= m/2) resize(m*2);
int i;
for (i = hash(key); keys[i] != null; i = (i + 1) % m) {
if (keys[i].equals(key)) {
vals[i] = val;
return;
}
}
keys[i] = key;
vals[i] = val;
n++;
}
/**
* Returns the value associated with the specified key.
*
* @param key the key
* @return the value associated with {@code key};
* {@code null} if no such value
* @throws IllegalArgumentException if {@code key} is {@code null}
*/
public Value get(Key key) {
int i;
for (i = hash(key); keys[i] != null; i = (i + 1) % m) {
if (keys[i].equals(key)) {
return vals[i];
}
}
return null;
}
/**
* Returns all keys in this symbol table as an array
*/
public Object[] keys() {
Object[] exportKeys = new Object[n];
int j = 0;
for (int i = 0; i < m; i++)
if (keys[i] != null) exportKeys[j++] = keys[i];
return exportKeys;
}
}
package strings;
import java.util.Hashtable;
/**
* Author Pierre Schaus
*
* We are interested in the Rabin-Karp algorithm.
* We would like to modify it a bit to determine if a word among a list (all words are of the same length) is present in the text.
* To do this, you need to modify the Rabin-Karp algorithm which is shown below (page 777 of the book).
* More precisely, you are asked to modify this class so that it has a constructor of the form:
* public RabinKarp(String[] pat)
*
* Moreover the search function must return the index of the beginning of the first word (among the pat array) found in the text or
* the size of the text if no word appears in the text.
*
* Example: If txt = "Here find interesting exercise for Rabin Karp" and pat={"have", "find", "Karp"}
* the search function must return 5 because the word "find" present in the text and in the list starts at index 5.
*
*/
public class RabinKarp {
private Hashtable<Long, String> hTable = new Hashtable<>();
private int M; // pattern length
private long Q; // a large prime
private int R = 2048; // alphabet size
private long RM; // R^(M-1) % Q
public RabinKarp(String[] pat) {
this.M = pat[0].length();
Q = 4463;
RM = 1;
for (int i = 1; i <= M - 1; i++) // Compute R^(M-1) % Q for use
RM = (R * RM) % Q; // in removing leading digit.
for (String patWord: pat) {
long patHash = hash(patWord, M);
hTable.put(patHash, patWord);
}
}
public boolean check(int i, String pattern, String txt) {
return (pattern.equals(txt.substring(i, M + i)));
}
private long hash(String key, int M) { // Compute hash for key[0..M-1].
long h = 0;
for (int j = 0; j < M; j++)
h = (R * h + key.charAt(j)) % Q;
return h;
}
public int search(String txt) { // Search for hash match in text.
int N = txt.length();
long txtHash = hash(txt, M);
if (hTable.containsKey(txtHash) && (check(0, hTable.get(txtHash), txt))) return 0; // Match at beginning.
for (int i = M; i < N; i++) { // Remove leading digit, add trailing digit, check for match.
txtHash = (txtHash + Q - RM * txt.charAt(i - M) % Q) % Q;
txtHash = (txtHash * R + txt.charAt(i)) % Q;
if (hTable.containsKey(txtHash)) {
if (check(i - M + 1, hTable.get(txtHash), txt)) {
return i - M + 1;
}
}
}
return N; // no match found
}
}
package strings;
import com.github.guillaumederval.javagrading.Grade;
import com.github.guillaumederval.javagrading.GradeFeedback;
import com.github.guillaumederval.javagrading.GradingRunnerWithParametersFactory;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@RunWith(Enclosed.class)
public class IncrementalHashTest {
public static class TestNotParameterized {
@Test
@Grade(value = 1, cpuTimeout = 1000)
@GradeFeedback(message = "Sorry, something is wrong with your algorithm, debug it first with this small example with M=2", onFail=true)
public void readableTestToDebugWithLength2() {
char [] input = new char[] {5,6,7,8,9,10};
int Q = 10;
int M = 2;
int R = IncrementalHash.R;
IncrementalHash hash = new IncrementalHash(Q, M);
int [] expectedHash = new int[input.length-M];
for (int from = 0; from < input.length-M ; from++) {
expectedHash[from] = (input[from] * R + input[from+1]) % Q; // here M = 2, don't need a loop for that
}
int h = expectedHash[0]; // first hash (at from = 0)
for (int i = 1; i < input.length-M;i++) {
h = hash.nextHash(input,h,i);
assertEquals(expectedHash[i], h);
}
}
@Test
@Grade(value = 1, cpuTimeout = 1000)
@GradeFeedback(message = "Sorry, something is wrong with your algorithm, debug it first with this small example with M=3", onFail=true)
public void readableTestToDebugWithLength3() {
char [] input = new char[] {10,9,8,7,6,5};
int Q = 20;
int M = 3;
int R = IncrementalHash.R;
IncrementalHash hash = new IncrementalHash(Q, M);
int [] expectedHash = new int[input.length-M];
for (int from = 0; from < input.length-M ; from++) {
expectedHash[from] = (input[from] * R * R + input[from+1] * R + input[from+2]) % Q; // here M = 3, don't need a loop for that
}
int h = expectedHash[0]; // first hash (at from = 0)
for (int i = 1; i < input.length-M;i++) {
h = hash.nextHash(input,h,i);
assertEquals(expectedHash[i], h);
}
}
}
@RunWith(Parameterized.class)
@Parameterized.UseParametersRunnerFactory(GradingRunnerWithParametersFactory.class)
public static class TestParameterizedSmall {
@Parameterized.Parameters(name = "{0}")
public static Collection data() {
LinkedList<Object []> coll = new LinkedList<>();
for (int i = 0; i < 6; i++) {
String file = "data/strings.IncrementalHash/instance_"+i;
coll.add(new Object[] {file, new Instance(file)});
}
return coll;
}
final Instance instance;
public TestParameterizedSmall(String name, Instance instance) {
this.instance = instance;
}
@Test
@Grade(value = 1, cpuTimeout = 1000)
@GradeFeedback(message = "Sorry, something is wrong with your algorithm, incorrect hash, debug on small provided example", onFail=true)
public void test() throws Exception {
IncrementalHash hash = new IncrementalHash(instance.Q, instance.M);
int h = instance.hash[0];
for (int i = 1; i < instance.size- instance.M; i++) {
h = hash.nextHash(instance.input, h,i);
assertEquals(instance.hash[i],h);
}
}
}
@RunWith(Parameterized.class)
@Parameterized.UseParametersRunnerFactory(GradingRunnerWithParametersFactory.class)
public static class TestParameterizedLarge {
@Parameterized.Parameters(name = "{0}")
public static Collection data() {
LinkedList<Object []> coll = new LinkedList<>();
for (int i = 0; i < 6; i++) {
String file = "data/strings.IncrementalHash/large_instance_"+i;
coll.add(new Object[] {file, new Instance(file)});
}
return coll;
}
final Instance instance;
public TestParameterizedLarge(String name, Instance instance) {
this.instance = instance;
}
@Test
@Grade(value = 1, cpuTimeout = 1000)
@GradeFeedback(message = "Are you sure your code is in O(1) ?", onTimeout=true)
@GradeFeedback(message = "Sorry, something is wrong with your algorithm, incorrect hash, debug on small provided example", onFail=true)
public void test() throws Exception {
IncrementalHash hash = new IncrementalHash(instance.Q, instance.M);
int h = instance.hash[0];
for (int i = 1; i < instance.size- instance.M; i++) {
h = hash.nextHash(instance.input, h,i);
assertEquals(instance.hash[i],h);
}
}
}
static class Instance {
int[][] matrix;
int from;
Set<Integer> destination;
int solution;
int size;
int Q;
int M;
int maxChar;
char [] input;
int [] hash;
public Instance(String file) {
try {
Scanner dis = new Scanner(new FileInputStream(file));
size = dis.nextInt();
Q = dis.nextInt();
M = dis.nextInt();
maxChar = dis.nextInt();
input = new char[size];
hash = new int[size-M];
for (int i = 0; i < size; i++) {
input[i] = (char) dis.nextInt();
}
for (int i = 0; i < size-M; i++) {
hash[i] = dis.nextInt();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package strings;
import com.github.guillaumederval.javagrading.Grade;
import org.junit.Test;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Random;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.lang.management.*;
/**
* This is just a limited number of tests provided for convenience
* Don't hesitate to extend it with other tests
*/
public class LinearProbingHashSTTest {
public HashMap<Integer,Integer> uniqInteger = null;
Integer gui(int x) {
if(uniqInteger == null)
uniqInteger = new HashMap<>();
if(uniqInteger.containsKey(x))
return uniqInteger.get(x);
Integer y = x;
uniqInteger.put(y,y);
return y;
}
static class LinearProbingHashSTGetTest<Key, Value> extends LinearProbingHashST<Key, Value> {
public LinearProbingHashSTGetTest() {
super();
}
public LinearProbingHashSTGetTest(int capacity) {
super(capacity);
}
public void put(Key key, Value val) {
if (key == null) throw new IllegalArgumentException("first argument to put() is null");
// double table size if 50% full
if (n >= m/2) resize(2*m);
int i;
for (i = hash(key); keys[i] != null; i = (i + 1) % m) {
if (keys[i].equals(key)) {
vals[i] = val;
return;
}
}
keys[i] = key;
vals[i] = val;
n++;
}
protected void resize(int capacity) {
Key[] keysTmp = (Key[]) new Object[capacity];
Value[] valsTmp = (Value[]) new Object[capacity];
for (int i = 0; i < m; i++) {
if (keys[i] != null) {
int j = (keys[i].hashCode() & 0x7fffffff) % capacity;
for (; keysTmp[j] != null; j = (j + 1) % capacity) {
if (keysTmp[j].equals(keys[i])) {
valsTmp[j] = vals[i];
return;
}
}
keysTmp[j] = keys[i];
valsTmp[j] = vals[i];
}
}
keys = keysTmp;
vals = valsTmp;
m = capacity;
}
}
static class LinearProbingHashSTPutTest<Key, Value> extends LinearProbingHashST<Key, Value> {
public LinearProbingHashSTPutTest() {
super();
}
public LinearProbingHashSTPutTest(int capacity) {
super(capacity);
}
public Value get(Key key) {
if (key == null) throw new IllegalArgumentException("argument to get() is null");
for (int i = hash(key); keys[i] != null; i = (i + 1) % m)
if (keys[i].equals(key))
return vals[i];
return null;
}
protected void resize(int capacity) {
Key[] keysTmp = (Key[]) new Object[capacity];
Value[] valsTmp = (Value[]) new Object[capacity];
for (int i = 0; i < m; i++) {
if (keys[i] != null) {
int j = (keys[i].hashCode() & 0x7fffffff) % capacity;
for (; keysTmp[j] != null; j = (j + 1) % capacity) {
if (keysTmp[j].equals(keys[i])) {
valsTmp[j] = vals[i];
return;
}
}
keysTmp[j] = keys[i];
valsTmp[j] = vals[i];
}
}
keys = keysTmp;
vals = valsTmp;
m = capacity;
}
}
@Test(timeout = 5000)
@Grade(value= 1)
public void testExample() {
LinearProbingHashST<Integer,String> lp = new LinearProbingHashST<>();
assertEquals(4,lp.capacity());
assertEquals(0,lp.size());
lp.put(gui(5),"five");
assertEquals("five",lp.get(gui(5)));
assertEquals(1,lp.size());
lp.put(gui(9),"nine");
assertEquals("nine",lp.get(gui(9)));
assertEquals(2,lp.size());
lp.put(gui(9),"neuf");
assertEquals("neuf",lp.get(gui(9)));
assertEquals(2,lp.size());
lp.put(gui(8),"huit");
assertEquals("huit",lp.get(gui(8)));
assertEquals(3,lp.size());
assertEquals(8,lp.capacity());
lp.put(gui(0),"zero");
assertEquals("zero",lp.get(gui(0)));
assertEquals(4,lp.size());
assertEquals(8,lp.capacity());
lp.put(gui(16),"sixteen");
assertEquals("sixteen",lp.get(gui(16)));
assertEquals(5,lp.size());
assertEquals(16,lp.capacity());
assertTrue(lp.contains(gui(5)));
assertTrue(lp.contains(gui(9)));
assertTrue(!lp.contains(gui(4)));
assertTrue(!lp.contains(gui(32)));
assertTrue(!lp.contains(gui(64)));
//staticTestJohn();
}
@Test(timeout = 5000)
@Grade(value= 1)
public void getPutWorkingNoResize() {
Random rand = new Random(728972);
for (int size = 20; size < 1000; size += 31) {
for (int k = 0; k < 5; k++) {
Set<Integer> in = new HashSet<>();
Set<Integer> out = new HashSet<>();
LinearProbingHashST<Integer,String> lp = new LinearProbingHashST<Integer,String>(size*3);
for (int i = 0; i < size; i++) {
Integer v = gui(rand.nextInt());
in.add(v);
lp.put(v, v + "");
}
for (Integer i: in) {
assertTrue(lp.contains(i));
assertTrue(lp.get(i).equals(i+""));
}
for (int j = 0; j < size; j++) {
int v = rand.nextInt();
if (!in.contains(v)) {
assertTrue(!lp.contains(v));
}
}
}
}
}
@Test(timeout = 5000)
@Grade(value= 1)
public void putWorking() {
Random rand = new Random(228901);
for (int size = 20; size < 1000; size += 25) {
for (int k = 0; k < 5; k++) {
Set<Integer> in = new HashSet<>();
Set<Integer> out = new HashSet<>();
LinearProbingHashSTPutTest<Integer,String> lp = new LinearProbingHashSTPutTest<Integer,String>();
for (int i = 0; i < size; i++) {
Integer v = gui(rand.nextInt());
in.add(v);
lp.put(v, v + "");
}
assertTrue(lp.size() >= lp.capacity()/4);
assertTrue(lp.size() <= lp.capacity()/2);
for (int i: in) {
assertTrue(lp.contains(i));
assertTrue(lp.get(i).equals(i+""));
}
for (int j = 0; j < size; j++) {
int v = rand.nextInt();
if (!in.contains(v)) {
assertTrue(!lp.contains(v));
}
}
}
}
}
@Test(timeout = 5000)
@Grade(value= 1)
public void putNoResizeWorking() {
Random rand = new Random(292082);
for (int size = 20; size < 1000; size += 27) {
for (int k = 0; k < 5; k++) {
Set<Integer> in = new HashSet<>();
Set<Integer> out = new HashSet<>();
LinearProbingHashSTPutTest<Integer,String> lp = new LinearProbingHashSTPutTest<Integer,String>(size*2+1);
for (int i = 0; i < size; i++) {
Integer v = gui(rand.nextInt());
if(!in.contains(v)) {
in.add(v);
lp.put(v, v + "");
}
}
for (Integer i: in) {
assertTrue(lp.contains(i));
assertTrue(lp.get(i).equals(i+""));
}
for (int j = 0; j < size; j++) {
Integer v = gui(rand.nextInt());
if (!in.contains(v)) {
assertTrue(!lp.contains(v));
}
}
}
}
}
@Test(timeout = 5000)
@Grade(value= 1)
public void putNoResizeWorking2() {
Random rand = new Random(292082);
for (int size = 20; size < 1000; size += 27) {
for (int k = 0; k < 5; k++) {
Set<Integer> in = new HashSet<>();
Set<Integer> out = new HashSet<>();
LinearProbingHashSTPutTest<Integer,String> lp = new LinearProbingHashSTPutTest<Integer,String>(size*2+1);
for (int i = 0; i < size; i++) {
Integer v = gui(rand.nextInt());
in.add(v);
lp.put(v, v + "");
}
for (Integer i: in) {
lp.put(i, i + "2");
}
for (Integer i: in) {
assertTrue(lp.contains(i));
assertTrue(lp.get(i).equals(i+"2"));
}
for (int j = 0; j < size; j++) {
Integer v = gui(rand.nextInt());
if (!in.contains(v)) {
assertTrue(!lp.contains(v));
}
}
}
}
}
@Test(timeout = 5000)
@Grade(value= 1)
public void getWithoutPutWorking() {
Random rand = new Random(3980280);
for (int size = 20; size < 1000; size += 41) {
for (int k = 0; k < 5; k++) {
Set<Integer> in = new HashSet<>();
Set<Integer> out = new HashSet<>();
LinearProbingHashSTGetTest<Integer,String> lp = new LinearProbingHashSTGetTest<Integer,String>(size * 2+1);
for (int i = 0; i < size; i++) {
Integer v = gui(rand.nextInt());
in.add(v);
lp.put(v, v + "");
}
for (Integer i: in) {
assertTrue(lp.contains(i));
assertTrue(lp.get(i).equals(i+""));
}
for (int j = 0; j < size; j++) {
Integer v = gui(rand.nextInt());
if (!in.contains(v)) {
assertTrue(!lp.contains(v));
}
}
}
}
}
@Test(timeout = 5000)
@Grade(value= 1)
public void testCorrectness() {
Random rand = new Random(1792827);
for (int size = 20; size < 1000; size += 50) {
for (int k = 0; k < 5; k++) {
Set<Integer> in = new HashSet<>();
Set<Integer> out = new HashSet<>();
LinearProbingHashST<Integer,String> lp = new LinearProbingHashST<>();
for (int i = 0; i < size; i++) {
Integer v = gui(rand.nextInt());
in.add(v);
lp.put(v, v + "");
}
assertTrue(lp.size() >= lp.capacity()/4);
assertTrue(lp.size() <= lp.capacity()/2);
for (Integer i: in) {
assertTrue(lp.contains(i));
assertTrue(lp.get(i).equals(i+""));
}
for (int j = 0; j < size; j++) {
Integer v = gui(rand.nextInt());
if (!in.contains(v)) {
assertTrue(!lp.contains(v));
}
}
}
}
//correctnessTestJohn();
}
static class MyInteger {
public int content;
public MyInteger(int x) {
content = x;
}
public boolean equals(Object x) {
return x instanceof MyInteger && ((MyInteger)x).content == content;
}
@Override
public int hashCode() {
return content;
}
}
@Test(timeout = 5000)
@Grade(value= 1)
public void testCorrectnessMI() {
Random rand = new Random(1792827);
for (int size = 20; size < 1000; size += 50) {
for (int k = 0; k < 5; k++) {
Set<Integer> in = new HashSet<>();
Set<Integer> out = new HashSet<>();
LinearProbingHashST<MyInteger,String> lp = new LinearProbingHashST<>();
for (int i = 0; i < size; i++) {
Integer v = rand.nextInt();
in.add(v);
lp.put(new MyInteger(v), v + "");
}
assertTrue(lp.size() >= lp.capacity()/4);
assertTrue(lp.size() <= lp.capacity()/2);
for (Integer i: in) {
assertTrue(lp.contains(new MyInteger(i)));
assertTrue(lp.get(new MyInteger(i)).equals(i+""));
}
for (int j = 0; j < size; j++) {
int v = rand.nextInt();
if (!in.contains(v)) {
assertTrue(!lp.contains(new MyInteger(v)));
}
}
}
}
//correctnessTestJohn();
}
//More tests
private void correctnessTestBis() {
LinearProbingHashST<String, Integer> st = new LinearProbingHashST<>(1);
String instance[] = generateInstance();
int i = 0;
for (String key : instance){
st.put(key, i);
i++;
}
//System.out.println("cap="+instance.capaity);
i = 0;
for (Object s : st.keys()) {
assertEquals(new Integer(i),st.get(s+""));
assertEquals(instance[i],s+"");
i++;
}
assertTrue(i != 0);
}
@Test(timeout = 10000)
@Grade(value= 1)
public void testComplexity() {
ThreadMXBean thread = ManagementFactory.getThreadMXBean();
long cpu = thread.getCurrentThreadCpuTime();
testExample();
testCorrectness();
LinearProbingHashST<Integer,String> lp = new LinearProbingHashST<>();
Random rand = new Random(567892);
for (int i = 0; i < 1000; i++) {
Integer v = gui(rand.nextInt());
lp.put(v, v + "");
}
for (int i = 0; i < 100000; i++) {
lp.put(gui(i%10000), i%10000 + "");
}
for (int i = 0; i < 1000; i++) {
Integer v = gui(rand.nextInt());
lp.put(v, v + "");
}
assertTrue(thread.getCurrentThreadCpuTime() - cpu <= 2L * 1000000000L);
}
///John test
private void correctnessTestJohn() {
LinearProbingHashST<String, Integer> st = new LinearProbingHashST<>(7);
String instance[] = generateInstance();
Integer expectedVals[] = {12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15};
int i = 0;
for (String key : instance){
st.put(key, i);
i++;
}
//System.out.println("cap="+instance.capaity);
i = 0;
for (Object s : st.keys()) {
assertEquals(expectedVals[i],st.get(s+""));
assertEquals(instance[expectedVals[i]],s+"");
i++;
}
assertTrue(i != 0);
}
private String[] generateInstance(){
String[] sp = new String[]{"Aa", "BB"};
String[] list = new String[16];
int count = 0;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
for (int l = 0; l < 2; l++) {
list[count] = sp[i] + sp[j] + sp[k] + sp[l];
count++;
}
}
}
}
return list;
}
private void staticTestJohn() {
LinearProbingHashST<String, Integer> st = new LinearProbingHashST<>(11);
String str = "S E A R C H E X A M P L E";
String keys[] = str.split(" ");
//String expectedKeys = "X C E H L M P R S A ";
//String expectedVals = "7 4 12 5 11 9 10 3 0 8 ";
int i = 0;
for (String key : keys){
st.put(key, i);
i++;
}
// print keys
//String obtainedKeys = "";
//String obtainedVals = "";
for (Object s : st.keys()) {
//obtainedKeys += s + " ";
//obtainedVals += st.get(""+s) + " ";
assertEquals(keys[Integer.parseInt(st.get(""+s)+"")],s+"");
}
//assertEquals(obtainedKeys,expectedKeys);
///assertEquals(obtainedVals,expectedVals);
}
}
package strings;
import org.junit.Test;
import com.github.guillaumederval.javagrading.Grade;
import java.util.Random;
import static java.lang.Math.min;
import static org.junit.Assert.assertEquals;
public class RabinKarpTest {
@Test
@Grade(value= 1)
public void basicTest(){
String[] pat = {"comp","like"};
String txt = "I like computer science";
RabinKarp rc = new RabinKarp(pat);
assertEquals(2,rc.search(txt));
}
@Test
@Grade(value= 1)
public void wordNotPresentTest(){
String[] pat = {"Yavin","C-3PO","R2-D2" };
String txt = "Mais, vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation. Moi," +
" si je devais résumer ma vie aujourd'hui avec vous, je dirais que c'est d'abord des rencontres," +
" des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi." +
" Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... " +
"Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste," +
" parfois on ne trouve pas l'interlocuteur en face, je dirais, le miroir qui vous aide à avancer." +
" Alors ce n'est pas mon cas, comme je le disais là, puisque moi au contraire, j'ai pu ;" +
" et je dis merci à la vie, je lui dis merci, je chante la vie, je danse la vie... Je ne suis qu'amour !" +
" Et finalement, quand beaucoup de gens aujourd'hui me disent Mais comment fais-tu pour avoir cette" +
" humanité ?, eh ben je leur réponds très simplement, je leur dis que c'est ce goût de l'amour, ce goût donc" +
" qui m'a poussé aujourd'hui à entreprendre une construction mécanique, mais demain, qui sait," +
" peut-être seulement à me mettre au service de la communauté, à faire le don, le don de soi...";
RabinKarp rc = new RabinKarp(pat);
assertEquals(txt.length(),rc.search(txt));
}
@Test
@Grade(value= 1)
public void randomWordTest(){
//int[] seeds = new int[]{42,56,3,9,65,99,23};
Random rand = new Random(new Random(5).nextInt(7));
String[] pat = new String[10];
int length = 8;
String txt = "Mais, vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation. Moi," +
" si je devais résumer ma vie aujourd'hui avec vous, je dirais que c'est d'abord des rencontres," +
" des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi." +
" Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... " +
"Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste," +
" parfois on ne trouve pas l'interlocuteur en face, je dirais, le miroir qui vous aide à avancer." +
" Alors ce n'est pas mon cas, comme je le disais là, puisque moi au contraire, j'ai pu ;" +
" et je dis merci à la vie, je lui dis merci, je chante la vie, je danse la vie... Je ne suis qu'amour !" +
" Et finalement, quand beaucoup de gens aujourd'hui me disent Mais comment fais-tu pour avoir cette" +
" humanité ?, eh ben je leur réponds très simplement, je leur dis que c'est ce goût de l'amour, ce goût donc" +
" qui m'a poussé aujourd'hui à entreprendre une construction mécanique, mais demain, qui sait," +
" peut-être seulement à me mettre au service de la communauté, à faire le don, le don de soi...";
int minIndex = txt.length();
for(int i=0;i<10;i++){
int startIndex = rand.nextInt(txt.length()-length);
pat[i] = txt.substring(startIndex,startIndex+length);
minIndex = min(minIndex,startIndex);
}
RabinKarp rc = new RabinKarp(pat);
assertEquals(minIndex,rc.search(txt));
}
private int nChar = 26;
private int patSize = 3;
private String[] patterns = new String[(int)Math.pow(nChar,patSize)];
private int nPats = 0;
private void genAllWords(String prefix, int k) {
if (k == 0) {
this.patterns[nPats] = prefix;
this.nPats++;
return;
}
for (int i = 0; i < nChar; ++i) {
String newPrefix = prefix + (char)('a' + i);
genAllWords(newPrefix, k - 1);
}
}
@Test(timeout=50)
@Grade(value= 1)
public void complexityTest(){
long t0 = System.currentTimeMillis();
genAllWords("",patSize);
RabinKarp rc = new RabinKarp(this.patterns);
String txt = ""+
"Ra th er t ha n pu rs ui ng m or e so ph is ti ca te d sk ip pi ng , th e Ra bi n– Ka rp a l"+
"g or it hm s ee ks t o sp ee d up t he t es ti ng o f eq ua li ty o f th e pa tt er n to"+
" t he s ub st ri ng s in t he t ex t by u si ng a h as h fu nc ti on . A ha sh f un ct "+
"io n is a f un ct io n wh ic h co nv er ts e ve ry s tr in g in to a n um er ic v al ue ,"+
" ca ll ed i ts h as h va lu e; f or e xa mp le , we m ig ht h av e ha sh (h el lo )= 5. T";
assertEquals(txt.length(),rc.search(txt));
long t1 = System.currentTimeMillis();
System.out.println("Spent time = "+(t1-t0));
}
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter