2019-12-04

# Day 04: Secure Container

Description:
--- Day 4: Secure Container ---

You arrive at the Venus fuel depot only to discover it's protected by a password. The Elves had written the password on a sticky note, but someone threw it out.

It is a six-digit number.
The value is within the range given in your puzzle input.
Two adjacent digits are the same (like 22 in 122345).
Going from left to right, the digits never decrease; they only ever increase or stay the same (like 111123 or 135679).

Other than the range rule, the following are true:

111111 meets these criteria (double 11, never decreases).
223450 does not meet these criteria (decreasing pair of digits 50).
123789 does not meet these criteria (no double).

How many different passwords within the range given in your puzzle input meet these criteria?

--- Part Two ---

An Elf just remembered one more important detail: the two adjacent matching digits are not part of a larger group of matching digits.

Given this additional criterion, but still ignoring the range rule, the following are now true:

112233 meets these criteria because the digits never decrease and all repeated digits are exactly two digits long.
123444 no longer meets the criteria (the repeated 44 is part of a larger group of 444).
111122 meets the criteria (even though 1 is repeated more than twice, it still contains a double 22).

How many different passwords within the range given in your puzzle input meet all of the criteria?

Input:
256310-732736

Part 1:
``````namespace AdventOfCode2019_04_1
{
const DAY     = 4;
const PROBLEM = 1;

export async function run()
{
if (input == null) return;

const min = parseInt(input.split('-')[0]);
const max = parseInt(input.split('-')[1]);

let rcount = 0;

for(let d0=0; d0<=9; d0++)
{
const v0 = d0 * 100000

if (v0+99999 <= min) continue;
if (v0       >= max) continue;

for(let d1=d0; d1<=9; d1++)
{
const v1 = v0 + d1 * 10000;

if (v1+9999 <= min) continue;
if (v1      >= max) continue;

for(let d2=d1; d2<=9; d2++)
{
const v2 = v1 + d2 * 1000;

if (v2+999 <= min) continue;
if (v2     >= max) continue;

for(let d3=d2; d3<=9; d3++)
{
const v3 = v2 + d3 * 100;

if (v3+99 <= min) continue;
if (v3    >= max) continue;

for(let d4=d3; d4<=9; d4++)
{
const v4 = v3 + d4 * 10;

if (v4+9 <= min) continue;
if (v4   >= max) continue;

for(let d5=d4; d5<=9; d5++)
{
const v5 = v4 + d5 * 1;

if (v5 <= min) continue;
if (v5 >= max) continue;

if (!(d0==d1 || d1==d2 || d2==d3 || d3==d4 || d4==d5)) continue;

rcount++;
}
}
}
}
}
}

}
}
``````
Result: 979

Part 2:
``````namespace AdventOfCode2019_04_2
{
const DAY     = 4;
const PROBLEM = 2;

export async function run()
{
if (input == null) return;

const min = parseInt(input.split('-')[0]);
const max = parseInt(input.split('-')[1]);

let rcount = 0;

for(let d0=0; d0<=9; d0++)
{
const v0 = d0 * 100000

if (v0+99999 <= min) continue;
if (v0       >= max) continue;

for(let d1=d0; d1<=9; d1++)
{
const v1 = v0 + d1 * 10000;

if (v1+9999 <= min) continue;
if (v1      >= max) continue;

for(let d2=d1; d2<=9; d2++)
{
const v2 = v1 + d2 * 1000;

if (v2+999 <= min) continue;
if (v2     >= max) continue;

for(let d3=d2; d3<=9; d3++)
{
const v3 = v2 + d3 * 100;

if (v3+99 <= min) continue;
if (v3    >= max) continue;

for(let d4=d3; d4<=9; d4++)
{
const v4 = v3 + d4 * 10;

if (v4+9 <= min) continue;
if (v4   >= max) continue;

for(let d5=d4; d5<=9; d5++)
{
const v5 = v4 + d5 * 1;

if (v5 <= min) continue;
if (v5 >= max) continue;

if (!eq(d0, d1, d2, d3, d4, d5)) continue;

rcount++;
}
}
}
}
}
}

}

function eq(a:number, b: number, c: number, d: number, e: number, f: number): boolean
{
if (        a==b && b!=c) return true;
if (a!=b && b==c && c!=d) return true;
if (b!=c && c==d && d!=e) return true;
if (c!=d && d==e && e!=f) return true;
if (d!=e && e==f        ) return true;

return false;
}
}
``````
Result: 635

made with vanilla PHP and MySQL, no frameworks, no bootstrap, no unnecessary* javascript