My solutions to http://adventofcode.com/
Trying to do them all in awk
(with maybe some bash
to pass the files in)
4.2.2 |
My solutions to http://adventofcode.com/
Trying to do them all in awk
(with maybe some bash
to pass the files in)
BEGIN { | |
FS = "" | |
} | |
{ | |
for (i = 1; i <= NF; i++) { | |
if ($i ~ /\(/) { | |
floors++ | |
} else { | |
floors-- | |
} | |
} | |
} | |
END { | |
print floors | |
} |
BEGIN { | |
FS = "" | |
} | |
{ | |
for (i = 1; i <= NF; i++) { | |
if ($i ~ /\(/) { | |
floors++ | |
} else { | |
floors-- | |
} | |
if (floors < 0) { | |
print i | |
break | |
} | |
} | |
} | |
END { | |
print floors | |
} |
# for i in $(cat day2.txt); do echo "$i" | awk -Fx -f day2_1.awk; done | paste -sd+ | bc | |
BEGIN { | |
min = 0; | |
total = 0; | |
} | |
{ | |
for(i = 1; i <= NF; i++) { | |
side2 = i+1; | |
if (side2 > NF) { | |
side2 = 1; | |
} | |
side = $i * $side2 | |
sides[i] = side | |
if(min == 0 || side < min) { | |
min = side; | |
} | |
} | |
} | |
END { | |
printf "(%d", min | |
for(i = 1; i <= NF; i++) { | |
printf "+(2*%d)",sides[i]; | |
} | |
print ")" | |
} |
# for i in $(cat day2.txt); do echo "$i" | awk -Fx -f day2_2.awk; done | paste -sd+ | bc | |
BEGIN { | |
max = 0; | |
volume = 1; | |
} | |
{ | |
for(i = 1; i <= NF; i++) { | |
side = $i | |
volume *= side; | |
if(max == 1 || side > max) { | |
max = side; | |
} | |
} | |
} | |
END { | |
printf "((2*%d + 2*%d + 2*%d - 2*%d) + %d)\n",$1,$2,$3,max,volume | |
} |
BEGIN { | |
FS = "" | |
x = 0 | |
y = 0 | |
} | |
{ | |
houses[x " " y]++ | |
for (i = 1; i <= NF; i++) { | |
switch($i) { | |
case "^": | |
y++ | |
break | |
case "v": | |
y-- | |
break | |
case ">": | |
x++ | |
break | |
case "<": | |
x-- | |
break | |
} | |
houses[x " " y]++ | |
} | |
} | |
END { | |
num_houses=0 | |
for(key in houses) { | |
num_houses++ | |
} | |
print num_houses | |
} |
BEGIN { | |
FS = "" | |
x[0] = 0 | |
y[0] = 0 | |
x[1] = 0 | |
y[1] = 0 | |
} | |
{ | |
houses[x[0] " " y[0]]++ | |
for (i = 1; i <= NF; i++) { | |
person= i % 2 | |
switch($i) { | |
case "^": | |
y[person]++ | |
break | |
case "v": | |
y[person]-- | |
break | |
case ">": | |
x[person]++ | |
break | |
case "<": | |
x[person]-- | |
break | |
} | |
houses[x[person] " " y[person]]++ | |
} | |
} | |
END { | |
num_houses=0 | |
for(key in houses) { | |
num_houses++ | |
} | |
print num_houses | |
} |
#!/usr/bin/env bash | |
# bash day4_1.sh ckczppom 000000 3938036 3938039 | |
BASE=$1 | |
pattern=${2:-000000} | |
i=${3:-0} | |
limit=${4:-10} | |
run_md5() { | |
echo -n "${BASE}${i}" | md5sum - | |
} | |
until [[ $md5 == ${pattern}* ]] || [ $i -gt $limit ]; do | |
md5=$(run_md5) | |
echo "${i} ${md5}"; | |
((i++)) | |
done |
#!/usr/bin/env bash | |
REPEAT='([a-z])\1' | |
VOWELS='[aeiou].*[aeiou].*[aeiou]' | |
IGNORE='(ab|cd|pq|xy)' | |
grep -E "${REPEAT}" | grep -E "${VOWELS}" | grep -Ev "${IGNORE}" |
#!/usr/bin/env bash | |
REPEAT='(?<group>[a-z]{2}).*(?P=group)' | |
SKIP='([a-z]).\1' | |
grep -P "${REPEAT}" | grep -E "${SKIP}" |
BEGIN { | |
max_x=0 | |
max_y=0 | |
lights[0][0] = 0 | |
} | |
match($0, /(.*?) ([[:digit:]]{1,3}),([[:digit:]]{1,3}) through ([[:digit:]]{1,3}),([[:digit:]]{1,3})/, ary) { | |
action=ary[1] | |
x1=ary[2] | |
y1=ary[3] | |
x2=ary[4] | |
y2=ary[5] | |
max_x=(x2>max_x)?x2:max_x | |
max_y=(y2>max_y)?y2:max_y | |
for(x = x1; x <= x2; x++) { | |
for(y = y1; y <= y2; y++) { | |
if(action == "turn off") { | |
new_val=0 | |
} else if(action == "turn on") { | |
new_val=1 | |
} else { | |
new_val=!lights[x][y] | |
} | |
lights[x][y]=new_val | |
} | |
} | |
} | |
END { | |
for(x = 0; x <= max_x; x++) { | |
for(y = 0; y <= max_y; y++) { | |
sum+=lights[x][y] | |
} | |
} | |
print sum | |
} |
BEGIN { | |
max_x=0 | |
max_y=0 | |
lights[0][0] = 0 | |
} | |
match($0, /(.*?) ([[:digit:]]{1,3}),([[:digit:]]{1,3}) through ([[:digit:]]{1,3}),([[:digit:]]{1,3})/, ary) { | |
action=ary[1] | |
x1=ary[2] | |
y1=ary[3] | |
x2=ary[4] | |
y2=ary[5] | |
max_x=(x2>max_x)?x2:max_x | |
max_y=(y2>max_y)?y2:max_y | |
#printf "LINE: %s (%d, %d), (%d, %d)\n", action, x1, y1, x2, y2 | |
for(x = x1; x <= x2; x++) { | |
for(y = y1; y <= y2; y++) { | |
val=lights[x][y] | |
if(action == "turn off") { | |
if(val > 0) { | |
val-- | |
} | |
} else if(action == "turn on") { | |
val++ | |
} else { | |
val+=2 | |
} | |
lights[x][y]=val | |
} | |
} | |
} | |
END { | |
for(x = 0; x <= max_x; x++) { | |
for(y = 0; y <= max_y; y++) { | |
#printf "%3s ", lights[x][y] | |
sum+=lights[x][y] | |
} | |
#print "\n" | |
} | |
print sum | |
} |
'use strict'; | |
var PromiseExt = require('./promiseExt.es6'); | |
let functions = { | |
AND: (a, b) => { | |
return [a, b, (res) => { | |
return res[a] & res[b] | |
}]; | |
}, | |
OR: (a, b) => { | |
return [a, b, (res) => { | |
return res[a] | res[b] | |
}]; | |
}, | |
LSHIFT: (a, shift) => { | |
return [a, (res) => { | |
return res[a] << shift; | |
}]; | |
}, | |
RSHIFT: (a, shift) => { | |
return [a, (res) => { | |
return res[a] >> shift; | |
}]; | |
}, | |
NOT: (a) => { | |
return [a, (res) => { | |
return Math.pow(2,16) + ~res[a]; | |
}]; | |
}, | |
SET: (a) => { | |
let x; | |
x = Number.parseInt(a); | |
if(Number.isInteger(x)) { | |
return Promise.resolve(x); | |
} else { | |
return [a, (res) => { | |
return res[a]; | |
}]; | |
} | |
} | |
} | |
var processLine = (operations, line) => { | |
let parts = line.split(/\s/); | |
let target = parts.pop(); | |
// Remove the -> | |
parts.pop(); | |
let src1, operation, src2; | |
switch(parts.length) { | |
case 1: | |
operation = 'SET'; | |
src1 = parts.shift(); | |
break; | |
case 2: | |
operation = parts.shift(); | |
src1 = parts.shift(); | |
break; | |
case 3: | |
src1 = parts.shift(); | |
operation = parts.shift(); | |
src2 = parts.shift(); | |
break; | |
default: | |
throw new Error("This shouldn't happen", parts); | |
} | |
// Explicitly set undefined numbers | |
[src1, src2].forEach((a) => { | |
let x; | |
x = Number.parseInt(a); | |
if (Number.isInteger(x)) { | |
operations[x] = functions['SET'](x); | |
// Set the string version as well in case something requires that one | |
operations[a] = functions['SET'](x); | |
} | |
}); | |
operations[target] = functions[operation](src1, src2); | |
} | |
let operations = {}; | |
var rl = require('readline').createInterface({ | |
input: process.stdin | |
}); | |
rl.on('line', (line) => { | |
processLine(operations, line); | |
}); | |
rl.on('close', () => { | |
PromiseExt.auto(operations).then((res) => { | |
Object.keys(res).sort().forEach((k) => { | |
console.log(`${k}: ${res[k]} - ${res[k].toString(2)}`); | |
}) | |
}); | |
}); |
'use strict'; | |
var EventEmitter = require('events').EventEmitter; | |
class PromiseExt extends Promise { | |
static map(promises) { | |
let keys = []; | |
let values = []; | |
Object.keys(promises).forEach((k) => { | |
keys.push(k); | |
values.push(promises[k]); | |
}); | |
return Promise.all(values).then((results) => { | |
return results.reduce(function(x, val, i) { | |
let key = keys[i]; | |
x[key] = val; | |
return x; | |
}, {}); | |
}); | |
}; | |
static auto(obj) { | |
function setPromise(promises, definitions, key) { | |
// Only do things if the promise is not defined | |
if (!promises[key]) { | |
let vals = definitions[key]; | |
// If it's an array, it means that there are dependent steps | |
if (Array.isArray(vals)) { | |
// The last one is the promise we care about | |
let promise = vals.pop(); | |
let _promises = vals.reduce((x, k) => { | |
x[k] = setPromise(promises, definitions, k); | |
return x; | |
}, {}); | |
promises[key] = PromiseExt.map(_promises).then(promise); | |
} else { | |
// This is a single promise, we should set and return it | |
promises[key] = vals; | |
} | |
} | |
return promises[key]; | |
} | |
let promises = Object.keys(obj).reduce((promises, key) => { | |
setPromise(promises, obj, key); | |
return promises; | |
}, {}); | |
return PromiseExt.map(promises); | |
} | |
} | |
module.exports = PromiseExt; | |
/** | |
* Example usage | |
*/ | |
/* | |
PromiseExt.auto({ | |
b: ['a', (res) => { | |
return res.a + 1; | |
}], | |
a: Promise.resolve(2), | |
c: ['a', 'b', (res) => { | |
return res.a * res.b | |
}], | |
}).then((res) => { | |
console.log(res); | |
}); | |
*/ |