Calendrier de l'avent 🎄 (mais sans chocolats)

Ben dans certains cas, si ton fichier est pas fermĂ©, tu as des erreurs Ă  l’ouverture (j’en ai au boulot avec des streamwriter en powershell qui ont une erreur de fichier verrouillĂ© et donc non modifiable).

Comme je me suis posĂ© la mĂȘme question que toi sans osĂ© demander
Voilà le résultat de ma recherche Google :stuck_out_tongue:

https://www.geeksforgeeks.org/what-does-the-if-__name__-__main__-do/

@Ewi du coup tu mets ça dans tous tes fichiers quasiment pour pouvoir les tester individuellement ? C’est une norme ?

Edit : pour que le lien apparaisse correctement

ha ok merci pour l’info :slight_smile:

@djktk : oui je sais bien, c’est pour ca que je ferme toujours mes fichiers, ou pour eviter de la garder ouvert plus longtemps que necessaire :slight_smile: c’etait pour embetter @ewi

Uniquement dans les fichiers susceptibles d’ĂȘtre lancĂ© a la main.
Pour les tests individuels, en gĂ©nĂ©ral, j’ai un script dĂ©diĂ©.

@Ben :stuck_out_tongue_closed_eyes:

Je viens de terminer le jour 2. J’ai encore des progrĂšs Ă  faire avec les opĂ©rateurs logiques mais c’est pas mal :slight_smile: Je crois que je m’embĂȘte plus qu’autre chose Ă  utiliser la librairie Pandas pour lire les fichiers mais bon, c’est un apprentissage aussi!

1 « J'aime »

As tu poussĂ© le bouchon jusqu’a utiliser les series et regex ?
un truc comme ca?

df[df['pwd'].str.match(r'df['lettre']{df['mini'],df['maxi']}')== True]

?

Roh putain non, c’est puissant ça! :smiley: Mais comme je disais je dĂ©couvre le monde du python. D’ailleurs si les exercices deviennent plus corsĂ©s ce serait mĂȘme marrant de les faire Ă  2 ou 3 si des gens sont assez patients pour ça :slight_smile:

jour2_1
```python
def jour2_1 ():
    f = open("Jour2_1.txt","r")
    goodPass = 0
    for line in f:
        min = int(line.split(':')[0].split(" ")[0].split('-')[0])
        max = int(line.split(':')[0].split(" ")[0].split('-')[1])
        letter = line.split(':')[0].split(" ")[1]
        pwd =  line.split(':')[1].split(" ")[1]
        count = 0
        for l in pwd:
            if l==letter:
                count = count + 1 
        if count >= min and count <= max:
            goodPass = goodPass+1
            print ("yay")

        print(f'min =  {min} max = {max} letter : {letter} pwd = {pwd}')    
    f.close()
    print ( f'GoodPass = {goodPass}')
Jour 2_2
```python
def jour2_2 ():
    f = open("Jour2_1.txt","r")
    goodPass = 0
    for line in f:
        pos1 = int(line.split(':')[0].split(" ")[0].split('-')[0])
        pos2 = int(line.split(':')[0].split(" ")[0].split('-')[1])
        letter = line.split(':')[0].split(" ")[1]
        pwd =  line.split(':')[1].split(" ")[1]
        count = 0
        index = 1

        for l in pwd:
            if (index == pos1 or index == pos2 ) and l==letter:
                count = count + 1 
            index = index + 1
            
        if count == 1:
            goodPass = goodPass+1
            print ("yay")

        print(f'pos1 =  {pos1} pos2 = {pos2} letter : {letter} pwd = {pwd}')    
    f.close()
    print ( f'GoodPass = {goodPass}')```

Premiùre fois que je fais du Python, c’est rigolo.
Ca sert Ă  quoi la lib « re » ? C’est pour les poilus des regex ?

J’ai pas trouvĂ© le moyen de rĂ©cupĂ©rer la source depuis l’url des input, c’est con il faut ĂȘtre loggĂ© :confused:

Dans ton cas, ca sert Ă  rien :smiley:

Oui, c’est la librairie pour utiliser les expressions reguliĂšres sous python. Regarde ma solution, tu verras que c’est plus pratique pour extraire des donnĂ©es qui respectent un formalisme qui se represente sous forme d’expression rĂ©guliĂšre.

Comment vous faites, sur le forum, pour avoir la flÚche qui déroule le texte caché ?

(Day2 done, je poste quand je saurai Ă©crire un message ;))

Utilise la balise [ details=« ma solution en Python Â» ] [ \ details ].

Ce qui est entre les deux passent sous la fleche.

Merci.

Day 2 part 1
if (preg_match_all('/(?P<min>\d+)-(?P<max>\d+) (?P<letter>\w): (?P<password>\w+)/', $line, $matches))
        {
            $nbfound = preg_match_all('/'.$matches['letter'][0].'/', $matches['password'][0]);
            if ($nbfound >= (int) $matches['min'][0] && $nbfound <= (int) $matches['max'][0])
            {
                $valide++;
            }
        }
Day 2 part 2
if (preg_match_all('/(?P<firstPos>\d+)-(?P<secondPos>\d+) (?P<letter>\w): (?P<password>\w+)/', $line, $matches))
        {
            $firstPos = (int)$matches['firstPos'][0]-1;
            $secondPos = (int)$matches['secondPos'][0]-1;
            $letter =  $matches['letter'][0];
            if (
                isset($matches['password'][0][$firstPos], $matches['password'][0][$secondPos]) &&
                (
                    ($matches['password'][0][$firstPos] === $letter && $matches['password'][0][$secondPos] !== $letter) ||
                    ($matches['password'][0][$firstPos] !== $letter && $matches['password'][0][$secondPos] === $letter)
                )
            )
            {
                $valide++;
            }
        }

(j’ai supprimĂ© les passages pour recup les inputs et la sortie ecran)

Bonne journée :slight_smile:

2 « J'aime »

pas encore codé, mais on arrive sur le type de challenge ou la difficulté majeure tient dans la compréhension du problÚme plus que dans le code !

ca va je trouve. je vais le faire avec mes Ă©tudiants de ce matin :stuck_out_tongue_closed_eyes:

En lisant l’énoncĂ© je me suis dit « rah ça se corse il va falloir slalomer entre les sapins Â» et en fait pas du tout on compte juste les sapins qu’on se prend dans la poire.

Solution Python
import time
from functools import reduce

tic = time.perf_counter()

def trees(lines, s):
    bottom = len(lines)
    width = len(lines[0])
    t = 0
    x = 0
    y = 0
    while y + s[1] < bottom:
        x = (x + s[0]) % width
        y += s[1]
        if lines[y][x] == '#':
            t += 1
    return t

with open("input.txt", 'r') as f:
    forest = [x.strip() for x in f.readlines() if x.strip()]
    slopes = [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)]
    l_trees = [trees(forest, s) for s in slopes]
    for i in range(0, len(slopes)):
        print(f"{l_trees[i]} trees for slope {slopes[i]}")
    print(f"{reduce(lambda x, y: x*y, l_trees)} multiplied trees")

toc = time.perf_counter()
print(f"Done in {toc - tic:0.4f}s")
3 « J'aime »
Day 3 Part 1 en PHP
$nbTrees = 0;
    $nbLines = count($inputs)-1;
    $lineLenght = strlen($inputs[0])-2; //il me compte le \n donc -2
    $lineCursor=0;
    $columnCursor=0;
    while ($lineCursor !== $nbLines)
    {
        $columnCursor = ($columnCursor+3) > $lineLenght ? (($columnCursor+3) % $lineLenght)-1 : ($columnCursor+3);
        if ($inputs[++$lineCursor][$columnCursor] === '#')
        {
            $nbTrees++;
        }
    }
Day 3 part 2 en PHP

J’ai factorisĂ© le code et appelĂ© la fonction pour chaque « slope Â», c’est tout


private function factorDay3(array $inputs, int $right, int $down)
{
    $nbTrees = 0;
    $nbLines = count($inputs)-1;
    $lineLenght = strlen($inputs[0])-2; //il me compte le \n donc -2
    $lineCursor=0;
    $columnCursor=0;
    while ($lineCursor < $nbLines)
    {
        $columnCursor = ($columnCursor+$right) > $lineLenght ? (($columnCursor+$right) % $lineLenght)-1 : ($columnCursor+$right);
        $lineCursor = $down + $lineCursor;
        if ($inputs[$lineCursor][$columnCursor] === '#')
        {
            $nbTrees++;
        }
    }

    return $nbTrees;
}

En bonus, le git d’un collùgue que le fait en swift :

version Ă©tudiants

Résumé
# import

# variable globale

# fonction
def day3_2(data, slope):
    cpt=1
    for i in slope:
        cpt*=day3_1(data,i[0],i[1])
    return cpt

def day3_1(data,right,down):
    cpt=0
    i=0
    j=0
    while i < len(data):

        if data[i][j] == '#':
            cpt += 1
        j+=right

        if j >= len(data[i]):
            j -= len(data[i])

        i += down

    return cpt

# main
if __name__ == '__main__':
    fichier = open('input.txt', 'r')
    linesDeMonFichier = fichier.readlines()
    data = []

    for i in linesDeMonFichier:
        data = data + [list(i)[0:len(i)-1]]

    tree = day3_2(data,[[1,1],[3,1],[5,1],[7,1],[1,2]])
    print(tree)
1 « J'aime »

Si ta case [0][0] est un arbre, tu le comptes au dĂ©marrage, pas sĂ»r que ça soit bon (pour moi on compte si Ă  l’arrivĂ© du dĂ©placement on trouve un arbre, pas au dĂ©marrage mais c’est pas hyper clair je te l’accorde).

A oui, bien vu. Je verrai une version optimisé ce soir de toute façon :slight_smile: