Skip to content

Commit 485f46d

Browse files
committed
Add source files
1 parent e1e95f3 commit 485f46d

27 files changed

+760
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.txt*

01.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#! /usr/bin/env bash
2+
input=${1:-1.txt}
3+
A=($(sort -n $input));
4+
for a in ${A[@]}; do grep -wq $((2020-a)) $input && break; done
5+
echo "1A: $((2020-a)) + $a = $(((2020-a)*a))"
6+
b=:; for a in ${A[@]};do for i in ${A[@]}; do grep -wq $((2020-a-i)) $input && b=break; $b ; done; $b; done
7+
echo "1B: $((2020-a-i)) + $a + $i = $(((2020-a-i)*a*i))"

02.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#! /usr/bin/env bash
2+
ans=0
3+
IFS=$'-:\ \n'
4+
while read m M b c; do x=${c//[^$b]}; [[ ${#x} -ge $m && ${#x} -le $M ]] && ans=$((ans+1)); done < ${1:-2.txt}
5+
echo "2A: $ans"
6+
ans=0
7+
while read m M b c; do x=${c:$((m-1)):1}; y=${c:$((M-1)):1}; [[ $x != $y ]] && [[ $b == $x || $b == $y ]] && ans=$((ans+1)); done < ${1:-2.txt}
8+
echo "2B: $ans"

03.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#! /usr/bin/env bash
2+
A=($(< ${1:-3.txt})); l=${#A[0]}; k=0; j=3; total=1; x=""
3+
for i in ${A[@]}; do x+=${i:k:1}; k=$(((k+j)%l)); done; x=${x//\.}
4+
echo "3A: ${#x}"
5+
idx2=$(seq 0 2 $((${#A[@]}-1)))
6+
for j in 1 3 5 7; do x=""; k=0; for i in ${A[@]}; do x+=${i:k:1}; k=$(((k+j)%l)); done; x=${x//\.}; total+="*${#x}"; done
7+
for j in 1; do x=""; k=0; for i in $idx2; do x+=${A[i]:k:1}; k=$(((k+j)%l)); done ; x=${x//\.}; total+="*${#x}"; done
8+
echo "3B: ${total:2} = $((total))"

04.sh

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#! /usr/bin/env bash
2+
X='epEhbiH'; x=$X; ans=""
3+
IFS=$'\r\n\ '
4+
A=($(sed s/^$/XXX/ ${1:-4.txt}))
5+
for i in "${A[@]}" XXX; do
6+
case $i in
7+
ecl:*) x=${x/e};;
8+
pid:*) x=${x/p};;
9+
eyr:*) x=${x/E};;
10+
hcl:*) x=${x/h};;
11+
byr:*) x=${x/b};;
12+
iyr:*) x=${x/i};;
13+
hgt:*) x=${x/H};;
14+
cid:*) : ;;
15+
XXX) [ -z "$x" ] && ans+=1; x=$X;;
16+
esac
17+
done
18+
echo "4A: ${#ans}"
19+
x=$X; ans=""
20+
for i in "${A[@]}" XXX; do
21+
k=${i/*:}
22+
case $i in
23+
ecl:amb|ecl:blu|ecl:brn|ecl:gry|ecl:grn|ecl:hzl|ecl:oth) x=${x/e};;
24+
pid:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) x=${x/p};;
25+
eyr:[0-9][0-9][0-9][0-9]) [[ $k -ge 2020 && $k -le 2030 ]] && x=${x/E};;
26+
hcl:\#[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]) x=${x/h};;
27+
byr:[0-9][0-9][0-9][0-9]) [[ $k -ge 1920 && $k -le 2002 ]] && x=${x/b};;
28+
iyr:[0-9][0-9][0-9][0-9]) [[ $k -ge 2010 && $k -le 2020 ]] && x=${x/i};;
29+
hgt:[0-9][0-9]in) [[ ${k:0:2} -ge 59 && ${k:0:2} -le 76 ]] && x=${x/H};;
30+
hgt:1[0-9][0-9]cm) [[ ${k:0:3} -ge 150 && ${k:0:3} -le 193 ]] && x=${x/H};;
31+
cid:*) : ;;
32+
XXX) [ -z "$x" ] && ans+=1; x=$X;;
33+
esac
34+
done
35+
echo "4B: ${#ans}"

05.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#! /usr/bin/env bash
2+
A=($(cat ${1:-5.txt} | tr 'FBLR' '0101' | sort -nr))
3+
echo "5A: $((2#$A))"
4+
j=; for i in ${A[@]}; do [[ ${j: -1} == ${i: -1} ]] && echo "5B: $((2#$j-1))=$((2#$i+1))"; j=$i; done

06.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#! /usr/bin/env bash
2+
X=abcdefghijklmnopqrstuvwxyz; x=$X; j=-; a=0
3+
A=($(sed s/^$/X/ ${1:-6.txt}))
4+
while read -n1 i; do
5+
[ "$i" = X ] && a=$((a+26-${#x})) && x=$X
6+
x=${x/$i}
7+
done < <(echo ${A[*]} X)
8+
echo "6A: $a";
9+
10+
x=""; a=0
11+
for line in "${A[@]}" X; do
12+
if [[ "$line" = X ]]; then a=$((a+${#x})); x=X;
13+
elif [ "$x" = X ]; then x=$line;
14+
else
15+
y=""; while read -n1 i; do [[ ${x/$i} != ${x} ]] && y+="$i"; done <<< $line
16+
# y="";for ((i=0;i<${#line};i++ )); do [[ ${x/${line:$i:1}} != ${x} ]] && y+="${line:$i:1}"; done
17+
x=$y;
18+
fi
19+
done
20+
echo "6B: $a"

07.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#! /usr/bin/env bash
2+
IFS=$'\n'
3+
input=${1:-7.txt}
4+
NEW=($(grep " shiny gold" $input))
5+
FOUND=("${NEW[@]// bag*}")
6+
BAGS=("${NEW[@]}")
7+
while [ ${#FOUND[@]} != 0 ]; do
8+
NEW=($(grep -F "${FOUND[*]}" $input | grep -v -F "${BAGS[*]}" | sort -u))
9+
BAGS+=("${NEW[@]}")
10+
FOUND=("${NEW[@]// bag*}")
11+
done
12+
echo "7A: ${#BAGS[@]}"
13+
r(){
14+
local A=() a=${1// *} b=0 c=0
15+
A=($(grep ^${1:2} $input | grep -o "[0-9] [a-z]* [a-z]*"))
16+
for i in "${A[@]}"; do c=$(r $i); b=$((b+c)); done
17+
echo $(($a+$a*$b))
18+
}
19+
total=$(r "1 shiny gold")
20+
echo "7B: $((total-1))" # minus 1 shiny gold bag

08.sh

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#! /usr/bin/env bash
2+
IFS=$'\n'
3+
A=($(< ${1:-8.txt}))
4+
B=("${A[@]}")
5+
solve8() {
6+
acc=0; i=0;
7+
while true; do
8+
x=${A[i]}; y=${x/* }; A[i]+=DONE
9+
case "$x" in
10+
*DONE) return 1;;
11+
acc*) acc=$((acc+($y))); i=$((i+1));;
12+
jmp*) i=$((i+($y)));;
13+
nop*) i=$((i+1)) ;;
14+
*) echo "ERROR $i: $x"; return 1;;
15+
esac
16+
[[ $i -ge ${#A[@]} ]] && return 0
17+
done
18+
}
19+
solve8 || echo "8A: $acc"
20+
21+
A=("${B[@]}");
22+
for k in ${!A[@]}; do
23+
if [ ${A[k]:0:3} = nop ]; then A[k]=${A[k]/nop/jmp};
24+
elif [ ${A[k]:0:3} = jmp ]; then A[k]=${A[k]/jmp/nop};
25+
else continue; fi
26+
solve8 && break
27+
A=("${B[@]}")
28+
done
29+
[[ $i -ge ${#A[@]} ]] && echo "8B: $acc"
30+

09.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#! /usr/bin/env bash
2+
A=($(< ${1:-9.txt}))
3+
idx=(${!A[@]})
4+
for i in ${idx[@]:25}; do
5+
b=:
6+
for j in ${idx[@]:i-25:25-1}; do
7+
[ ${A[j]} -ge ${A[i]} ] && continue
8+
for k in ${idx[@]:j+1:i-j-1}; do
9+
[[ $((${A[j]}+${A[k]})) == ${A[i]} ]] && b=break; $b
10+
done
11+
$b
12+
done
13+
[ "$b" = ":" ] && echo "9A: line $i = ${A[i]}" && break
14+
done
15+
16+
k=0; j=0; sum=${A[j++]}
17+
while [ $sum != ${A[i]} ]; do
18+
if [[ $sum -lt ${A[i]} ]]; then sum=$((sum+A[j++]))
19+
elif [[ $sum -gt ${A[i]} ]]; then sum=$((sum-A[k++]))
20+
fi
21+
[[ $j -ge $i ]] && echo NOT FOUND && break
22+
done
23+
IFS=$'\n'
24+
B=($(echo "${A[*]:k:j-k+1}" | sort -n))
25+
echo "9B: $j..$k = $((B+B[${#B[@]}-1]))"

10.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#! /usr/bin/env bash
2+
A=($(sort -n 10.txt))
3+
DIFF=("" "" "" "1") # add 3 for the built-in
4+
j=0; for i in "${A[@]}"; do DIFF[$((i-j))]+=1;j=$i; done
5+
echo "10A: ${#DIFF[1]}*${#DIFF[3]}=$((${#DIFF[1]}*${#DIFF[3]}))"
6+
B=; j=0; for i in "${A[@]}"; do B+=$((i-j)); j=$i; done; B+=3;
7+
C=(${B//3/ }) # only works because there are nothing but 1s and 3s
8+
D=(0 1 2 4 7)
9+
total=1; for i in "${C[@]}"; do total+=*${D[${#i}]}; done
10+
echo "10B: ${total:2} = $((total))"

11.sh

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#! /usr/bin/env bash
2+
A=($(tr "L" "X" < ${1:-11.txt}))
3+
B=(.${A//?/.}.); for i in "${A[@]}"; do B+=(.$i.); done; B+=($B); C=("${B[@]}");
4+
J=$(seq 1 ${#A}); I=$(seq 1 ${#A[@]}); change=($I); round=0
5+
while [ ${#change} != 0 ]; do
6+
change=(); l=
7+
for i in $I; do
8+
for j in $J; do
9+
x=${B[i]:$j:1};
10+
if [[ "$x" == "L" || "$x" == "X" ]]; then
11+
s="${B[i-1]:$((j-1)):3}${B[i]:$((j-1)):1}${B[i]:$((j+1)):1}${B[i+1]:$((j-1)):3}";
12+
s=${s//[L.]/}
13+
if [[ ${#s} == 0 ]]; then x=X; elif [[ ${#s} -ge 4 ]]; then x=L; fi; k=$((k+1))
14+
fi;
15+
l+=$x;
16+
done
17+
[ "${B[i]}" != .$l. ] && change+=($((i-1)) $i $((i+1)))
18+
C[i]=.$l.; l=
19+
done
20+
B=("${C[@]}")
21+
I=$(printf "%s\n" ${change[@]} |sort -u)
22+
[ $((++round)) = 1 ] && B=("${C[@]//X/x}")
23+
#[ $((round%10)) = 0 ] && echo "$round: $((${#change[@]}/3))"
24+
done
25+
ans="${B[*]}"; ans=${ans//[ L.]}
26+
echo "11A: ${#ans}"
27+
28+
#A=($(< ${1:-11.txt}))
29+
B=(L${A//?/L}L); for i in "${A[@]}"; do B+=(L${i}L); done; B+=($B)
30+
J=$(seq ${#A}); I=$(seq ${#A[@]}); change=1; round=0
31+
while [ ${#change} != 0 ]; do
32+
change=""; C=($B); l="";
33+
for i in $I; do
34+
for j in $J; do
35+
x=${B[i]:$j:1};
36+
[[ "$x" != "L" && "$x" != "X" ]] && l+=$x && continue
37+
r=${B[i]:j+1}; r=${r//.}; R=${B[i]:0:j}; R=${R//.}
38+
s=${R: -1}${r:0:1}
39+
k=1; d=${B[i-k]:j-k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i-k]:j-k:1}; done; s+=$d
40+
k=1; d=${B[i-k]:j:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i-k]:j:1}; done; s+=$d
41+
k=1; d=${B[i-k]:j+k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i-k]:j+k:1}; done; s+=$d
42+
k=1; d=${B[i+k]:j-k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i+k]:j-k:1}; done; s+=$d
43+
k=1; d=${B[i+k]:j:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i+k]:j:1}; done; s+=$d
44+
k=1; d=${B[i+k]:j+k:1}; while [ "$d" = '.' ]; do k=$((k+1)); d=${B[i+k]:j+k:1}; done; s+=$d
45+
#[[ ${#s} == 8 ]] || echo "ERROR: ($s) $k = $i, $j"
46+
s=${s//L}
47+
if [[ ${#s} == 0 ]]; then l+=X; elif [[ ${#s} -ge 5 ]]; then l+=L; else l+=$x; fi
48+
done
49+
[ ${B[i]} != L${l}L ] && change+=1
50+
C+=(L${l}L); l=
51+
done
52+
C+=($B); B=("${C[@]}");
53+
[ $((++round)) = 1 ] && B=("${C[@]//X/x}")
54+
#[ $((round%10)) = 0 ] && echo "$round: ${#change}"
55+
done
56+
sum="${B[*]}"; sum=${sum//[ L.]}
57+
echo "11B: ${#sum}"

12.sh

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#! /usr/bin/env bash
2+
A=($(< ${1:-12.txt}))
3+
H=1; X=0; Y=0; D=(N E S W)
4+
for i in "${A[@]}"; do
5+
i=${i/F/${D[H]}}
6+
case $i in
7+
N*) Y+=+${i:1};;
8+
S*) Y+=-${i:1};;
9+
E*) X+=+${i:1};;
10+
W*) X+=-${i:1};;
11+
R*) H=$((((${i:1}/90)+H)%4));;
12+
L*) H=$((((-${i:1}/90)+H)%4));;
13+
*) echo ERROR $i; break;;
14+
esac
15+
done
16+
echo "12A: $((X))+$((Y)) = $(((X<0?-X:X)+(Y<0?-Y:Y)))"
17+
H=1; X=10; Y=1; x=0; y=0
18+
for i in "${A[@]}"; do
19+
case $i in
20+
N*) Y+=+${i:1};;
21+
S*) Y+=-${i:1};;
22+
E*) X+=+${i:1};;
23+
W*) X+=-${i:1};;
24+
F*) x=$((x+${i:1}*(X))); y=$((y+${i:1}*(Y)));;
25+
R90|L270) TMP=$X; X=$((Y)); Y=$((-(TMP)));;
26+
R270|L90) TMP=$X; X=$((-(Y))); Y=$((TMP));;
27+
R180|L180) X=$((-(X)));Y=$((-(Y)));;
28+
*) echo ERROR $i; break;;
29+
esac
30+
done
31+
echo "12B: $((x))+$((y)) = $(((x<0?-x:x)+(y<0?-y:y)))"

13.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#! /usr/bin/env bash
2+
IFS=$',\n'
3+
A=($(sed s/x,//g 13.txt))
4+
time=$A; min=($A 0)
5+
for i in "${A[@]:1}"; do
6+
w=$((i-time%i))
7+
[ $w -lt $min ] && min=($w $i)
8+
done
9+
echo "13A: $min*${min[1]} = $((min*${min[1]}))"
10+
11+
A=($(tail -1 13.txt))
12+
for i in ${!A[@]}; do [ ${A[i]} != x ] && B[$i]=${A[i]} ; done
13+
N=0; step=1
14+
#echo "${!B[@]} => "${B[@]}""
15+
for i in "${!B[@]}"; do
16+
while [ $(( (N+i) % ${B[$i]})) != 0 ]; do N=$((N+step)); done
17+
step=$((step*${B[$i]}))
18+
done
19+
echo "13B: $N"

14.sh

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#! /usr/bin/env bash
2+
IFS=$'\n'
3+
A=($(< ${1:-14.txt}))
4+
for i in "${A[@]}"; do
5+
case $i in
6+
mask*) y=${i//*= }; o=$((2#${y//X/0})); z=$((2#${y//X/1}));;
7+
mem*) y=${i//*= }; eval ${i// =*}=$(((y&z)|o));;
8+
esac
9+
done
10+
sum=$(echo ${mem[*]}| tr ' ' '+')
11+
echo "14A: $((sum))"
12+
13+
r() {
14+
local x=${2/X/0}
15+
if [ "$x" = "$2" ]; then
16+
mem2[$(($1|(2#$x)))]=$3
17+
else
18+
r $1 $x $3
19+
r $1 ${2/X/1} $3
20+
fi
21+
}
22+
23+
IFS=$' []=\n\r'
24+
while read i y _ v; do
25+
case "$i" in
26+
mask*) o=$((2#${y//X/0})); m=${y//1/0}; z=$((~2#${m//X/1}));;
27+
mem*) r $(((y&z)|o)) $m $v;;
28+
esac
29+
done < ${1:-14.txt}
30+
sum=$(echo ${mem2[*]}| tr ' ' '+')
31+
echo "14B: $((sum))"

15.sh

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#! /usr/bin/env bash
2+
A=(${*:-0 12 6 13 20 1 17})
3+
GIVEUP=${1:-10}
4+
#A=(0 3 6)
5+
unset B; i=0; l=""
6+
for a in ${A[@]}; do B[$a]=$((++i)); done
7+
while [ $i -lt 2020 ]; do
8+
n=$((i-${l:-$i})); l=${B[$n]}; B[$n]=$((++i))
9+
done
10+
echo "15A: $n"
11+
12+
sharded_swap() { # syntax: l=B[$1]; B[$1]=$2
13+
# local x="B$(($1>>9))[$(($1&511))]"
14+
local x="B$(($1>>6))[$(($1&63))]"
15+
eval "l=\${$x}; $x=$2"
16+
}
17+
18+
i=0; for a in ${A[@]}; do sharded_swap $a $((++i)); done; l="";
19+
while [[ $i -lt 30000000 && $SECONDS -le $GIVEUP ]]; do
20+
n=$((i-${l:-$i})); sharded_swap $n $((++i))
21+
[ $((i%100000)) = 0 ] && echo "$i: $SECONDS sec"
22+
done
23+
if [ $i = 30000000 ]; then
24+
echo "15B: $n"
25+
else
26+
# The code above would take days or weeks to run. Switch to awk
27+
echo "$n Gave up after $SECONDS seconds after round ${i}"
28+
printf "%s\n" ${A[@]} | awk '{B[$0]=++i;}
29+
END {
30+
while (i<30000000) { n=l?(i-l):0; l=B[n]; B[n]=++i; }
31+
print "15B(awk):", n;
32+
}'
33+
fi

0 commit comments

Comments
 (0)