Aller au contenu

Exercices supplémentaires⚓︎

Fiches d'exercices sur Capytale

La majorité des exercices proposés sont issus du site https://pydefis.callicode.fr qui recense tous les défis des différentes éditions du concours c0d1ng UP.

L'affiche au format PDF , plus pratique pour déchiffrer le message caché ...

Vous pouvez vous y créer un compte, pour valider les défis et progresser au Hall of Fame... mais ce n'est absolument pas obligé.

Désamorçage d'un explosif (I)

Le découpage de nombres selon un certain nombre de chiffres est quelque chose de courant en programmation.

Pour cela, l'astuce réside en l'utilisation de la division euclidienne, par la bonne puissance de 10.

Par exemple, si on veut récupérer le chiffre des unités d'un nombre, il suffit de prendre le reste de la division euclidienne (opérateur % en Python) du nombre par 10. Les autres chiffres seront donnés par le quotient (opérateur // en Python).

>>> 3748 % 10
8
>>> 3748 // 10
374

Pour les deux derniers chiffres, on effectuera une division euclidienne par 100, pour les trois derniers par 1000, etc.

>>> entree = 317010
>>> entree % 1000
10
>>> entree // 1000
317

SW IV : Il a mis son mot de passe sur un post-it !

Encore la division euclidienne...

Toc Boum

Utiliser la «brute-force» (il s'agit de tester, une à une, toutes les combinaisons possibles...) !

Où l'on affiche tous les couples possibles, et on trouve le bon en les passant en revue «à la main».

On va mémoriser le meilleur couple, c'est-à-dire celui dont la différence est la plus petite. J'appelle best_a et best_b ces deux valeurs, que j'initialise à des valeurs volontairement éloignées.

Puis à chaque couple trouvé (comme dans la version basique), je compare la différence des deux nombres à celle des meilleurs. Si elle est plus petite, je remplace par les nouvelles valeurs de a et de b

Pour faire la différence entre deux valeurs, peu importe le signe: on utilisera la valeur absolue, abs en Python.

Le message pour Queulorior

Rappel du code minimal pour Pygame
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pygame
from pygame.locals import *

pygame.init()

fenetre = pygame.display.set_mode((640, 480)) # taille de la fenêtre à éventuellement modifier...
fenetre.fill([255, 255, 255]) # on peut choisir une autre couleur de fond que du blanc...

# Début des instructions
message = '''NNEESOOESEENNEEOOSEOSEEENNESENSSENNEESSOOEEENNEEOOSEOSEEENEENOOEESOOSEEEEEEENONSESENNSSENNEESSOOEEENNSSEENNSSEEENOONEEOOSEESEEEENNEESSOOEEENNEESOOEESENNESENSSEEENOONEEOOSEESEEEENNSSEEENNEESOOEESEEEENNEEOOSEOSEEENNEESSOOEEENNEESOOESEENNEEOOSEOSEEEENNOEEOSSEEEEENNEESOOEESOOEEENNEESOOESEENNSSEENNSSENNESNESSENNEEOOSEOSEEENNSSEENNSSEEENOONEEOOSEESENNEEOOSEOSEEEEEENNEESSOOEEENNEEOOSEOSEEENNESNESSENNEESOOEESENNSSENNESENSS'''




# Fin des instructions

pygame.display.flip()

# Boucle des événements
continuer = True
while continuer:
    for evenement in pygame.event.get():    #Attente des événements
        if evenement.type == QUIT:
            continuer = False

# Sortie
pygame.quit()

Pour résoudre ce pydéfi, il va valloir tracer un segment pour chaque pas en direction de N, S, O, E. Commençons par choisir une taille pour chaque pas, par exemple 10 pixels:

pas = 10

Ensuite il faut savoir tracer un segment

pygame.draw.line(fenetre, [0, 0, 0], [0, 0], [50, 30], 2)

L'instruction précédente trace un segment (a line) d'épaisseur 2 pixels, en noir ([0, 0, 0]) entre les points de coordonnées [0, 0] et [50, 30].

Enfin il faut modéliser correctement le problème, c'est-à-dire identifier les grandeurs dont on va avoir besoin et avec quels types de variables on va les représenter...

On a besoin à chaque étape:

  • d'un point de départ et d'un point d'arrivée (se rappeler de l'exercice 2.2 de la série 3 avec pygame ici) dont il faut calculer les coordonnées en fonction de la lettre lue (N, S, E, O);
  • d'un déplacement entre les deux, c'est-à-dire tracer une ligne.

Cerbère

Brute-forcez: tester toutes les longueurs entières possibles...

SW I: à l'assaut de Gunray

Les pouvoirs psychiques de Psystigri