아마도 화재 위험

코드 출현 2015 6일차



18일이 아닌 이유는 무엇입니까?


  • 18일은 즉시 6일을 참조합니다
  • .
  • 둘 다 라이트 그리드 테마의 퍼즐입니다
  • .
  • 별 4개 중 2개를 받을 자신이 있고 4개를 모두 받을 수 있기를 바랍니다
  • 시작해 봅시다!

  • 1 부


  • 라이트 그리드 퍼즐? 그게 무슨 뜻인지 알잖아!
  • 예기치 않은 규칙 변형이 있는 경우 규칙을 다시 확인
  • 이 퍼즐을 풀기 위해 사용할 도구
  • 작업 알고리즘 작성

  • 라이트 그리드 퍼즐? 그게 무슨 뜻인지 알잖아!


  • 이진 값의 중첩 배열
  • 값을 토글하는 중첩된 루프for
  • 인접 셀 검사 알고리즘
  • 라이트 쇼를 볼 수 있는 시뮬레이터

  • 예상치 못한 규칙 변형의 경우 규칙을 다시 확인합니다.



    예상치 못한 사항:
  • 1000개의 행, 각각 0으로 시작하는 이진 값을 포함하는 1000개의 셀 포함
  • 범위 내의 모든 값을 0, 1 또는 현재 값의 반대 값으로 만들지 여부를 나타내는 명령
  • 내 알고리즘이 규칙을 따를 수 있는지 여부를 확인하는 체크포인트

  • 이 퍼즐을 풀기 위해 사용할 도구



    다음 도구를 사용하여 이 프로그램을 작성할 시간입니다.
  • Array 명령 유형을 결정하는 방법
  • regex 각 직사각형 경계
  • 를 정의하는 4개의 좌표를 추출합니다.
  • new Array() 1000x1000 그리드 생성
  • 중첩된for 각 명령에 대한 루프가 표시등을 조작합니다
  • .

    작동하는 알고리즘 작성



    1000x1000 그리드 생성:

    let grid = new Array(1000)
      .fill(null)
      .map(
         el => new Array(1000)
          .fill(null)
          .map(el => 0)
      )
    


    지침 목록을 통한 각 반복 내에서 각 영역의 네 모서리를 추출합니다.

    let [minX, minY, maxX, maxY] = [
      ...instruction.matchAll(/\d+/g)
    ].map(el => +el[0])
    


    명령 유형에 따른 제어 흐름:

    switch (instruction.split(' ')[1]) {
      case 'on':
        // turn on
        break;
      case 'off':
        // turn off
        break;
      default:
        // toggle
    }
    


    각 셀의 값 변경:

    for (let row = minY; row <= maxY; row++) {
      for (let col = minX; col <= maxX; col++) {
        // turn on
        grid[row][col] = 1
    
        // turn off
        grid[row][col] = 0
    
        // toggle
        grid[row][col] = 1 - grid[row][col]
      }
    }
    


    켜져 있는 모든 표시등 계산:

    return [
      ...grid.map(row => row.join('')).join('').matchAll(/1/g)
    ].length
    


    모두 실행하면 정답이 생성되었습니다!

    2 부


  • 살짝 아쉬운 느낌
  • 4줄의 코드 업데이트

  • 약간 실망한 느낌


  • 조명이 메시지나 그림을 드러내길 바랐습니다
  • 대신 조명이 약간 더 복잡해집니다
  • .
  • 그리고 여전히 카운팅 게임입니다

  • 네 줄의 코드 업데이트



    각 셀의 값 변경:

    for (let row = minY; row <= maxY; row++) {
      for (let col = minX; col <= maxX; col++) {
        // turn on
        grid[row][col]++
    
        // turn off
        grid[row][col] = grid[row][col] == 0 ? 0 : grid[row][col] - 1
    
        // toggle
        grid[row][col] += 2
      }
    }
    


    켜져 있는 모든 표시등 계산:

    return grid.reduce(
      (total, row) => total += row.reduce(
        (sum, brightness) => sum + brightness, 0
      ), 0
    )
    


    예상대로 정답을 생성했습니다!

    해냈어!!


  • 두 부분 모두 해결했습니다!
  • 이 여정을 통해 더욱 친숙해진 몇 가지 알고리즘 도구를 사용했습니다!
  • 저는 시뮬레이터를 만들지 않기로 했습니다. 퍼즐에 대한 어떤 것도 조명을 보는 것이 흥미로운 것을 드러내는 것을 나타내지 않기 때문입니다!

  • 나는 이미 18일차가 좀 더 어렵다는 것을 알고 있습니다.

    나는 여전히 이 이틀 동안 별 4개를 모두 얻을 수 있기를 희망합니다!

    좋은 웹페이지 즐겨찾기