라크 매주 도전: 79주 회고

7324 단어 raku

이 물건은 켜져 있습니까?
세상에서 일어나는 모든 것에 따라 나는 글을 쓰는 것이 매우 어렵다는 것을 발견하였다.하지만 오늘review of Week 79 of the weekly challenge이 발표됐다.앤드류는 각종 라크의 도전에 대처하는 데 매우 뛰어나다. 나는 내가 그를 보는 것을 좋아한다는 것을 인정해야 한다.코드에 대한 다른 사람의 반응을 보면 항상 좋다.개발자로서 나는 항상 나의 코드를 검사하고 영상에서 그것을 완성하는 것이 매우 좋다.
이 평론을 보면서 나는 내가 자주 만나는 상황, 즉 하나의 해결 방안에만 관심을 가지고 다른 해결 방안을 고려하지 않는 상황에 빠졌다는 것을 깨달았다.우선, 당신은 기억해야 합니다. Challenge 75 그것도 기둥 모양도와 관련이 있습니다. 저는 이 도전을 위해 작성한 코드를 매우 좋아합니다.
(나는 이것이 좀 지나쳤다는 것을 안다. 나는 나의 함수 프로그래밍에 대해 좀 안다.그러나 어쨌든, 나는 직사각형을 그리는 코드가 있기 때문에, 이 도전에 대응하기 위해 그것을 다시 사용하고, 그 용도를 재조정해야 한다고 생각한다.

잘라내기와 붙여넣기의 위험.
스크랩 프로그래밍은 빈 화면이 머리카락을 뽑을 때 움직일 수 있는 장점이 많다.그러나 원본 코드에 사용된 사상 때문에 곤경에 빠질 수도 있습니다.
이 예에서 나는 갑자기 직사각형의 면적을 계산하는 것이 생각났다.

간단한 예
고도수조3,0,0,0,3를 예로 들면 이 직사각형을 보여 준다.(우리는 마루가 하나 있다고 가정하면 물이 바닥에서 떨어지지 않는다.
#   #     #~~~#
#   #  => #~~~#
#   #     #~~~#
보시다시피 9평방미터의 빗물이 있고 면적 계산은 너비에 높이를 곱하거나 3 x 3 = 9는 매우 간단하다.(이 점에서 나는 이미 이 길을 따라 내려가기 시작했다. 이 길은 나에게 각양각색의 즐거움을 가져다 주었다.

층수를 늘리다
물론 통상적으로 우리의 모든 높이는 0보다 크다. 이것은 우리에게 좋은 마루를 주었기 때문에 여기에 또 다른 간단한 수조3,1,1,1,3가 있다.
#   #     #~~~#
#   #  => #~~~#
#####     #####
이곳의 면적은 6이고 계산 방법은 내부 너비(3)에 가장자리 높이(3)를 곱하여 내부 높이(1+1+1)를 뺀 합이다.여기 있습니다(3 x 3) - (1+1+1) = 6.물론 이것은 여전히 간단한 예이다.
(우리의 최초 상황에 대해 이 계산은 여전히 적용되고 내부 높이를 합치면 0일 뿐임을 주의하십시오.)

합병증 1: 가장자리 높이가 다르다
그래서 나는 여전히 나의 계획을 추진하고 있다. 지금까지 그것은 의미가 있다.그런데 가장자리 높이가 다르면?우리가 얻을 수 있는 것은 무엇입니까?
#         #
#         #
#   #  => #~~~#
#   #     #~~~#
#####     #####
여전히 6개의 정사각형이어서 우리의 알고리즘이 여전히 유효하다는 것을 쉽게 알 수 있다.우리는 작은 가장자리의 높이만 구역의 높이로 사용한다.5,1,1,1,3 좋고 간단해요.이 점에서 나는 내가 이긴 사람이라고 생각한다.

합병증 2: 울퉁불퉁한 땅
만약 마루가 평평하지 않으면 어떻게 합니까?이 어레이에 대한 영업 기회(3 x 3) - (1+1+1) = 6를 살펴보겠습니다.
#   #     #~~~#
#  ##  => #~~##
# ###     #~###
#####     #####
우리의 알고리즘이 제시한 높이는 4,1,2,1,3,4이고 너비는 4이며 내부 높이는 3이다. 우리는 이것이 옳다는 것을 알 수 있다.
그래서 지금 기분이 너무 좋아요...물론 이것이 붕괴되기 시작한 곳이다.

이 센터는 지탱할 수 없습니다
중간에 못이 있다면?가장자리보다 높게?예를 들어 1+2+3 = 6:
  #         #
# # #  => #~#~#
# # #     #~#~#
#####     #####
그래서 우리의 알고리즘은 최소변(4 x 3) - 6 = 6, 너비3,1,4,1,3와 내부 높이3를 얻을 것이다3.이것은 잘못된 것이다.
그래서 여기서 한 발짝 뒤로 물러나서 더 좋은 방법이 있는지 알고 싶지만 계속 노력하고 있습니다.현재 알고리즘에 대해 간단한 수정을 진행하고 있으며, 고도를 구할 때, 계산수 그룹의 높이나 우리의 최소 측면 높이를 비교적 작은 자를 기준으로 한다.
이것은 경고입니다. 만약 간단한 알고리즘이 추가 검사를 시작한다면, 방향을 잘못 들었을 수도 있습니다.이것도 사후에 쉽게 발견할 수 있는 경고다.
어쨌든 우리는 지금 1+4+1 = 6이 있다. 우리는 완성했다!
나는 정말 내가 이미 완성한 줄 알았다.나는 또 몇 개의 진열을 만들었다. 그리고...오, 아가.

이 비탈은 정말 귀신이 곡할 노릇이다
다른 거 해볼게요. 좋은 알고리즘이 있다는 거죠?(3 x 3) - 6 = 3 괜찮아 보일 거예요.
  #        #
  # #      #~#
  # # =>   #~#
 ## #     ##~#
#####    #####
이때 알고리즘이 완전히 붕괴(3 x 3) - (1 + 3 + 1) = 4되었다.

키보드 멀리하기
때때로 너는 한 걸음 뒤로 물러나야 한다.나는 확실히 이렇게 했지만...멀지 않아.이 알고리즘은 많은 상황에서 효과가 있다. 이것을 보면 두 개의 독립된 수조로 볼 수 있다.
  #        #   #
  # #      #   #~#
  # # =>   # + #~#
 ## #     ##   #~#
#####    ###   ###
1,2,5,1,4(1 x 3) - (1+1+1) = 0 우리는 알고리즘의 두 가지 과정을 얻었다. 첫 번째 과정의 높이는1,2,5이고 너비는5,1,4이며 내부 높이는1이기 때문1이다.동시에 두 번째 수조에서 우리는 높이1, 너비(1 x 1) - 1 = 0와 내부 높이4가 있기 때문에1를 합치면 3을 얻을 수 있다.따라서 이 알고리즘은 지도의 이산 블록부터 작동한다.
이 점에서 내 몸에 있는 함수식 프로그래머가 돌아가는 모자를 찾고 있다.Raku1 방법은 이런 귀속 함수를 만드는 것을 매우 쉽게 하기 때문에 마지막에 나는 세 가지 상황을 발견했다.
  • 중간 부분에 가장자리보다 높은 뾰족한 봉우리가 있다
  • 이 예에서는 스토리지를 두 개의 서브 어레이로 분할하고 각 서브 어레이를 검사하고자 합니다
  • .
  • 수 그룹 중 한두 개 항목만
  • 만약 그렇다면, 우리는 항상 아무것도 얻지 못하고, 비가 오지 않을 것이다.이것이 바로 앤드류가 평론에서 지적하지 않은 상황이다.
  • 두 변이 가능한 가장 높은 변이고 중간에 최소한 공간이 있다
  • 간단한 알고리즘
  • 을 사용하여 면적 계산
    코드는 다음과 같습니다.
    먼저 사례 1.고도 진열에 첨봉이 하나 있다.도형 코드가 물이 어디에 있는지 알 수 있도록 편이량을 전달했습니다.
    multi sub calculate-rain-levels( 
      @heights where { 
        any(@heights[0^..^*-1]) > any(@heights[0],@heights[*-1])  
      }, 
      $offset = 0
    ) {
      my $max = max(@heights[0^..^*-1]);
      # This is a bad name... it's really the first
      # Index of a height greater than the edges. 
      my $mid-idx = @heights[0^..^*-1].kv.map( 
        -> $k, $v { $v == $max ?? $k+1 !! Empty } )[0];
    
      # As calculate-rain-levels returns an array we slip it so
      # we don't end up with nested array.
      return ( 
        |calculate-rain-levels( @heights[0..$mid-idx],$offset ),
        |calculate-rain-levels( @heights[$mid-idx..*],$mid-idx+$offset ) 
      )
    }
    
    사례세 개 이상의 값만 받아들일 수 있는 그룹을 다시 일치시킵니다.
    multi sub calculate-rain-levels( 
      @heights where { @heights.elems > 2 }, 
      $offset=0 
    ) {
      # Here is our simplified algorithm
      # Get the highest edge
      my $height = min( @heights[0], @heights[*-1] );
      # Area = height * width on the inside
      my $area = $height * ( @heights.elems - 2 );
      # Then remove the floors, no need to check the height.
      $area -= [+] @heights[0^..^*-1];
      # RainArea is a data transfer object that is used by the
      # drawing system
      return RainArea.new( 
        range => ( $offset..^([email protected]) ), 
        :$area, 
        :$height 
      ); 
    }
    
    사례 2(한 개 또는 두 개 항목)는 현재 반환 사례입니다. 우리는 아무것도 반환하지 않으려고 합니다.우리는 서명에 익명 변수를 사용합니다. 왜냐하면 우리는 그것들에 관심이 없기 때문입니다
    multi sub calculate-rain-levels(@,$) { Empty }
    

    우리 시작했어.
    이것은 내가 이 도전을 완성하는 데 따르는 난잡한 논리에 일정한 의의가 있기를 바란다.무함메드가 도전에 대처하기 위해 한 모든 일에 다시 한 번 감사하고, 앤드류의 라쿠 평론과 참여한 모든 사람들에게 감사를 드립니다.나는 항상 월요일 아침의 넌센스 퀴즈를 좋아한다.
    이 어려운 때에 마음껏 즐기고 잘 살아라.

    좋은 웹페이지 즐겨찾기