좌석 시스템

코드 출현 2020 11일차



시뮬레이터를 사용해보십시오





과제: X에 대해 풀기 여기서...




X = the number of seats occupied once seat occupation no longer changes


예시 입력




L.LL.LL.LL
LLLLLLL.LL
L.L.L..L..
LLLL.LL.LL
L.LL.LL.LL
L.LLLLL.LL
..L.L.....
LLLLLLLLLL
L.LLLLLL.L
L.LLLLL.LL


다음을 나타냅니다.
  • 대기실
  • .는 바닥
  • L는 빈자리
  • #는 점유석
  • 입니다.

    1 부


  • 이 퍼즐 유형은 또?
  • 이 퍼즐은 어떻게 비교됩니까?
  • 작업 알고리즘 작성
  • 시뮬레이터 구축

  • 이 퍼즐 유형은 또?



  • 2021 Day 25: Sea Cucumbers 토글링 타일이 있는 일정한 그리드 크기가 결국에는 변경을 멈췄습니다
  • .

  • 2021 Day 22: Reactor Reboot 3D 공간에서 토글 상태 큐브를 특징으로 함

  • 2021 Day 20: Trench Map은 타일 상태를 전환하는 2D 무한 그리드를 특징으로 합니다
  • .

  • 2021 Day 11: Dumbo Octopus 토글 타일이 있는 일정한 2D 그리드를 특징으로 하며 타일은 각각 결국 동일한 상태를 가집니다
  • .

  • 2021 Day 5: Hydrothermal Venture 타일이 '표시되지 않은' 상태로 남아 있거나 값이 증가한 그리드

  • 2021 Day 4: Giant Squid 타일이 표시
  • 에 따라 점점 더 토글되는 몇 가지 일정한 2D 그리드를 특징으로 합니다.

  • 2020 Day 24: Lobby Layout에는 타일 상태를 전환하는 2D 무한 그리드도 포함되어 있습니다
  • .

  • 2020 Day 17: Conway Cubes 큐브 상태 전환이 포함된 3D 무한 그리드 기능

  • 이 퍼즐은 어떻게 비교됩니까?


  • 이 퍼즐의 그리드는 2D입니다
  • 이 퍼즐의 격자는 일정한 크기로 유지됩니다
  • .
  • 이 퍼즐의 타일은 3가지 상태 중 하나일 수 있습니다
  • .
  • 이 퍼즐의 타일은 결국 상태 변경을 중지합니다
  • .

    작동하는 알고리즘 작성



    무대 설정

    Process the input into an array of arrays:
      Split the input at each new line character into an array of strings
      Split each string into an array of characters
    
    Create an array of 8 pairs that represent the coordinates of each cell's adjacent cells
    


    요소가 1개인 쉘로 배열을 채웁니다.

    Turn an array like this:
    L.L
    .L.
    L.L
    
    Into an array like this:
    .....
    .L.L.
    ..L..
    .L.L.
    .....
    


    메인 루프:

    Do at least one time, then again only if an array of cells to switch is not empty:
      Empty the array of cells
      For each cell in the grid of seats, except for the bordering cells:
        Check each adjacent cell and accumulate tallies for each of the three possible characters found: . # L
        If the current cell contains an 'L' and the number of '#'s found is 0
          Add the cell's coordinates to the list of switchers with an instruction to change it's value to '#'
        Else, if the current cell contains an '#' and the number of '#'s found is 4 or more
          Add the cell's coordinates to the list of switchers with an instruction to change it's value to 'L'
    
    For each coordinate and instruction set in the list of switchers
      Update the cell in the grid of seats at the current location to the value specified
    


    마지막으로, 점유된 좌석 수를 계산합니다.

    For each nested array in the grid of seats
      Accumulate a sum - starting at 0 - of the count of '#' characters in each array
    
    Return the sum
    


    시뮬레이터 구축


  • 위에 언급된 과제
  • 를 위해 유사한 기능의 시뮬레이터를 몇 번이나 구축했는지를 생각하면 쉬운 작업처럼 느껴졌습니다.

    Try the simulator for Part 1

    2 부


  • 정말 재미있네요!
  • 새로 필요한 하위 루틴 작성
  • 작업 알고리즘 업데이트 중
  • 시뮬레이터 업데이트 중

  • 정말 재미있는 트위스트!



    8개의 인접한 셀을 확인하는 대신:

    .....
    .!!!.
    .!S!.
    .!!!.
    .....
    


    좌석을 찾거나 방의 경계를 넘어설 때까지 여덟 방향 모두에서 직선으로 체크인해야 합니다.

    !.!.!
    .!!!.
    !!S!!
    .!!!.
    !.!.!
    


    새로 필요한 서브루틴 작성


  • 다음으로 확인한 셀이 방의 경계 내에 있는지 확인합니다
  • .
  • 좌석을 찾거나 방의 경계를 초과할 때까지 직선을 따라 다음 셀을 재귀적으로 확인합니다
  • .

    함수: isAtAValidLocation()




    Expects two parameters
      1. Row index
      2. Column index
    
    Return false, unless:
      Both indices are greater than or equal to 0
      And Row is less than the length of the number of arrays in the outer-most array
      And Column is less than the length of any nested array (they are all the same length)
    


    함수: firstVisibleSeat()




    Expects two parameters
      1. A pair of coordinates representing the direction to travel from an origin point
      2. A pair of coordinates representing the originating row and column indices
    
    Return '.' to indicate 'No seat found', unless:
      The next cell along the path 'isAtAValidLocation'
      If the next cell is at a valid location
        And its value is '.'
          Continue along the path
        Else - its value is not '.'
          Return its value - being either 'L' or '#' 
    


    작업 알고리즘 업데이트


  • 입력을 배열로 처리하기 위한 동일한 설정
  • 어레이 패딩 프로세스 제거

  • 새로운 메인 루프:

    Do at least one time, then again only if an array of cells to switch is not empty:
      Empty the array of cells
      For each cell in the grid of seats:
        Continue along a straight line - starting from each adjacent cell and continuing until either a seat is found or reaching the boundary of the room - and accumulate tallies for each of the three possible characters found: . # L
        If the current cell contains an 'L' and the number of '#'s found is 0
          Add the cell's coordinates to the list of switchers with an instruction to change it's value to '#'
        Else, if the current cell contains an '#' and the number of '#'s found is 5 or more
          Add the cell's coordinates to the list of switchers with an instruction to change it's value to 'L'
    
    For each coordinate and instruction set in the list of switchers
      Update the cell in the grid of seats at the current location to the value specified
    


    시뮬레이터 업데이트



    내 알고리즘의 코드를 복사하여 페이지의 스크립트에 붙여넣는 것 외에도, 어떤 버튼을 눌렀는지에 따라 호출할 부분의 함수를 토글하는 논리를 추가해야 했습니다.

    복사-붙여넣기가 엉성해져서 문제를 해결해야 하는 작은 골칫거리가 생겼습니다.

    전반적으로 큰 문제는 없습니다.

    Try the simulator for Part 2

    좋은 웹페이지 즐겨찾기