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)