코드의 출현 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
  )

좋은 웹페이지 즐겨찾기