코드의 출현 9일차
이 문제는 AdamsTowel 행렬과 매우 잘 맞습니다.
내 솔루션에 대한 비디오 설명을 볼 수 있습니다.
( )
솔루션의 몇 가지 주요 사항:
(1)
(new=that.with(row=\row-1\) catch error Any _ void \add(new))
이것은 새로운 좌표를 만들고 구성 중인 목록에 추가하는 것입니다. 좌표가 행렬 외부에 있으면 오류가 발생하고 무시됩니다.
(2)
sizes=I.List()( for i in Range(seeds.size())
\add(Match.Count()(for v in matrix \add(v==i+100I)))
)
여기서 우리는 어떤 키보다 훨씬 큰 숫자를 사용하여 씨앗을 오염시킵니다.
숫자는 해당 시드 인덱스로 다시 추적할 수 있습니다.
(삼)
GrowBasin={class method Void(mut Matrix matrix)=(
for c in matrix.coords() var h in matrix {
if h>=9I return void
return for ci in Near(c) if matrix.val(ci)>99I return h:=matrix.val(ci)
}
유역을 한 단계 성장시키기 위해 높이 h의 모든 좌표 c를 검색합니다. 유역 번호로 오염된 c 근처에 ci가 있으면 현재 높이도 오염됩니다.
다음은 전체 코드입니다.
reuse [L42.is/AdamsTowel]
Fs = Load:{reuse[L42.is/FileSystem]}
Matrix = Collection.matrix(I.List,row=100I, col=100I)
Coords = Collection.list(Matrix.Coord)
Split={class method S.List (S that)=\()(//should be in adamsTowel
for c in that.replace(S"" with=S",").split(S",")\add(c)
)}
Near={class method Coords (Matrix.Coord that)=Coords()((
(new=that.with(row=\row-1\) catch error Any _ void \add(new))
(new=that.with(row=\row+1\) catch error Any _ void \add(new))
(new=that.with(col=\col-1\) catch error Any _ void \add(new))
(new=that.with(col=\col+1\) catch error Any _ void \add(new))
))}
GrowBasin={class method Void(mut Matrix matrix)=(
for c in matrix.coords() var h in matrix {
if h>=9I return void
return for ci in Near(c) if matrix.val(ci)>99I return h:=matrix.val(ci)
}
)}
NeedsMore={class method Bool(read Matrix matrix) =
Match.Some()(for e in matrix \add(e<9I))
}
PopMax ={class method I (mut I.List that)=(
var i = 0I
var e = 0I
for ei in that, ii in Range(that.size()) if ei>e (
e:=ei, i:=ii
)
that.remove(i)
e
)}
MainPart2 = (
input = Fs.Real.#$of().read(\"input")
matrix = Matrix(\()(
for s in input.split(S.nl()) for si in Split(s) \add(I(string=si))
))
seeds = Coords()(for c in matrix.coords() h in matrix (
min = Match.All()(for ci in Near(c) \add(matrix.val(ci)>h))
if min \add(c)
))
for c in seeds, i in Range(seeds.size()) (matrix.set(c val=i+100I))
while NeedsMore(matrix=matrix) ( GrowBasin(matrix=matrix) )
sizes=I.List()( for i in Range(seeds.size())
\add(Match.Count()(for v in matrix \add(v==i+100I)))
)
v1=PopMax(sizes)
v2=PopMax(sizes)
v3=PopMax(sizes)
Debug(v1*v2*v3)//882942
)
Reference
이 문제에 관하여(코드의 출현 9일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/marcoservetto/advent-of-code-day-9-4l7p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)