진공 상태의 완벽한 구형 주택

코드 출현 2015 3일 차



1 부


  • 마지막 4방향 퍼즐
  • 내가 전부인 것 같아 Set()

  • 마지막 4방향 퍼즐


  • 입력은 문자열이며 각각은 N , E , S , W 네 방향 중 하나를 나타냅니다.
  • 각 이동은 XY
  • 을 따라 위치를 나타냅니다.
  • 여러 이동이 이전에 방문한 위치를 가로지를 가능성이 있습니다
  • .
  • 방문한 고유 위치의 수를 알아야 합니다
  • .

    모든 준비가 된 것 같습니다()


  • Set()를 사용하여 방문한 고유한 X|Y 위치
  • 를 축적합니다.
  • 이동할 때마다 위치를 업데이트하고 세트에 추가하려고 합니다
  • .
  • 마지막으로 Set()의 항목 수를 확인합니다.

  • 자바스크립트 내 알고리즘:

    let directions = { '^': [-1,0], '>': [0,1], 'v': [1,0], '<': [0,-1] }
    let houses = new Set()
    let location = [0,0]
    houses.add(location.join('|'))
    input.forEach(char => {
      location = [
        location[0] + directions[char][0],
        location[1] + directions[char][1],
      ]
      houses.add(location.join('|'))
    })
    return houses.size
    


    정답을 생성했습니다!

    파트 1, 1년 전



    이것은 처음에 이 퍼즐을 풀었을 때 JavaScript에서 작동하는 전체 알고리즘이었습니다.

    let houses = { '0,0': 1 }
    let x = 0, y = 0
    
    input.split("").forEach(dir => {
      if (dir == "^") {
        y -= 1
      } else if (dir == ">") {
        x += 1
      } else if (dir == "v") {
        y += 1
      } else if (dir == "<") {
        x -= 1
      }
      if (!houses.hasOwnProperty(`${x},${y}`)) {
        houses[`${x},${y}`] = 0
      }
      houses[`${x},${y}`] += 1;
    })
    
    return Object.values(houses).length
    


  • 나는 몰랐다 Set() s
  • 상대 좌표 변경 사항을 사전에 캡슐화할 만큼 정통하지 않았습니다
  • .
  • 그래서 객체를 사용하여 각 방문 좌표를 저장하고 일부 제어 흐름을 사용하여 위치를 업데이트해야 했습니다
  • .

    내, 내가 얼마나 멀리 왔는지!

    2 부



    모듈로는 이것을 쉽게 만듭니다


  • 다른 모든 캐릭터는 이제 하나 또는 다른 파일럿의 지시 사항입니다
  • .
  • 따라서 한 쪽에는 짝수 문자가 있고 다른 쪽에는 홀수 문자가 있습니다
  • .
    modulo 를 사용하면 짝수는 다음과 같습니다.

    Number % 2 == 0
    


    홀수는 다음과 같습니다.

    Number % 2 == 1
    


    따라서:
  • 요소가 2개인 배열을 사용하겠습니다. [0,1]
  • 인덱스가 짝수 또는 홀수인 숫자만 포함하도록 방향을 필터링합니다
  • .
  • 그런 다음 동일한 Set()를 사용하여 [0,0]부터 시작하여 결과 절반 크기 목록을 처리합니다.

  • 자바스크립트 내 알고리즘:

    let directions = { '^': [-1,0], '>': [0,1], 'v': [1,0], '<': [0,-1] }
    let houses = new Set()
    let paths = [0,1]
    paths.forEach(i => {
      let location = [0,0]
      houses.add(location.join('|'))
      input
        .filter((_, index) => index % 2 == i)
        .forEach(char => {
          location = [
            location[0] + directions[char][0],
            location[1] + directions[char][1],
          ]
          houses.add(location.join('|')
        )
      })
    })
    return houses.size
    


    정답을 생성했습니다!

    파트 2, 1년 전



    이것은 처음에 이 퍼즐을 풀었을 때 JavaScript에서 작동하는 전체 알고리즘이었습니다.

    let houses = { '0,0': 2 }
    let x1 = 0, y1 = 0, x2 = 0, y2 = 0;
    
    input.split("").forEach((dir, idx) => {
      if (idx % 2 == 1) {
        if (dir == "^") {
          y2 -= 1
        } else if (dir == ">") {
          x2 += 1
        } else if (dir == "v") {
          y2 += 1
        } else if (dir == "<") {
          x2 -= 1
        }
        if (!houses.hasOwnProperty(`${x2},${y2}`)) {
          houses[`${x2},${y2}`] = 0
        }
        houses[`${x2},${y2}`] += 1;
      } else {
        if (dir == "^") {
          y1 -= 1
        } else if (dir == ">") {
          x1 += 1
        } else if (dir == "v") {
          y1 += 1
        } else if (dir == "<") {
          x1 -= 1
        }
        if (!houses.hasOwnProperty(`${x1},${y1}`)) {
          houses[`${x1},${y1}`] = 0
        }
        houses[`${x1},${y1}`] += 1;
      }
    })
    return Object.values(houses).length
    


  • 희소식: 저는 modulo를 사용할 만큼 요령이 있었습니다!
  • 그러나 2요소 배열을 활용하고 forEach() 코드의 중복을 줄일 수 있을 만큼 충분히 정통하지 않습니다
  • .

    실력의 증명, 지식의 축적, 알고리즘의 성장!

    해냈어!!


  • 두 부분 모두 해결했습니다!
  • 처음에 사용한 것보다 더 설득력 있는 코드를 사용했습니다!

  • 뒤를 돌아보고 아마추어 코드처럼 느껴지는 것을 보는 것만큼 보람 있는 일은 거의 없었습니다.

    좋은 웹페이지 즐겨찾기