Advertisement
SadBunny

AOC 2021 Day 14 Part 1+2 AWK

Dec 14th, 2021 (edited)
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Awk 1.49 KB | None | 0 0
  1. #!/bin/gawk -f
  2. { # Parse all lines of stdin
  3.         if ( NR == 1) {
  4.                 for (i=1; i<=length($0)-1; i++) {
  5.                         parr[substr($0, i, 2)] += 1; # E.g. for NNCB: parr["NN"] = 1; parr["NC"] = 1, parr["CB"] = 1
  6.                         letters[substr($0, i, 1)] ++; # count all letters
  7.                 }
  8.                 letters[substr($0, length($0), 1)] ++; # count the last letter too (!!)
  9.         } else if ( NR > 2) {
  10.                 split($0, ar, " "); # Input line e.g. "CH -> B"
  11.                 rules[ar[1]] = ar[3];  # E.g. rules[CH] = "B"
  12.         }
  13. }
  14.  
  15. END {
  16.         for (step=1; step<=STEPS; step++) {
  17.                 delete changeSet;
  18.                 for (rule in rules) {
  19.                         if (rule in parr) {
  20.                                 leftNew = substr(rule, 1, 1) rules[rule];
  21.                                 rightNew = rules[rule] substr(rule, 2, 1);
  22.                                 changeSet[rule] -= parr[rule];
  23.                                 changeSet[leftNew] += parr[rule];
  24.                                 changeSet[rightNew] += parr[rule];
  25.                                 letters[rules[rule]] += parr[rule];
  26.                         }
  27.                 }
  28.                 for (change in changeSet) { # Have to perform changeset in a batch or changes will interfere
  29.                         parr[change] += changeSet[change];
  30.                 }
  31.         }
  32.  
  33.         asort(letters);
  34.         print "max - min: " letters[length(letters)] - letters[1];
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement