From 16da47600c7a6b61bf9ad92887c51c79f758db47 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Fri, 9 Dec 2022 20:34:05 +0100 Subject: [PATCH] 2022 day 7: clean bash code & remove file size info (50% speed) --- 2022/RESULTS.txt | 14 ++++++++++++++ 2022/day07/aoc.bash | 45 ++++----------------------------------------- 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/2022/RESULTS.txt b/2022/RESULTS.txt index d2c48ae..bdd835c 100644 --- a/2022/RESULTS.txt +++ b/2022/RESULTS.txt @@ -129,3 +129,17 @@ aoc.bash: res=2260 aoc-c: res=2260 time: 0:00.00 real, 0.00 user, 0.00 sys context-switch: 0+1, page-faults: 0+87 + +========================================= +================= day07 ================= +========================================= + ++++++++++++++++++ part 1 +aoc.bash: res=1390824 + time: 0:00.10 real, 0.07 user, 0.03 sys + context-switch: 8+1, page-faults: 0+312 + ++++++++++++++++++ part 2 +aoc.bash: res=7490863 + time: 0:00.10 real, 0.08 user, 0.01 sys + context-switch: 8+1, page-faults: 0+317 diff --git a/2022/day07/aoc.bash b/2022/day07/aoc.bash index f60fabb..ba25c72 100755 --- a/2022/day07/aoc.bash +++ b/2022/day07/aoc.bash @@ -13,31 +13,18 @@ . common.bash -declare -A files=() # list of files in dir declare -A sizes=() # file size declare -A dirs=() # directories declare -a lines # shell lines declare -i curline=0 # current line in shell declare curdir -print_sizes() { - local idx - echo +++++++++++++++++++ - for idx in "${!sizes[@]}"; do - printf "size(%s)=%d\n" "$idx" "${sizes[$idx]}" - done - echo +++++++++++++++++++ -} - do_cd() { local dir="$1" - echo ">>> $curline ${lines[$curline]}" case "$dir" in "..") - echo ".. before: $curdir" curdir=${curdir%/*} [[ -z $curdir ]] && curdir="/" - echo ".. after: $curdir" ;; "/") curdir="/" @@ -47,37 +34,25 @@ do_cd() { curdir+="$dir" esac dirs[$curdir]="$curdir" - echo "> CD $dir newdir=$curdir" } do_ls() { - local info file subdir remain - echo ">>> $curline ${lines[$curline]}" + local info file remain ((curline++)) while [[ $curline -lt ${#lines[@]} && ${lines[$curline]:0:1} != "\$" ]]; do read -r info file <<< "${lines[$curline]}" - files[$curdir]+="$file" if [[ $info != dir ]]; then # file remain="$curdir/$file" remain=${remain//+(\/)/\/} - #sizes[$fullname]=$info - # recurse up curdir and adjust sizes - #subdir=${curdir} - echo "info=$info [$remain]" - while [[ -n $remain ]]; do - echo "remain=$remain subdir=$subdir" + while [[ -n $remain ]]; do # recurse up curdir and adjust sizes ((sizes[$remain] += info)) remain=${remain%/*} - subdir=${remain##*/} - echo " -> remain=$remain subdir=$subdir" done (( sizes["/"] += info )) fi - echo "ls: ${lines[$curline]}" ((curline++)) done ((curline--)) - print_sizes } parse() { @@ -87,10 +62,6 @@ parse() { while ((curline < ${#lines[@]})); do read -ra line <<< "${lines[$curline]}" - if [[ "${line[0]}" != "\$" ]]; then - printf "ERROR line %d = %s\n" "$curline" "${lines[$curline]}" - exit 1 - fi case "${line[1]}" in "cd") do_cd "${line[2]}" @@ -100,7 +71,6 @@ parse() { ;; esac ((curline++)) - printf "WARNING curline=%d\n lines=%d\n" "$curline" "${#lines[@]}" done } @@ -111,23 +81,16 @@ solve() { if ((part == 1)); then for dir in "${dirs[@]}"; do - printf "size(%s)=%d\n" "$dir" "${sizes[$dir]}" - if ((sizes[$dir] <= 100000 )); then - ((res+=sizes[$dir])) - fi + ((sizes[$dir] <= 100000 )) && ((res+=sizes[$dir])) done else + (( res = sizes["/"] )) (( needed = sizes["/"] - (70000000-30000000) )) - printf "remain=%d\n" "$needed" - ((res = sizes["/"])) for dir in "${!dirs[@]}"; do - #printf "size(%s)=%d\n" "$dir" "${sizes[$dir]}" if (( sizes[$dir] >= needed )); then - printf "dir %s (%d) will free enough res=%d\n" "$dir" "${sizes[$dir]}" "$res" if (( sizes[$dir] <= res )); then mindir=$dir ((res = sizes[$mindir])) - printf "new mindir=%s (%d)\n" "$mindir" "$res" fi fi done