The Advent of Code

Bon, je m’y prends un peu tard car je n’avais pas pensé à en faire un sujet avant que @asyd ne me le souffle dans l’oreille ce matin…

Si vous trainez sur IRC, vous n’êtes sans doute pas passé à côté du petit défi annuel qui nous anime en cette période, je veux bien sûr parler de l’Advent of Code.

Il s’agit d’une petite compétition qui existe désormais depuis de nombreuses années et qui rassemble des milliers de développeurs dans le monde.

Le but du jeu est simple : vous avez un énoncé (en anglais) d’un problème à résoudre ainsi qu’un “input” personnalisé (les données sont différentes pour tout le monde). Avec cela et armé de votre langage préféré (que j’espère être Python évidemment :stuck_out_tongue:), vous devez résoudre le problème et fournir le résultat au site.

Comme un calendrier de l’Avant, vous avez un problème à résoudre par jour avec une difficulté croissante dans le temps (c’est subjectif). Chaque problème est en deux parties, la première faisant office d’introduction au problème et la seconde vous demandant d’être plus créatif ou d’optimiser votre solution existante (et parfois de la refaire complètement car vous ne pouviez pas anticiper).

Les problèmes sortent tous les jours vers 6h du matin, un nombre défini de points est reversé aux joueurs qui iront le plus vite, mais il est possible de créer des leaderboards personnalisés si vous souhaitez vous challenger entre vous.

Bon après on ne va pas se mentir, le top 100 du classement est trusté par des monstres experts de ce genre d’énigmes et qui poussent le délire plus loin en ce mettant divers défis, comme des ultra optimisations en temps et/ou mémoire, l’usage d’un langage “non adapté” ou préhistorique, du code-golfing où l’objectif est de faire le script le plus court possible (au point où certains ont même inventé leur propre langage pour cela…).

Bref, il est un peu “tard” pour créer un thread journalier sur cette petite compétition amicale, mais je vous encourage à y participer même avec du retard, le plus important c’est de s’amuser et de découvrir d’autres facette de son langage de programmation favori !

D’ailleurs plusieurs membres y participent, vous pouvez retrouver leurs dépôts ici :

La liste n’est pas exhaustive, n’hésitez pas à me le dire si vous souhaitez que je rajoute le votre.
Comme vous pourrez peut-être le constater, il n’y a pas qu’une seule manière de résoudre les problèmes donnés, vous pouvez être sûrs que chacun aura sa propre méthode, ce qui en fait un outil riche d’enseignements !

Egalement, sachez que la communauté autour de ce jeu est très active sur Reddit, je vous encourage à aller jeter un oeil, ça débat parfois vivement mais on y apprend des choses intéressantes !

2 « J'aime »

Bonjour,
J’ai aussi participé cette année pour la première fois (https://github.com/albatros69/aoc-2020).
Y-a-t il un leaderbord privé de l’AfPy ?
À+

Bonjour,

Voici mes solutions cette année : GitHub - dancergraham/advent_of_code_2020: Advent of Code 2020

39 étoiles jusqu’ici…

Pas a ma connaissance.

haha pareil ! après c’était les vacances on va dire :slight_smile:

1 « J'aime »

Pour le jour 17 j’ai fait quelques visualisations sous Rhino3D, scripté en IronPython 2.7:

J’ai fait des sphères car il ne faut qu’un centre et radius alors qu’il faut définir les 8 vertices dans le bon ordre pour créer des cubes ! Simple à faire mais pas envie :upside_down_face:

Mon script :

import rhinoscriptsyntax as rs
import Rhino
from itertools import permutations
from collections import defaultdict

def conway_cubes(rounds, draw = True, dimensions = 2):
    rs.EnableRedraw(False)


    # Example from the puzzle
    state = """.#.
..#
###"""

    # My puzzle input
    state = """..#..##.
#.....##
##.#.#.#
..#...#.
.###....
######..
.###..#.
..#..##."""


    
    new_cubes = set()
    # Build the starting grid
    for y, row in enumerate(state.splitlines()):
        for x, cell in enumerate(row):
            if cell == '#':
                new_cubes.add((x,y) + (0,) * (dimensions - 2))
    
    # Initialise sets and lists 
    old_spheres = []
    neighbouring = set(permutations([1,0,-1]* dimensions,dimensions)) 
    neighbouring.remove((0,)*dimensions) # a cube is not its own neighbour
    
    for round in range(rounds+1):
        cubes = new_cubes.copy()
        rs.DeleteObjects(old_spheres)
        neighbours = defaultdict(int)
        old_spheres=set()
        answer = 0
        
        # Draw cubes and identify neighbours
        for cube in cubes:
            if draw:
                old_spheres.add(rs.AddSphere(cube[:min(3,dimensions)], 0.6))
            answer += 1
            for n in neighbouring:
                neighbours[tuple(cube[i] + n[i] for i in range(dimensions))] += 1
        new_cubes = set()
        rs.Redraw()
        
        # Apply rules for creation of cubes in next round
        for location, n in neighbours.iteritems():
            if location in cubes:
                if 2 <= n <= 3:
                    new_cubes.add(location)
            elif n == 3:
                new_cubes.add(location)
    rs.EnableRedraw()
    print(answer)


if  __name__ == '__main__':
    conway_cubes(rounds = 6, draw = True, dimensions =4)
2 « J'aime »

Il est temps de s’y remettre…

Ma contribution pour cette année ! :slight_smile:

Je déterre le sujet. Est-ce que quelqu’un est chaud·e pour jouer à l’Advent of Code cette année ? Moi GRAVE. :fire:

C’est un challenge qui est cher à mon cœur car c’est lui qui a mené à ma découverte de Python et ma professionnalisation dans ce langage.

J’ai fait l’AoC en PHP en 2018. Je me suis cassé les dents méchamment sur un djikstra fin décembre… Je suis allée voir sur le reddit comment faisaient les autres, et j’ai vu un gars qui a résolu le truc en une ligne de networkx. J’étais un peu contrariée et surtout très intriguée. Alors j’ai testé Python en 2019 et 2020 et je suis allée de :star_struck: en :heart_eyes_cat: avec l’aide de quelques Twittos bienveillants.

Fin 2020 j’ai posté un tweet mi-blague mi-sérieux qui disait en substance “est-ce que quelqu’un cherche une développeuse PHP qui voudrait faire du Python ?” et la réponse était oui. (C’était Jean-Michel !)
Donc en janvier 2021 j’ai été embarquée sur un projet pro Django sans savoir ce que c’était, et ça s’est très bien passé.

Bref tout ça pour dire que j’aime bien l’AoC et que j’aimerais le refaire cette année. Je peux partager mon leaderboard si ça vous dit. Il y a du monde dessus, mais plus on est de fous plus on rit.

Edit. Mon dépôt : GitHub - tut-tuuut/advent-of-code-shiny-giggle: Code used to solve https://adventofcode.com/

Mon objectif cette année est de comprendre comment faire marcher proprement cet import de package sans faire un copier-coller dégueu… :see_no_evil:

1 « J'aime »

Oui on est plusieurs à envisager de le faire cette année

1 « J'aime »

oui absolument! Je n’aurais sans doute pas assez de temps dispo pour battre mon record de 42​:star: (et tant mieux - j’aime ce chiffre :wink:) mais je suis partant pour rejoindre un leaderboard.

Advent of code et Project Euler ont bien alimenté mon parcours d’apprentissage du Python!

Depuis la dernière fois où j’ai publié ce message, j’ai fait toutes les éditions intermédiaires jusqu’au bout avec ma collègue mathématicienne/statisticienne (vous n’avez pas idée à quel point ça simplifie la vie parfois de bien connaître les maths pour ce genre d’exercices).

Voici mes différentes contributions (ce sont tous des Jupyter Notebook car dans notre corps de métier c’est un peu notre outil phare et facile) :

Par contre je trouve l’idée du leaderboard basé sur la vitesse de résolution des exercices complètement stupide, et généralement je préfère ne pas mesurer cet aspect là dans ce genre de défi. Je préfère largement l’aspect collectif de se partager les techniques de résolution et les pistes de réflexion, ça fait progresser tout le monde et c’est beaucoup moins “tryhardeur”.

1 « J'aime »

On peut avoir le fameux leader board ? Je vais essayer de m’y mettre.

Ca serait peut être sympa de faire un thread partage d’idées/solutions pour cette éditions non ?

3 « J'aime »

Voici les dépôts des compétiteurs actuels (depuis IRC), n’hésitez pas à m’indiquer le votre :

1 « J'aime »

Le lien vers mon dépôt est dans mon message fleuve, ci-dessus. Pour l’instant j’ai déjà eu la flemme en J2, ça s’annonce bien cette affaire.

Je n’avais pas fait attention, c’est mis à jour !

Courage ! :wink:

Je suis allée jeter un coup d’œil aux autres codes viteuf, je voudrais juste vous signaler que le monsieur d’AoC demande explicitement, sur cette page, à ce qu’on ne commite pas les inputs :

Advent of Code is free to use, not free to copy. If you’re posting a code repository somewhere, please don’t include parts of Advent of Code like the puzzle text or your inputs.

Envisagez donc d’ajouter *.txt dans votre .gitignore :slight_smile:

1 « J'aime »

Ah je l’ignorais, je comprends la raison pour les textes et les puzzles, mais j’aimerais bien savoir pourquoi ça inclut les inputs. Est-ce qu’il serait possible de rétro-ingéniérer le générateur d’inputs si on a suffisamment d’inputs différents à disposition ?

Ce qui m’embête c’est que du coup c’est pas reproductible :frowning:

Faudrait que je maintienne 2 dépôts : l’un public avec le code et l’autre privé avec les données. Je verrai quand j’aurai le temps de faire ça.

1 « J'aime »