AdventOfCode2022/07
2023-12-09 13:46:15 +01:00
..
day7.sh renamed because github is stupid 2022-12-11 02:26:42 +01:00
README.md update readmes 2023-12-09 13:46:15 +01:00

Day 7

🎁🎁🎁🎁🎁🎁🎁

Today's language: Bash + Awk

Lines of code: 53

Execution time: 0,039 s

The protagonist is stupid

The way the challenge is laid out is absolutely ridiculus; both tasks could be done in one-liners on a Linux machine (which the device from the challenge probably is) in any POSIX shell, if the user wasn't as stupid as our protagonist...

That's why I wrote a bash script that actually creates the whole filesystem from the input-file. It does so (by default) in /tmp. The sizes for the files are only allocated, so that du shows the filesize. No actual write operations are taking place, which makes recreating the file structure pretty fast.

And so am I?

The problem is, that (even empty) directories have a size, which also increases with every file and subdirectory in it. That's why I needed to calculate the sizes of the directories without the actual file sizes and subtract that from the output of du. This new output can then be piped into an awk one-liner. In reality, this problem wouldn't exist since you would want the total size of a directory anyway.

If the size of the directories themselves would not matter, the commands would be:

# Task 1
du -b / | awk 'BEGIN{sum=0} {if ($1 <= 100000) {sum+=($1)}} END{print "Total size of all dirs<100000: "sum-0}'
# Task 2: min_size = (Update size) - (file system size) - (used size)
du -b / | awk 'BEGIN{file=""; size=99999999} {if ($1 >= min_size && $1 < size) {size=$1; file=$2}} END{print "You should delete "file" size("size")"}'

Run today's code

./day7.sh output.txt