Calendrier de l'avent 🎄 (mais sans chocolats)

pareil, je comprends pas LA PHRASE de la partie 2. Ca veut dire quoi ca :

Your seat wasn’t at the very front or back, though; the seats with IDs +1 and -1 from yours will be in your list.

Je comprends juste pas ce que ca veut dire. Ils sont casse couilles avec leur enoncés alambiqués 


Ca veut dire que les ID sont consĂ©cutifs mais qu’il ne commence pas a 1 et ne fini pas a un nombre en particulier. Comme l’avion est plein, si tu trouves un trou dans la liste des ID, c’est que c’est ton siĂšge.

Oui, j’ai fini par comprendre, mais vraiment, c’est super mal tournĂ© 
 Merci pour l’explication ceci dit !

Days5 en python
def decode(instructions, posmax):
    min = 0
    max=posmax
    indexMax = len(instructions)-1
    for i in range(indexMax):
        mid = (((max+1) - min) / 2) + min
        if instructions[i] in ['F', 'L']:
            max = mid - 1
        else:
            min = mid

    if instructions[indexMax] in ['F', 'L']:
        return(int(min))
    else:
        return(int(max))

def getMySeat(occupiedSeats):
    previousUnoccupiedId = -1
    for i in range(128):
        for j in range(8):
            id = i*8+j
            if id in occupiedSeats:
                continue

            if (id-1) != previousUnoccupiedId:
                return(id)
            previousUnoccupiedId = id

f = open("Z:\donnees\developpement\Python\AdventOfCode\day5.txt", "r")
occupiedSeats = []
highestID = 0
for line in f:
    boarding = list(line.rstrip("\n"))
    row = decode(boarding[:7], 127)
    col = decode(boarding[7:], 7)
    id = 8*row+col

    if id > highestID:
        highestID = id
    occupiedSeats.append(id)
f.close()

print("HighestId = {0}".format(highestID))
print("Nomber of seats Occupied = {0}".format(len(occupiedSeats)))
print("My seat ID = {0}".format(getMySeat(occupiedSeats)))

Et le resultat :

HighestId = 880 Nomber of seats Occupied = 867
My seat ID = 731
[Finished in 0.09s]

@Xerto : trùs elegante ta solution ! J’aime beaucoup !

1 « J'aime »

Je vois que vous le faites tous en python, mais pourquoi personne utilise les fonctions de python pour traduire de binaire vers dĂ©cimal avec int(my_num, 2) ? Car aprĂšs tout c’est dans le titre du problĂšme :smiley:

anyway, la journĂ©e est presque finie mais pour illustrer mon propos j’ai fait ça :

Résumé
def get_seat_number(seat):
    seat = seat.replace("F", "0").replace("B", "1") \
        .replace("L", "0").replace("R", "1")
    return int(seat[:7], 2), int(seat[7:], 2)


with open("input") as f:
    lines = [l.strip() for l in f.readlines()]

seats = [get_seat_number(seat) for seat in lines]
IDs = [(row * 8 + col) for row, col in seats]
IDs.sort()
print(f"Highest seat number : {IDs[-1]}")

allSeats = range(IDs[0], IDs[-1])
mySeat = set(allSeats) - set(IDs)
print(f"My seat number : {mySeat}")

no bully please, j’ai la mauvaise habitude de trop inliner mon code (et de pas donner d’extensions à mes fichiers)


2 « J'aime »

Hello :wave:

Pas de gros challenge aujourd’hui. Voici mon code :slight_smile:

Part1 / Part2

1 « J'aime »

TrÚs compliqué pour moi de coder le WE (#faitesdesgosses), je vous rattraperai lundi, pas trop de spoil pls :wink:

Les challenges de ce week-end sont pas trop compliquĂ©s donc tu pourras rattraper lundi. Le week-end prochain c’est possible que ça soit plus compliquĂ© :slight_smile:

J’ai un peu galĂ©rĂ© sur la seconde partie quand j’ai voulu reprendre mon code de la premiĂšre partie, mais au final j’ai rĂ©ussi Ă  Ă©crire une solution bien pythonesque : ici sur Github.

1 « J'aime »

pas de prise de tĂȘte ce matin (j’ai fait ca a la rache pendant que minimoi buvait son bib
 donc y a surement plus simple) :

Résumé
def  day6_1(l):
    return len(dict.fromkeys(l))

def day6_2(data):
    return len(set.intersection(*map(set, data)))



if __name__ == "__main__":
    fichier = open('input.txt', 'r')
    linesDeMonFichier = [l for l in fichier.read().split('\n\n')]

    data = [ day6_1(l.replace('\n','')) for l in linesDeMonFichier ]
    print(sum(data))

    data = [day6_2(l.split('\n')) for l in linesDeMonFichier]
    print(sum(data))
3 « J'aime »

j’aime beaucoup cette façon de faire j’étais parti dans un dĂ©lire bien trop complexe :man_facepalming:

Pour du code fait à l’arrache je trouve ça super concis :ok_hand:
bon ca reste du python, évidemment en Elixir ca aurait été beaucoup plus élégant

J’ai pas compris pourquoi tu transformes en list pour faire un len plutît que de faire un len direct sur le set ou le dict, mais sinon trùs concis j’aime bien !

T’as totalement raison, c’est totalement inutile :slight_smile:

des que j’en ai fini avec pharo, je regarde Elixir :wink:

1 « J'aime »

Assez facile effectivement aujourd’hui (et l’énoncĂ© Ă©tait comprĂ©hensible :smiley: )

Day 6 (python)
f = open("Z:\donnees\developpement\Python\AdventOfCode\day6.txt", "r")
currentGroupStar1 = set()
currentGroupStar2 = set()
totalSumStar1 = 0
totalSumStar2 = 0
nbMemberGroup = 0
for line in f:
    if line == "\n":
        ## Star 1 : counting element of current group(contain only unique question which have been answered yes)
        totalSumStar1 += len(currentGroupStar1)
        currentGroupStar1 = set()

        ## Star2 :
        totalSumStar2 += len(currentGroupStar2)
        currentGroupStar2 = set()
        nbMemberGroup = 0
    else:
        answers = list(line.rstrip("\n"))

        ## Star 1:
        currentGroupStar1.update(answers)

        ## Star 2:
        nbMemberGroup += 1
        if nbMemberGroup == 1:
            currentGroupStar2.update(answers)
        else:
            ## on ne garde que l'intersection des reponses et de la liste existantes
            currentGroupStar2 = currentGroupStar2.intersection(answers)

## don't forget final group :
totalSumStar1 += len(currentGroupStar1)
totalSumStar2 += len(currentGroupStar2)
f.close()

print("Star 1 : {0}".format(totalSumStar1))
print("Star 2 : {0}".format(totalSumStar2))

Et le resultat :

Star 1 : 6662
Star 2 : 3382
[Finished in 0.076s]

@Ewi : bravo pour la concision ! C’est impressionnant à quelle point on peut factoriser le code en Python ! Par contre (et ca doit etre moi qui suis trop nul :slight_smile: ), ce n’est pas pour moi : je ne comprends pas ce que fait ton code 
 Enfin si, je fini par comprendre, mais ca demande vraiment un gros effort pour tout developper.

1 « J'aime »

Rien Ă  voir avec le faite d’ĂȘtre nul ou bon, c’est une question d’habitude et de background.

Va demander Ă  un programmeur java de faire du OCaml, mĂȘme si c’est un Dieu
 il va galĂ©rĂ©.

1 « J'aime »

Je m’y mets sur le tard, je viens de finir le jour 4, c’était bien plus long que les 3 autres ! ^^;
En javascript en essayant de faire plutĂŽt version programmation fonctionnelle.

Jour 3
let howManyTrees = (data,right,down) => (
    data
    // transformer le string en array of char
    .map(d => d.split(''))
    // on saute des lignes si la pente est forte (down > 1)
    .filter((d,i) => i%down === 0)
    // pour les lignes restantes on recupere le bon caractere
    // la ieme ligne donnera le right*i caractere
    // on reboucle avec un modulo pour simuler la répétition du pattern
    .map((d,i) => d[(i*right)%d.length])
    // si ce caractere est un arbre, on le garde, sinon on l'enleve
    .filter(d => d==='#')
    // la liste finale est l'ensemble des arbres rencontrés, 
    // la taille de cette liste est le nombre d'arbres
    .length    
)


console.log(howManyTrees(data,3,1))

console.log(
    howManyTrees(data,1,1)*
    howManyTrees(data,3,1)*
    howManyTrees(data,5,1)*
    howManyTrees(data,7,1)*
    howManyTrees(data,1,2))
Jour 4
let hasAllKeys = ([firstkey, ...otherKeys])=>(d)=>(
    typeof firstkey === 'undefined' ||
    (
        firstkey in d && 
        hasAllKeys(otherKeys)(d)
    )
)

//hgt (Height) - a number followed by either cm or in:
//    If cm, the number must be at least 150 and at most 193.
//    If in, the number must be at least 59 and at most 76.
let testHGT = (d) => {
    let unit = d.hgt.slice(-2)
    let val = d.hgt.slice(0,-2)
    if (unit === 'cm'){
        return val >= 150 && val <= 193
    }
    if (unit === 'in'){
        return val >= 59 && val <= 76
    }
    return false
}

let result = data
// concat all group of rows separated by an empty string ''
.reduce((acc,d) => {
    if (d === ''){
        return [...acc,d]
    } else {
        let clone = [...acc]
        let last = clone.pop()
        return [...clone,last.concat(d).concat(' ')]
    }    
},[''])
// separe all pair entry/value separated by a ' '
.map(d => d.split(' ').slice(0,-1))
// for each array obtained this way
// we tranform it into an object
.map(d => 
    d.reduce((acc,pair) => {
        let pairArray = pair.split(':')
        let pairKey = pairArray[0]
        let pairValue = pairArray[1]
        let result = {...acc}
        result[pairKey] = pairValue
        return result
    },{}))
// get only object which have all needed keys
.filter(hasAllKeys(['byr','iyr','eyr','hgt','hcl','ecl','pid']))
// all those tests are for part 2
.filter(d => d.byr >= 1920 && d.byr <= 2002)
.filter(d => d.iyr >= 2010 && d.iyr <= 2020)
.filter(d => d.eyr >= 2020 && d.eyr <= 2030)
.filter(d => testHGT(d))
.filter(d => d.hcl.match(/^#[0-9a-f]{6}$/))
.filter(d => ['amb','blu','brn','gry','grn','hzl','oth'].includes(d.ecl))
.filter(d => d.pid.match(/^[0-9]{9}$/))
.length

console.log(result)
Jour 5
let translateSeat = (valLength, valWidth, [head,...tail], resultSeatParam) => {
    let resultSeat = resultSeatParam || {row:0,column:0}
    if (head === 'F' || head === 'B'){
        return translateSeat(valLength/2, valWidth, tail, {...resultSeat, row:resultSeat.row+(head === 'B' ? valLength : 0)})
    } 
    if (head === 'L' || head === 'R'){
        return translateSeat(valLength, valWidth/2, tail, {...resultSeat, column:resultSeat.column+(head === 'R' ? valWidth : 0)})
    }
    return resultSeat
}

let findSeat = ([a,b,...tail]) => a === b-2 ? a+1 : findSeat([b,...tail])

let result = data
.map(d => translateSeat(64,4,d))
.map(d => (d.row*8) + d.column)
.map(d => parseInt(d, 10))
.reduce((acc,d) => acc < d ? d : acc, 0)

let result2_1 = data
.map(d => translateSeat(64,4,d))
.map(d => (d.row*8) + d.column)
.map(d => parseInt(d, 10))
.sort((a, b) => a - b)

let result2 = findSeat(result2_1)

console.log(result)
console.log(result2)

J’ai refait le 1er puzzle en OCaml en me basant sur mes souvenirs pour voir
 bin c’est pas gagnĂ© pour refaire les autres (c’est fou ce qu’on oubli tout)

let sum x y = x+y==2020;; 

let rec findDay1 l1 l2= match (l1,l2) with
  | ([],_) -> 0
  | (t::q,[])-> findDay1 q q 
  | (t::q,t2::q2)-> if sum t t2 then t*t2 else findDay1 (t::q) q2 ;;

Hello :wave: je m’y mets tout juste, mĂȘme pas encore lu l’énoncĂ© :slight_smile: (je sais juste que haversack c’est une sorte de sac Ă  dos)

Une fois encore c’est le traitement de l’input qui m’a posĂ© le plus problĂšme, je me retrouve avec des strip() dans tous les sens c’en est presque obscĂšne. Il faut que j’assainisse ça au cours de la journĂ©e. Solution en Python.

2 « J'aime »

oui j’ai une petite flemme de m’y mettre là, tout ce parsing me motive pas des masses :slight_smile: