Skip to content
Snippets Groups Projects
Commit a1c062f9 authored by Ruben van Dijk's avatar Ruben van Dijk
Browse files

Day 18

parent f95f17ce
Branches master
No related tags found
No related merge requests found
Set-StrictMode -Version latest
$lines = Get-Content -Path $PSScriptRoot\input | Select -First 1024
$xSize=70
$ySize=70
$grid=@()
for($y=0;$y -le $ySize;$y++) {
$line=@()
for($x=0;$x -le $xSize;$x++) {
$line+="."
}
$grid+=,$line
}
function drawGrid {
$grid | ForEach-Object {
$_ -join ' ' | Write-Host
}
}
$lines | ForEach-Object {
$parts = $_ -split ','
[int]$x=$parts[0]
[int]$y=$parts[1]
$grid[$y][$x]="#"
}
$grid[0][0]=0
function getValue {
param($x,$y, $xOffset, $yOffset)
$x+=$xOffset
$y+=$yOffset
if($y -gt $ySize -or $x -gt $xSize) {
return 100000
}
$value = $grid[$y][$x]
if($value -eq "#" -or $value -eq ".") {
$value = 100000
}
return $value
}
function doCell {
param($x, $y)
$current=$grid[$y][$x]
if($current -eq "#") {
return $false
}
if($current -eq ".") {
$current = 100000
}
$numbers = @($current)
$numbers+=getValue $x $y 0 -1
$numbers+=getValue $x $y 0 1
$numbers+=getValue $x $y -1 0
$numbers+=getValue $x $y 1 0
$measurement = $numbers | measure-object -Minimum
$min = $measurement.Minimum
$min += 1
if($current -gt $min) {
$grid[$y][$x]=$min
$cellsChanged+=1
return $true
} else {
return $false
}
}
$changed=1
while($changed -ge 1) {
$changed=0
for($y=0;$y -le $ySize;$y++) {
for($x=0;$x -le $xSize;$x++) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
for($x=$xSize;$x -ge 0;$x--) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
}
for($y=$ySize;$y -ge 0;$y--) {
for($x=0;$x -le $xSize;$x++) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
for($x=$xSize;$x -ge 0;$x--) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
}
Write-Host "$changed cells changed"
}
$solution = $grid[$ySize][$xSize]
Write-Host "solution: $solution"
\ No newline at end of file
Set-StrictMode -Version latest
$xSize=70
$ySize=70
$lines = Get-Content -Path $PSScriptRoot\input
function getValue {
param($x,$y, $xOffset, $yOffset)
$x+=$xOffset
$y+=$yOffset
if($y -gt $ySize -or $x -gt $xSize) {
return $false
}
return $grid[$y][$x] -eq "X"
}
function doCell {
param($x, $y)
$current=$grid[$y][$x]
if($current -ne ".") {
return $false
}
$above=getValue $x $y 0 -1
$below=getValue $x $y 0 1
$left=getValue $x $y -1 0
$right=getValue $x $y 1 0
if($above -or $below -or $left -or $right) {
$grid[$y][$x]="X"
return $true
} else {
return $false
}
}
function withAmount {
param($amount)
$grid=@()
for($y=0;$y -le $ySize;$y++) {
$line=@()
for($x=0;$x -le $xSize;$x++) {
$line+="."
}
$grid+=,$line
}
$lines | Select -First $amount | ForEach-Object {
$parts = $_ -split ','
[int]$x=$parts[0]
[int]$y=$parts[1]
$grid[$y][$x]="#"
}
$grid[0][0]="X"
$changed=1
while($changed -ge 1) {
$changed=0
for($y=0;$y -le $ySize;$y++) {
for($x=0;$x -le $xSize;$x++) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
for($x=$xSize;$x -ge 0;$x--) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
}
for($y=$ySize;$y -ge 0;$y--) {
for($x=0;$x -le $xSize;$x++) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
for($x=$xSize;$x -ge 0;$x--) {
$singleChanged = doCell $x $y
if($singleChanged) {
$changed+=1
}
}
}
Write-Host "$changed cells changed"
if($grid[$ySize][$xSize] -eq "X") {
return $true
}
}
return $false
}
$min=0
$max=$lines.Length
while($min -ne $max) {
Write-Host "$min-$max"
$distance=$max-$min
[int]$avg=$distance/2+$min
Write-Host "avg: $avg"
$finished=withAmount $avg
Write-Host "finished: $finished"
if($distance -eq 1) {
if($finished) {
$min=$avg
$max=$avg
} else {
$min=$avg-1
$max=$avg-1
}
} elseif($finished) {
$min=$avg
} else {
$max=$avg
}
}
Write-Host "solution:$($lines[$min])"
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment