Liens utiles

Antisèches Go

Les bases

opérations et comparaisons [AFFICHER]
types [AFFICHER]
tableaux et dictionnaires [AFFICHER]
variables [AFFICHER]
fonctions [AFFICHER]
boucles et conditionnelles [AFFICHER]

Niveau 2

compléments sur les dictionnaires / tableaux [AFFICHER]
point virgules [AFFICHER]
structures et définitions de types [AFFICHER]
switch [AFFICHER]

Séance 1 (06-01-2025)

[AFFICHER]

Séance 2 (14-01-2025)

Écrivez des fonctions pour résoudre les problèmes suivants (parties 1 et 2).

année jours lien
2020 1 Report Repair
2016 1 No Time for a Taxicab
2015 4 The Ideal Stocking Stuffer

Pour chaque problème, définissez une fonction de type func (filename string) int qui renverra la solution trouvée. Vous n'aurez qu'à l'appeler dans votre fonction main avec le bon nom de fichier en argument.

Pour gagner du temps

lecture entière d'un fichier dans un tableau de bytes
T, _ = os.ReadFile(filename)

Attention, en cas d'erreur (fichier inexistant, etc.), T sera vide. Pour gérer ça, il faut regarder la deuxième valeur de retour. Par exemple, le code suivant provoque une "panique" en cas d'erreur.

T, err = os.ReadFile(filename)
if err != nil {
    panic(err)
}
les modules strings et bytes

contiennent de nombreuses fonctions sur les chaines / tableaux d'octets : Trim, Split, Join, HasPrefix, ...

Utilisez les commandes go doc strings et go doc bytes pour avoir la liste de ces fonctions.

l'empreinte MD5 d'un tableau T d'octets (type []byte)

peut se calculer de la manière suivante

import "crypto/md5"

... E := md5.Sum(T)

E contiendra alors un tableau statique avec exactement 16 octets (type [16]byte).

Attention, lors de la résolution du problème 2015-04, les "0" que vous devez chercher dans l'empreinte MD5 sont des "0" dans la représentation hexadécimale de l'empreinte. Chaque octet de l'empreinte donne deux chiffres hexadécimaux. Pour trouver cinq "0", il faut donc regarder deux octets et demi (20 bits) !

Travail à la maison

  • Finissez le tutoriel officiel, si ce n'est pas déjà fait.

  • Décrivez une manière de coder un type de tableaux dynamiques d'entiers en C pur. Il s'agit d'un type avec les opérations suivantes :

    • len(T) : renvoie le nombre d'éléments du tableau,

    • get(T, i) : renvoie la case numéro i (indéterminé si i ne correspond pas à une case valide),

    • set(T, i, v) : mets la valeur v (un entier) dans la case numéro i (indéterminé si i ne correspond pas à une case valide),

    • append(T, v) : ajoute une valeur v à la fin du tableau. (La taille du tableau doit donc augmenter de 1.)

    Réfléchissez également à la complexité de ces opérations.

  • Écrivez une méthode show pour le type type grid map[[2]int] byte : le dictionnaire contient des caractères ASCII (type byte) à des coordonnées entières (type [2]int).

    La méthode show devra afficher les caractères à leur coordonnées, mais uniquement pour la boite englobante des coordonnées présentes dans le dictionnaire. Par exemple, pour

    G := grid(map[[2]int]byte{
        {10, -7}: 'h', {11, -7}: 'e', {12, -7}: 'l', {13, -7}: 'l', {14, -7}: 'o',
        {14, -6}: 'w', {15, -6}: 'o', {16, -6}: 'r', {17, -6}: 'l', {18, -6}: 'd',
    })
    G.show()
    

    on obtiendra

    $ go run .
    hello    
        world

    Vérifiez que votre code fonctionne en mettant le fichier mystere.go dans votre répertoire et en appelant

    G := mystere()
    G.show()
    
  • Finissez les problèmes Advent of Code commencés :

    année jours lien
    2020 1 Report Repair
    2016 1 No Time for a Taxicab
    2015 4 The Ideal Stocking Stuffer