Calendrier de l'avent 🎄 (mais sans chocolats)

$timestart = microtime(true);
$lignes = file("input2");
if ($lignes === false) die("erreur de lecture");
$valid = 0;
for ($i=0; $i<count($lignes); $i++)
{
	$ligne = explode(" ", $lignes[$i]);
	$minmax = explode("-", $ligne[0]);
	$min = $minmax[0];
	$max = $minmax[1];
	$lettre = substr($ligne[1], 0, 1);
	$mdp = $ligne[2];
	//part 1 
	//if (substr_count($mdp, $lettre)>= $min && substr_count($mdp, $lettre)<=$max ) $valid++;
	//part 2
	$min--;
	$max--;
	if (substr($mdp,$min,1) == $lettre xor substr($mdp,$max,1) == $lettre) $valid++; 
}
echo "valides: $valid";
$timeend = microtime(true);
echo "<hr>temps : " . number_format($timeend-$timestart, 4);

Les trois quotes

1 « J'aime »

Je me suis lancĂ©, php && symfony pour ma part (c’est juste pour me simplifier la vie, oui je pourrais faire des scripts php simples)

PHP n’est pas le plus adaptĂ©, je pense que Python tirerait bien son Ă©pingle (pour Advent et en gĂ©nĂ©ral), mais je ne suis plus dev depuis si longtemps que je retrouve mes vieilles habitudes.

Au taf il le font en swift, js, etc
 chacun son language de prédilections (pas envie de chercher le nom des fonctions)

JS c’est top, rapide, lĂ©ger, mais pour la lecture de fichier dans le navigateur, no way. Enfin, de mes faibles connaissances de ce langage.

On va quand mĂȘme pas partir dans un dĂ©bat « X est mieux que Y, Z c’est pourri pour ca ! Â» ?

On peut tout faire avec tout si on maĂźtrise.

1 « J'aime »

On discute gentiment en attendant demain, pas de gué-guerre ici.

Ça doit ĂȘtre en NodeJS.

1 « J'aime »

Allez tous vous rhabiller, y’a un type sur reddit qui rĂ©sous tous les puzzles en K9. Sa solution du jour 2 :joy: :scream:

x:{(`i$"-"\x;z=*y)}.'" "\'0:`2.txt
+/{({x_!1+y}/x)'+/y}/'x
+/~{=/y@x-1}/'x

là pour le coup c’est cryptique au possible

Balise spoiler pls :wink:

Hop, day2 fini aussi :

ma solution en Python
import re

f = open("Z:\donnees\developpement\Python\AdventOfCode\day2.txt", "r")
validePasswordStar1 = 0
validePasswordStar2 = 0
for line in f:
    result = re.match("(\d+)-(\d+) (\w): (.+)", line)
    if result:
        min = int(result.group(1))
        max = int(result.group(2))
        char = result.group(3)
        mdp = result.group(4)

        # Star 1
        occurence = mdp.count(char)
        if (occurence >= min) and (occurence <= max):
            validePasswordStar1 += 1

        #Star 2
       if ((mdp[min-1] == char) and (mdp[max-1] != char)) or \
          ((mdp[max-1] == char) and (mdp[min-1] != char)):
              validePasswordStar2 +=1
f.close()
print("Star 1 : Nombre de valide: %d"%validePasswordStar1)
print("Star 2 : Nombre de valide: %d"%validePasswordStar2)

Et le resultat :

Star 1 : Nombre de valide: 546
Star 2 : Nombre de valide: 275
[Finished in 0.087s]
1 « J'aime »

Pour la solution d’hier, j’ai un RNA si vous voulez :innocent:

C’est impressionant, mais je comprend toujours pas l’interet de programmer comme ca. c’est pas plus efficace, mais c’est completement illisible 


1 « J'aime »

Je pense que l’intĂ©rĂȘt est avant tout artistique :slight_smile:
C’est comme programmer en BrainFuck :exploding_head: ou en Ook :monkey:

Pour le coup lĂ , mĂȘme sans balise spoiler
ça me donne envie de reprendre Perl et Haskell. Nan, je dĂ©conne.

et voila :

Résumé
import re
import time

current_milli_time = lambda: int(round(time.time() * 1000))

def day2(data,part):
    passwordValid=0
    for d in data:
        if part == 1:
            if d['mini']<= sum(map(lambda x : 1 if d['letter'] in x else 0, d['pwd'])) <= d['maxi']  :
                passwordValid += 1
        else :
            if (d['pwd'][d['mini']-1]==d['letter'] and d['pwd'][d['maxi']-1]!=d['letter']) or (d['pwd'][d['mini']-1]!=d['letter'] and d['pwd'][d['maxi']-1]==d['letter']):
                passwordValid+=1
    return passwordValid


if __name__ == '__main__':
    start = current_milli_time()

    file1 = open('in.py', 'r')
    Lines = file1.readlines()
    file1.close()
    data = []

    for l in Lines:
        resplit = re.split("(\d+)-(\d+) (\w): (.+)", l)

        if len(resplit) >= 4:
            mini = int(resplit[1])
            maxi = int(resplit[2])
            letter = resplit[3]
            pwd = resplit[4]

            data.append({'mini':mini,'maxi':maxi,"letter":letter, "pwd":pwd})

    resultat=day2(data,2)
    print(resultat)
    end = current_milli_time() - start
    print(end)

Tiens @Ewi, a quoi sert cette instruction ? Je voulais déjà te le demander dans ton exemple précedent :slight_smile:
Et sinon, il te manque un file.close(), c’est pas bien :innocent: Blague à part, ca sert vraiment a quelques choses en 2020 les file.close() ? J’ai l’impression que les fichiers sont clos en fin d’execution de toute facon non ?

Ça sert a dĂ©finir un bloc logique qui n’est exĂ©cutĂ© que si le script est lancer (par opposition a « appelĂ© depuis un autre module Â»).

edit : __name__ est une variable automatiquement crĂ©Ă©e par Python, disponible, n’importe oĂč, dans tous les scripts. Elle vaut "__main__" si tu as lancer le script Ă  la main.