-
Notifications
You must be signed in to change notification settings - Fork 0
/
AdventOfCode - Day 7.1.ps1
46 lines (37 loc) · 1.38 KB
/
AdventOfCode - Day 7.1.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$rules = @()
function getParents($ruleName, $rules) {
$parents = @()
$parentRules = $rules | Where-Object { $null -ne ($_.contents | Where-Object { $_.name -eq $ruleName }) }
$parents += $parentRules
$parentRules | % {
$parents += getParents $_.name $rules
}
return $parents
}
Get-Content -Path '.\luggagerules day 7.txt' | ForEach-OBject {
$rulePart = ($_ -split 'contain')[0]
$contentPart = ($_ -split 'contain')[1]
if ($rulePart -match "([a-z| ]+) bags") {
$ruleName = $Matches[1]
$contentParts = $contentPart -split ','
$contents = @()
$contentParts | ForEach-Object {
if ($_ -match "(\d) ([a-z| ]+) bag[s]?\.?") {
$contentAmount = [int]::Parse($Matches[1])
$contentName = $Matches[2]
$contents += new-object -TypeName PSObject -Property @{
'amount'=$contentAmount;
'name'=$contentName
}
}
}
}
$rules += new-object -TypeName PSObject -Property @{
'name'=$ruleName;
'contents'=$contents
}
}
$ruleName = "shiny gold"
$parents = getParents $ruleName $rules
$uniqueParents = $parents | Group-Object 'name' | ForEach-Object { $_.Group | Select-Object 'name' -First 1 } | Sort-Object 'name'
$uniqueParents.Count