owned this note
owned this note
Published
Linked with GitHub
# aoc 2020
cursed iterplus userscript (and auto-input userscript) available on demand, somebody#0001
# day 1
part 1
```javascript
a=document.body.innerText.split('\n').map(Number);for(i=0;i<a.length;i++)for(j=i+1;j<a.length;j++)if(a[i]+a[j]===2020)console.log(a[i]*a[j])
```
```javascript
i$.comb($,2).f`s==2020`.nth(0).p()
```
part 2
```javascript
a=document.body.innerText.split('\n').map(Number);for(i=0;i<a.length;i++)for(j=i+1;j<a.length;j++)for(k=j+1;k<a.length;k++)if(a[i]+a[j]+a[k]===2020)console.log(a[i]*a[j]*a[k])
```
```javascript
i$.comb($,3).f`s==2020`.nth(0).p()
```
# day 2
using iterplus
part 1
```javascript
_.map(s=>s.replace(/^(\d+)-(\d+) (.): (.+)$/, (m, a, b, c, d) => {r=d.map(_=>_==c).s;return r>=a&&r<=b?1:0})).map(_=>_=='1').s
```
```javascript
_.c(/^(\d+)-(\d+) (.): (.+)$/,(m,a,b,c,d)=>d.c(c).between(a,b))
```
part 2
```javascript
_.map(s=>s.replace(/^(\d+)-(\d+) (.): (.+)$/, (m, a, b, c, d) =>(d[+a-1]==c)^(d[+b-1]==c))).map(_=>_=='1').s()
```
```javascript
_.c(/^(\d+)-(\d+) (.): (.+)$/,(m,a,b,c,d)=>(d[a-1]==c)^(d[b-1]==c))
```
# day 3
part 1
```javascript
_.map((l,i)=>l[i*3%l.length]).c('#')
```
part 2
```javascript
[1,3,5,7].map(n=>_.map((l,i)=>l[i*n%l.length]).c('#')).p*(_.map((l,i)=>!(i%2)&&l[i/2%l.length]).c('#'))
```
```javascript
[1,3,5,7,[1,2]].p(n=>_.step(n[1]??1).m((l,i)=>l[i*(n[0]??n)%l.length]).c('#'))
```
# day 4
part 1
```javascript
_.join('\n').split('\n\n').c(s=>['byr','iyr','eyr','hgt','hcl','ecl','pid'].every(t=>s.includes(t)))
```
part 2
```javascript
_.join('\n').split('\n\n').filter(s=>['byr','iyr','eyr','hgt','hcl','ecl','pid'].every(t=>s.includes(t))).map(s=>s.match(/(\S+):(\S+)/g).map(x=>x.split(':')).reduce((p,[a,b])=>((p[a]=b),p),{})).c(o=>o.byr.between(1920,2002)&&o.iyr.between(2010,2020)&&o.eyr.between(2020,2030)&&(o.hgt.endsWith('cm')?parseInt(o.hgt).between(150,193):parseInt(o.hgt).between(59,76))&&/^#[0-9a-f]{6}$/i.test(o.hcl)&&['amb','blu','brn','gry','grn','hzl','oth'].includes(o.ecl)&&/^[0-9]{9}$/i.test(o.pid))
```
```javascript
_.join('\n').split('\n\n').filter(s=>['byr','iyr','eyr','hgt','hcl','ecl','pid'].every(t=>s.includes(t))).map(s=>Object.fromEntries([...s.matchAll(/(\S+):(\S+)/g)].map(a=>a.slice(1)))).c(o=>o.byr.between(1920,2002)&&o.iyr.between(2010,2020)&&o.eyr.between(2020,2030)&&parseInt(o.hgt).between((c=o.hgt.endsWith('cm'))?150:59,c?193:76)&&/^#[0-9a-f]{6}$/i.test(o.hcl)&&['amb','blu','brn','gry','grn','hzl','oth'].includes(o.ecl)&&/^[0-9]{9}$/i.test(o.pid))
```
# day 5
part 1
```javascript
_.map(s=>s.replace(/[BR]/g,'1').replace(/[FL]/g,'0')).map(n=>parseInt(n,2)).reduce((a,b)=>a>b?a:b,0)
```
part 2
```javascript
b=_.map(s=>s.replace(/[BR]/g,'1').replace(/[FL]/g,'0')).map(n=>parseInt(n,2));
for(i=0;i<860;i++)if(!b.includes(i))console.log(i)
```
```javascript
_.map(s=>s.replace(/[BR]/g,'1').replace(/[FL]/g,'0')).map(n=>parseInt(n,2)).f((n,i,a)=>a.includes(n+2)&&!a.includes(n+1))[0]+1
```
# day 6
part 1
```javascript
__.split('\n\n').s(q=>'abcdefghijklmnopqrstuvwxyz'.c(c=>q.includes(c)))
```
part 2
```javascript
__.split('\n\n').s(q=>'abcdefghijklmnopqrstuvwxyz'.c(c=>q.split('\n').every(r=>r.includes(c))))
```
# day 7
part 1
```javascript
```
part 2
```javascript
```
# day 8
part 1
```javascript
i=_.map(s=>s.split(' ')).map(([a,b])=>[a,+b]);
v={};ip=0;it=0;acc=0;
while(!(ip in v)){
v[ip]=true;it++;
switch(i[ip][0]){
case 'nop':break;
case 'acc':acc+=i[ip][1];break;
case 'jmp':ip+=i[ip][1]-1;break;
}
ip++
}
acc
```
part 2
```javascript
i=_.map(s=>s.split(' ')).map(([a,b])=>[a,+b]);
for(x=0;x<i.length;x++){
if(i[x][0]!=='nop'&&i[x][0]!=='jmp')continue;
v={};ip=0;it=0;acc=0;
while(ip<i.length&&!(ip in v)){
v[ip]=true;it++;
switch(i[ip][0]){
case 'nop':if(ip===x)ip+=i[ip][1]-1;break;
case 'acc':acc+=i[ip][1];break;
case 'jmp':if(ip!==x)ip+=i[ip][1]-1;break;
}
ip++
}
if(ip>=i.length)console.log(acc)
}
```
# day 9
part 1
```javascript
_2=_.slice();a=_2.splice(0,25);while(a.some(b=>a.includes((_2[0]-b)+''))){a.shift();a.push(_2.shift())}_2
```
part 2
```javascript
_2=_.slice();a=_2.splice(0,25);while(a.some(b=>a.includes((_2[0]-b)+''))){a.shift();a.push(_2.shift())}inv=+_2[0];for(i=0;i<_.length;i++){s=n=x=+_[i];for(j=i+1;j<_.length;j++){s+=+_[j];if(+_[j]<n)n=+_[j];if(+_[j]>x)x=+_[j];if(s===inv)console.log(n+x)}}
```
# day 10
part 1
```javascript
a=_.slice(0,_.length-1);b=a.map(Number).sort((a,b)=>a-b);f=1;c=b.reduce(([a,b,c],n)=>{if(f){f=0;return[a,b,n];}else return n-c===1?[a+1,b,n]:[a,b+1,n]},[1,1,0]);c[0]*c[1]
```
part 2
```javascript
a=_.slice(0,_.length-1);b=a.map(Number).sort((a,b)=>a-b);b.unshift(0);c=Array(b.length).fill(0);c[0]=1;for(i=1;i<b.length;i++){r=0;for(j=0;j<i;j++)if(b[i]-b[j]>0&&b[i]-b[j]<4)r+=c[j];c[i]=r};c[c.length-1]
```
# day 11
part 1
```javascript
_2=_.slice(0,_.length-1);
same=(a,b)=>a.every((r,i)=>b[i]===r);
next=(a,i,j)=>{s=[(a[i-1]||[])[j-1],(a[i-1]||[])[j],(a[i-1]||[])[j+1],a[i][j-1],a[i][j+1],(a[i+1]||[])[j-1],(a[i+1]||[])[j],(a[i+1]||[])[j+1]].join('');return a[i][j]==='.'?'.':a[i][j]==='L'&&s.count('#')===0?'#':a[i][j]==='#'&&s.count('#')>=5?'L':a[i][j]}
[_2,_3]=[Array(_2.length).fill(''),_2.map(l=>l.replace(/L/g,'#'))];while(!same(_2,_3)){[_2,_3]=[_3,_3.map((l,i)=>l.map((c,j)=>next(_3,i,j)).join(''))]};
_3.join('').count('#')
```
part 2
```javascript
_2=_.slice(0,_.length-1);
same=(a,b)=>a.every((r,i)=>b[i]===r);
next=(a,i,j)=>{c=0;for(const[x,y]of[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]){[k,l]=[i,j];while(a[k+=x]&&a[k][l+=y]){if(a[k][l]==='#'){c++;break;}else if(a[k][l]==='L'){break;}}}return a[i][j]==='.'?'.':a[i][j]==='L'&&c===0?'#':a[i][j]==='#'&&c>=5?'L':a[i][j]}
[_2,_3]=[Array(_2.length).fill(''),_2.map(l=>l.replace(/L/g,'#'))];while(!same(_2,_3)){[_2,_3]=[_3,_3.map((l,i)=>l.map((c,j)=>next(_3,i,j)).join(''))]};
_3.join('').count('#')
```
# day 12
part 1
```javascript
d=0;x=0;y=0;
for(const s of _){
dd=+s.slice(1);
switch(s[0]){
case'L':d+=dd/90;break;
case'R':d-=dd/90;break;
case'F':switch(((d%4)+4)%4){
case 0:x+=dd;break;
case 1:y+=dd;break;
case 2:x-=dd;break;
case 3:y-=dd;break;
}break;
case'N':y+=dd;break;
case'S':y-=dd;break;
case'E':x+=dd;break;
case'W':x-=dd;break;
}}
console.log(Math.abs(x)+Math.abs(y))
```
part 2
```javascript
d=0;x=0;y=0;i=10;j=1;
for(const s of _){
dd=+s.slice(1);
switch(s[0]){
case'L':while(dd){[i,j]=[-j,i];dd-=90;}break;
case'R':while(dd){[i,j]=[j,-i];dd-=90;}break;
case'F':x+=i*dd;y+=j*dd;break;
case'N':j+=dd;break;
case'S':j-=dd;break;
case'E':i+=dd;break;
case'W':i-=dd;break;
}}
Math.abs(x)+Math.abs(y)
```
# day 13
part 1
```javascript
bs=_[1].split(',').map(Number).filter(n=>n);a=+_[0];o=Infinity;p=1;for(b of bs){n=Math.ceil(a/b)*b;if(n<o){o=n;p=(o-a)*b}};p
```
part 2
```javascript
cs=_[1].split(',').map((n,i)=>!isNaN(n)?[+n,i]:0).filter(n=>n);
n=cs.reduce(([a,b],[c,d])=>{for(i=1;i<=c;i++){if((a+b*i)%c===((c-d)%c+c)%c){return[a+b*i,b*c]}}},[1,1]);n
```
# day 14
part 1
```javascript
r=_.reduce(([mem,mask],l)=>{if(l.startsWith('mask')){return[mem,l.slice(7)]}else{match=l.match(/mem\[(\d+)\] = (\d+)/);m2=mask;n2=(+match[2]).toString(2).padStart(36,'0');N='';for(i=0;i<36;i++){if(m2[i]==='X')N+=n2[i];else N+=m2[i];}mem[+match[1]]=parseInt(N,2);return[mem,mask]}},[[],'']);r[0].reduce((p,c)=>p+c)
```
```javascript
_.reduce(([mem,mask],l)=>{if(l.startsWith('mask')){return[mem,l.slice(7)]}else{match=l.match(/mem\[(\d+)\] = (\d+)/);mem[+match[1]]=parseInt(mask.zip((+match[2]).toString(2).padStart(36,'0')).reduce((p,[a,b])=>p+(a=='X'?b:a),''),2);return[mem,mask]}},[[],''])[0].reduce((p,c)=>p+c)
```
part 2
```javascript
function*v(s,t,i=0,a=''){if(i===36)yield parseInt(a,2);else if(s[i]==='X'){yield*v(s,t,i+1,a+'0');yield*v(s,t,i+1,a+'1');}else if(s[i]==='1'){yield*v(s,t,i+1,a+'1')}else{yield*v(s,t,i+1,a+t[i])}}
r=_.reduce(([mem,mask],l)=>{if(l.startsWith('mask')){return[mem,l.slice(7)]}else{match=l.match(/mem\[(\d+)\] = (\d+)/);for(const addr of v(mask,(+match[1]).toString(2).padStart(36,'0'))){mem[addr]=+match[2];}return[mem,mask]}},[[],'']);s=0;for(k in r[0])s+=r[0][k];s
```
```javascript
function*v(s,t,i=0,a=''){if(i===36)yield parseInt(a,2);else if(s[i]==='X'){yield*v(s,t,i+1,a+'0');yield*v(s,t,i+1,a+'1');}else yield*v(s,t,i+1,a+(s[i]==1?1:t[i]))}
r=_.reduce(([mem,mask],l)=>{if(l.startsWith('mask')){return[mem,l.slice(7)]}else{match=l.match(/mem\[(\d+)\] = (\d+)/);for(const addr of v(mask,(+match[1]).toString(2).padStart(36,'0'))){mem[addr]=+match[2];}return[mem,mask]}},[[],'']);s=0;for(k in r[0])s+=r[0][k];s
```
# day 15
part 1
```javascript
a=_[0].split(',').map(Number);
while(a.length<2020){l=a[a.length-1];occ=a.map((e,i)=>[e,i]).filter(([e,i])=>e===l).map(([e,i])=>i);a.push(occ.length<2?0:occ[occ.length-1]-occ[occ.length-2]);}
a[2019]
```
part 2
```javascript
a=_[0].split(',').map(Number);
occ={}
for(i=0;i<a.length;i++){l=a[i];if(!(l in occ))occ[l]=[];occ[l].push(i)}
while(a.length<30000000){l=a[a.length-1];if(!(l in occ))occ[l]=[];occ[l].push(a.length-1);a.push(occ[l].length<2?0:occ[l][occ[l].length-1]-occ[l][occ[l].length-2]);}
a[30000000-1]
```
```javascript
a=_[0].split(',').map(Number);
occ=Array(30000000).fill(-1);
for(i=1;i<a.length;i++)occ[a[i-1]]=i;
l=a[a.length-1];
while(i<30000000){x=occ[l];occ[l]=i++;l=(x<0?0:i-1-x);}
l
```
# day 16
part 1
```javascript
z=__.split('\n\n');
[x,y]=[z[0].split(/\n/g),z[2].split(/\n/g)];
X=x.flatMap(s=>s.match(/\d+-\d+/g).map(m=>m.split('-').map(Number)));
Y=y.slice(1).map(s=>s.split(',').map(Number));
Y.sum(e=>e.sum(n=>n*X.every(([a,b])=>n<a||n>b)))
```
part 2
```javascript
z=__.split('\n\n');
[x,y]=[z[0].split(/\n/g),z[2].split(/\n/g)];
X=x.flatMap(s=>s.match(/\d+-\d+/g).map(m=>m.split('-').map(Number)));
Y=y.slice(1).map(s=>s.split(',').map(Number));
Y2=Y.filter(e=>e.every(n=>X.some(([a,b])=>n>=a&&n<=b)));
X2=x.map(s=>[s.match(/^[^:]+/)[0],s.match(/\d+-\d+/g).map(m=>m.split('-').map(Number))]);
l={};
for([k,[[n1,x1],[n2,x2]]] of X2){
l[k]=new Set(Array(X2.length).fill().map((_,i)=>i).filter(i=>Y2.every(e=>e[i]>=n1&&e[i]<=x1||e[i]>=n2&&e[i]<=x2)))
}
for(i=0;i<X2.length;i++){
for(k in l){
if(l[k].size==1){
n=[...l[k]][0];
l[k]=n;
for(k in l){if(l[k] instanceof Set){l[k].delete(n);}
}
}
}
}
p=1;for(k in l){if(/departure/.test(k))p*=z[1].split('\n')[1].split(',')[l[k]]}p;l
```
# day 17
part 1
```javascript
idcs=Array(27).fill().map((_,i)=>[((i/9)|0)-1,((i/3)|0)%3-1,i%3-1]).filter(([a,b,c])=>a||b||c);
console.log(idcs);
step=a=>{a=[[...['.'.repeat(a[0][0].length+2)].repeat(a[0].length+2)],...a.map(b=>['.'.repeat(b[0].length+2),...b.map(l=>'.'+l+'.'),'.'.repeat(b[0].length+2)]),[...['.'.repeat(a[0][0].length+2)].repeat(a[0].length+2)]];return a.map((b,i)=>b.map((l,j)=>l.map((ch,k)=>{
c=idcs.map(([x,y,z])=>((a[i+x]||[])[j+y]||[])[k+z]).count('#');
return c===3?'#':c<2||c>3?'.':ch;
}).join('')))}
stepn=(a,n)=>{for(i=0;i<n;i++){console.log(a+'');a=step(a)}return a}
s=stepn([_],6);
s.join('\n').count('#')
```
part 2
```javascript
idcs=Array(81).fill().map((_,i)=>[((i/27)|0)-1,((i/9)|0)%3-1,((i/3)|0)%3-1,i%3-1]).filter(([a,b,c,d])=>a||b||c||d);
step=a=>{a=[[...[[...['.'.repeat(a[0][0][0].length+2)].repeat(a[0][0].length+2)]].repeat(a[0].length+2)],...a.map(b=>[[...['.'.repeat(b[0][0].length+2)].repeat(b[0].length+2)],...b.map(c=>['.'.repeat(c[0].length+2),...c.map(l=>'.'+l+'.'),'.'.repeat(c[0].length+2)]),[...['.'.repeat(b[0][0].length+2)].repeat(b[0].length+2)]]),[...[[...['.'.repeat(a[0][0][0].length+2)].repeat(a[0][0].length+2)]].repeat(a[0].length+2)]];console.log(a);
return a.map((b,i)=>b.map((c,j)=>c.map((m,k)=>m.map((ch,l)=>{
c=idcs.reduce((c,[x,y,z,w])=>c>3?c:c+((((a[i+x]||[])[j+y]||[])[k+z]||[])[l+w]==='#'),0);
return c===3?'#':c<2||c>3?'.':ch;
}).join(''))))}
stepn=(a,n)=>{for(i=0;i<n;i++){a=step(a)}return a}
s=stepn([[_]],6);
(s+'').count('#')
//s=stepn(_.flatMap((l,i)=>l.flatMap((ch,j)=>ch=='#'?[0,0,i,j]:[])),6);
```
# day 18
part 1
```javascript
eval=s=>{
m=['(',...s.match(/[()+*]|\d+/g),')'];
stack=[];
stacks=[stack];
ops=[];
curr=null;
while(v=m.shift()){
switch(v){
case'(':stacks.push(stack=[]);break;
case')':
if(stack.length>1){right=stack.pop();
left=stack.pop();
switch(ops.pop()){
case'+':stack.push(left+right);break;
case'*':stack.push(left*right);break;
}}(stack=stacks[stacks.length-2]).push(stacks.pop()[0]);break;
case'+':
case'*':
if(stack.length>1){right=stack.pop();
left=stack.pop();
switch(ops.pop()){
case'+':stack.push(left+right);break;
case'*':stack.push(left*right);break;
}}ops.push(v);break;
default:stack.push(+v);break;
}
}
return stack[0]
}
_.map(eval).sum()
```
part 2
```javascript
eval=s=>{
m=['(',...s.match(/[()+*]|\d+/g),')'];
stack=[];
stacks=[stack];
ops=[];
curr=null;
while(v=m.shift()){
switch(v){
case'(':stacks.push(stack=[]);break;
case')':
while(stack.length>1){right=stack.pop();
left=stack.pop();
switch(ops.pop()){
case'+':stack.push(left+right);break;
case'*':stack.push(left*right);break;
}}(stack=stacks[stacks.length-2]).push(stacks.pop()[0]);break;
case'+':
case'*':
while(stack.length>1&&(v=='*'||ops[ops.length-1]=='+')){right=stack.pop();
left=stack.pop();
switch(ops.pop()){
case'+':stack.push(left+right);break;
case'*':stack.push(left*right);break;
}}ops.push(v);break;
default:stack.push(+v);break;
}
}
return stack[0]
}
_.map(eval).sum()
```
# day 19
part 1
```javascript
d={};
seq=(b,a)=>{
let its=b.split(' ').map(Number);
return(s,i=0,t=1)=>its.reduce((r,n,j)=>r!==null?d[n](s,r,t&&(j===its.length-1)):r,i)
}
alts=(b,a)=>{
let seqs=b.split(' | ').map(x=>seq(x,a));
return(s,i=0,t=1)=>seqs.reduce((r,m)=>r===null?m(s,i,t):r,null)
}
[I,M]=__.split('\n\n').map(s=>s.split('\n'));
I.map(s=>s.split(': ')).map(([a,b])=>{
let r=b.includes('"')?JSON.parse(b):null;
d[+a]=b.includes('"')?((s,i=0,t=1)=>(((s[i]===r)&&((i===s.length-1)||!t))?i+1:null)):
alts(b,a)
});
M.count(m=>d[0](m))
```
part 2
```javascript
d={};
seq=(b,a)=>{
let its=b.split(' ').map(Number);
let bs=b.split(' ');
let f=function*(s,i=0,j=0){for(const i2 of d[its[j]](s,i)){if(j===its.length-1)yield i2;else yield*f(s,i2,j+1);}}
return f;
}
alts=(b,a)=>{
let seqs=b.split(' | ').map(x=>seq(x,a));
let bs=b.split(' | ');
return function*(s,i=0){for(const m of seqs)yield*m(s,i)}
}
[I,M]=__.split('\n\n').map(s=>s.split('\n'));
I.map(s=>s.split(': ')).map(([a,b])=>{
let r=b.includes('"')?JSON.parse(b):null;
d[+a]=b.includes('"')?function*(s,i=0){yield*s[i]===r?[i+1]:[]}:
alts(b,a)
});
d[8]=alts('42 | 42 8','8');
d[11]=alts('42 31 | 42 11 31','11');
M.count(m=>{i=d[0](m);return [...i].includes(m.length)})
```
# day 20
part 1
```javascript
A=__.split('\n\n').map(s=>{a=s.replace(/\./g,0).replace(/#/g,'1').split('\n');return[+a[0].match(/\d+/)[0],a.slice(1)]});
rev=n=>parseInt([...n.toString(2).padStart(A[0][1].length,0)].reverse().join(''),2)
S=A.map((([n,a])=>[n,parseInt(a[0],2),parseInt(a[a.length-1],2),parseInt(a.map(s=>s[0]).join(''),2),parseInt(a.map(s=>s[s.length-1]).join(''),2)]));
p=1;for(const[n,u,d,l,r]of S){
let um,dm,lm,rm;
const[ru,rd,rl,rr_]=[u,d,l,r].map(rev);
for(const[nn,uu,dd,ll,rr] of S){
if(n!==nn){
if([uu,dd,ll,rr].includes(u)||[uu,dd,ll,rr].includes(ru))um=true;
if([uu,dd,ll,rr].includes(d)||[uu,dd,ll,rr].includes(rd))dm=true;
if([uu,dd,ll,rr].includes(l)||[uu,dd,ll,rr].includes(rl))lm=true;
if([uu,dd,ll,rr].includes(r)||[uu,dd,ll,rr].includes(rr_))rm=true;
}
}
if((!um||!dm)&&(!lm||!rm))p*=n}
for(k in Adj){if((!('u' in Adj[k])||!('d' in Adj[k]))&&(!('l' in Adj[k])||!('r' in Adj[k])))rar.push(k);}
p
```
part 2
```javascript
A=__.split('\n\n').map(s=>{a=s.replace(/\./g,0).replace(/#/g,'1').split('\n');return[+a[0].match(/\d+/)[0],a.slice(1)]});
SZ=A[0][1].length;OFS=1;
rev=n=>parseInt([...n.toString(2).padStart(SZ,0)].reverse().join(''),2)
TILES={};
A.forEach(([n,a])=>TILES[n]=a)
S=A.map((([n,a])=>[n,parseInt(a[0],2),parseInt([...a[a.length-1]].reverse().join(''),2),parseInt(a.map(s=>s[0]).reverse().join(''),2),parseInt(a.map(s=>s[s.length-1]).join(''),2)]));
D={};
find=[]
rar=[];
for(const[n,u,d,l,r]of S){
let adj=D[n]={};
let um,dm,lm,rm;
const[ru,rd,rl,rr_]=[u,d,l,r].map(rev);
for(const[nn,uu,dd,ll,rr] of S){
if(n!==nn){
if([uu,dd,ll,rr].includes(u))adj.u=[nn,!false];
if([uu,dd,ll,rr].includes(ru))adj.u=[nn,!true];
if([uu,dd,ll,rr].includes(d))adj.d=[nn,!false];
if([uu,dd,ll,rr].includes(rd))adj.d=[nn,!true];
if([uu,dd,ll,rr].includes(l))adj.l=[nn,!false];
if([uu,dd,ll,rr].includes(rl))adj.l=[nn,!true];
if([uu,dd,ll,rr].includes(r))adj.r=[nn,!false];
if([uu,dd,ll,rr].includes(rr_))adj.r=[nn,!true];
}
}
}
flipped=false;
function rot(k){
let{u,d,l,r}=D[k];
D[k]={u:r,r:d,d:l,l:u};
TILES[k]=A[0][1].map((_,i)=>A[0][1].map((_,j)=>TILES[k][j][SZ-1-i]).join(''))
}
function flipr(k){
let{u,d,l,r}=D[k];
D[k]={u:d?[d[0],!d[1]]:undefined,d:u?[u[0],!u[1]]:undefined,l:l?[l[0],!l[1]]:undefined,r:r?[r[0],!r[1]]:undefined};
TILES[k]=TILES[k].reverse();
}
function flipc(k){
let{u,d,l,r}=D[k];
D[k]={u:u?[u[0],!u[1]]:undefined,d:d?[d[0],!d[1]]:undefined,l:r?[r[0],!r[1]]:undefined,r:l?[l[0],!l[1]]:undefined};
TILES[k]=TILES[k].map(s=>[...s].reverse().join(''));
}
queue=[];
done={};
for(k in D){let adj=D[k];if((!adj.u||!adj.d)&&(!adj.l||!adj.r)){
const curr=k;
console.log(curr, JSON.stringify(adj), D);
if(!adj.u){if(!adj.l);
if(!adj.r){rot(curr);}}
if(!adj.d){if(!adj.l){rot(curr);rot(curr);rot(curr);}
if(!adj.r){rot(curr);rot(curr);}}
adj=D[curr];
console.log(curr, JSON.stringify(adj), D);
done[curr]=done[adj.r[0]]=done[adj.d[0]]=true;
queue.push([curr,'r',adj.r[0],adj.r[1],0,SZ-2*OFS,0]);
queue.push([curr,'d',adj.d[0],0,adj.d[1],0,SZ-2*OFS]);
image=TILES[curr].slice(OFS,SZ-OFS).map(l=>l.slice(OFS,SZ-OFS));
break}}
//console.log(image.join('\n'));
//TODO: does derot switch flipness? doubt it tbh
while(queue.length){
//console.log(queue.length);
console.log(JSON.stringify(queue));
const[prev,dir,curr,doflipr,doflipc,x,y]=queue.shift();console.log(x,y,curr,prev);
let tgt=({r:'l',l:'r',u:'d',d:'u'})[dir];
while((D[curr][tgt]||[])[0]!=prev){//console.log(tgt,curr,JSON.stringify(D[curr]),prev,JSON.stringify(D[prev]),'\n\n'+TILES[curr].join('\n'),'\n\n'+image.join('\n'));if(queue.length>3)throw'';
rot(curr);//console.log(prev,JSON.stringify(D[curr]));
}
if(doflipr)flipr(curr);
if(doflipc)flipc(curr);
for(let i=0;i<SZ-2*OFS;i++){
while(image.length<=y+i){image.push('_'.repeat(x+SZ-2*OFS));}
image[y+i]=image[y+i].slice(0,x)+TILES[curr][i+OFS].slice(OFS,SZ-OFS)+image[y+i].slice(x+SZ-2*OFS);
}
//console.log(flipped,x,y,'\n\n'+TILES[curr].join('\n'),'\n\n'+image.join('\n'));if(queue.length>2)throw'';
const adj=D[curr];
//console.log(curr,adj.r,adj.d);
console.log('===adj===',JSON.stringify(adj),image.join('\n'));
if(adj.r&&!(adj.r[0] in done)){queue.push([curr,'r',adj.r[0],adj.r[1],0,x+SZ-2*OFS,y]);done[adj.r[0]]=true;}
if(adj.d&&!(adj.d[0] in done)){queue.push([curr,'d',adj.d[0],0,adj.d[1],x,y+SZ-2*OFS]);done[adj.d[0]]=true;}
//console.log(image.join('\n'),JSON.stringify(queue));
}
console.log(image.length,image.map(s=>s.length))
console.log(image.join('').length/(SZ-2*OFS)**2)
console.log(image.join('\n').replace(/0/g,' ').replace(/1/g,'#'))
fsm=image=>{let c=0;
for(let i=0;i<image.length-2;i++){for(let j=0;j<image[0].length-19;j++){
if([[0,1],[1,2],[4,2],[5,1],[6,1],[7,2],[10,2],[11,1],[12,1],[13,2],[16,2],[17,1],[18,0],[18,1],[19,1]].every(([x,y])=>image[i+y][j+x]==1))c++;
}}
return c}
rough=undefined,fsms=0;
console.log('tot',image.join('').count('1'))
for(rot=0;rot<4;rot++){
if(fsms=fsm(image)){rough=image.join('').count('1')-fsms*15;break}
// TODO: rotate
image=image[0].map((_,i)=>image[0].map((_,j)=>image[j][image[0].length-1-i]).join(''));
}if(!rough){
image=image.reverse();
for(rot=0;rot<4;rot++){
if(fsms=fsm(image)){rough=image.join('').count('1')-fsms*15;break}
image=image[0].map((_,i)=>image[0].map((_,j)=>image[j][image[0].length-1-i]).join(''));
}
}
[rough,fsms,rough+fsms*15]
/*
0123456789012345678901234567
aaaaaaaaaa cccccccccc
bbbbbbbbbb
slice(0,9)+str+slice(10+10-1)
*/
```
# day 21
part 1
```javascript
A=_.map(s=>(s.slice(0,-1).split(' (contains '))).map(([a,b])=>[a.split(' '), b.split(', ')]);
Als=new Set();Ings=new Set();AI={};IA={};
for(const[ings,alss]of A){for(const ing of ings)Ings.add(ing);for(const al of alss)Als.add(al)}
for(const ing of Ings){loop:for(const al of Als){
for(const[ings,alss]of A){
if(!ings.includes(ing)&&alss.includes(al))continue loop;
}
IA[ing]=al;
AI[al]=ing;
}}
A.sum(([ings])=>ings.count(ing=>!(ing in IA)))
```
part 2
```javascript
A=_.map(s=>(s.slice(0,-1).split(' (contains '))).map(([a,b])=>[a.split(' '), b.split(', ')]);
Als=new Set();Ings=new Set();AI={};IA={};
for(const[ings,alss]of A){for(const ing of ings)Ings.add(ing);for(const al of alss)Als.add(al)}
for(const ing of Ings){loop:for(const al of Als){
for(const[ings,alss]of A){
if(!ings.includes(ing)&&alss.includes(al))continue loop;
}
(IA[ing]=IA[ing]||new Set()).add(al);
AI[al]=ing;
}}
IA
for(i=0;i<100;i++){
for(const k in IA){
if(IA[k].size===1){
let alg=[...IA[k]][0];
for(const l in IA){if(l!=k&&IA[l].delete)IA[l].delete(alg);}
IA[k]=alg;
}
}
}
A.sum(([ings])=>ings.count(ing=>!(ing in IA)));
Arr=[];for(k in IA){Arr.push([k,IA[k]]);}
Arr.sort(([a,b],[c,d])=>b>d?1:b<d?-1:0).map(([a])=>a).join(',')
```
# day 22
part 1
```javascript
[P1,P2]=__.split('\n\n').map(s=>s.split('\n').slice(1).map(Number));
while(P1.length&&P2.length){c1=P1.shift();c2=P2.shift();if(c1>c2){P1.push(c1);P1.push(c2);}else{P2.push(c2);P2.push(c1);}}
P1.length?P1.reduce((p,c,i)=>p+c*(P1.length-i),0):P2.reduce((p,c,i)=>p+c*(P2.length-i),0)
```
part 2
```javascript
[OP1,OP2]=__.split('\n\n').map(s=>s.split('\n').slice(1).map(Number));
function rc(P1,P2){
const cache = new Set();
while(P1.length&&P2.length){
const s=JSON.stringify([P1,P2]);
if(cache.has(s)){return[P1,1]}else{cache.add(s)}
let c1=P1.shift();let c2=P2.shift();
if(P1.length>=c1&&P2.length>=c2){let [_,winner2]=rc(P1.slice(0,c1),P2.slice(0,c2));if(winner2===1){P1.push(c1);P1.push(c2);}else{P2.push(c2);P2.push(c1);}}
else if(c1>c2){P1.push(c1);P1.push(c2);}else{P2.push(c2);P2.push(c1);}}
return P1.length<1?[P2,2]:[P1,1]
}
[W,winner]=rc(OP1.slice(),OP2.slice());
W.reduce((p,c,i)=>p+c*(W.length-i),0)
```
# day 23
part 1
```javascript
I=[...__].map(Number)
L=I.length;
j=0;for(i=0;i<100;i++){
let f=I.splice(0,1)[0],slc=I.splice(0,3),nxt=f-1||L;
while(slc.includes(nxt))nxt=nxt-1||L;
I.splice(I.indexOf(nxt)+1,0,...slc);
I.push(f);
}
I.join('')
```
part 2
```javascript
I=[...__].map(Number)
//I=[...'389125467'].map(Number)
while(I.length<(L=1000000))I.push(I.length+1);
D=Array(L+1)
for(const [el,nx] of I.zip(I.slice(1).concat([I[0]])))D[el]=nx;
j=I[0];for(i=0;i<10000000;i++){//console.log(D+'')
let slc=[D[j],D[D[j]],D[D[D[j]]]],nxt=j-1||L
//console.log(slc+'')
while(slc.includes(nxt))nxt=nxt-1||L
//console.log('n',nxt,D[nxt],'s2',slc[2],D[slc[2]],'s0',slc[0],D[slc[0]])
;[D[nxt],D[slc[2]],D[j]]=[slc[0],D[nxt],D[slc[2]]]
//console.log('d',D+'')
j=D[j]
}
D[1]*D[D[1]]
```
# day 24
part 1
```javascript
M={};_.map(l=>{co=l.match(/[ns]?[ew]/g).reduce(([i,j],d)=>
d==='w'?[i-1,j]:
d==='e'?[i+1,j]:
d==='nw'?[i,j-1]:
d==='ne'?[i+1,j-1]:
d==='sw'?[i-1,j+1]:
d==='se'?[i,j+1]:[i,j]
,[0,0]);M[co]=!M[co]})
c=0;for(k in M)if(M[k])c++;
c
```
part 2
```javascript
M={};_.map(l=>{co=l.match(/[ns]?[ew]/g).reduce(([i,j],d)=>
d==='w'?[i-1,j]:
d==='e'?[i+1,j]:
d==='nw'?[i,j-1]:
d==='ne'?[i+1,j-1]:
d==='sw'?[i-1,j+1]:
d==='se'?[i,j+1]:[i,j]
,[0,0]);M[co]=+!M[co]});
ni=nj=1/0;xi=xj=-1/0;
for(k in M){let[i,j]=k.split(',').map(Number);if(i<ni)ni=i;if(i>xi)xi=i;if(j<nj)nj=j;if(j>xj)xj=j;}
for(I=0;I<100;I++){
console.log(I)
ni--;
nj--;
xi++;
xj++;
M2={}
for(let i=ni;i<=xi;i++){
for(let j=nj;j<=xj;j++){
c=(M[[i-1,j]]||0)+(M[[i+1,j]]||0)+(M[[i,j-1]]||0)+(M[[i+1,j-1]]||0)+(M[[i-1,j+1]]||0)+(M[[i,j+1]]||0);
if(M[[i,j]]){
if(c===0||c>2){}else{M2[[i,j]]=1}
}else{
if(c===2){M2[[i,j]]=1}
}
}
}
M=M2
}
c=0;for(k in M)if(M[k])c++;
c
```
# day 25
part 1
```javascript
deloop=(n,t)=>{let v=1;let i=0;while(v!==t){v=v*n%20201227;i++}return i}
enloop=(n,x)=>{let v=1;for(let i=0;i<x;i++)v=v*n%20201227;return v}
d=deloop(7,+_[0]);
c=deloop(7,+_[1]);
[enloop(+_[0],c),enloop(+_[1],d)]
```
part 2
```javascript
// this is very difficult. took me at least 30 seconds to do.
```