나는 수학이 없을 것이라고 들었다

코드 출현 2015 2일 차



1 부


  • 오, 수학이 많을 겁니다.
  • 도구 상자에서 몇 가지 친숙한 도구 사용

  • 오, 많은 수학이있을 것입니다.



    기쁘게도 Advent of Code 전반에 걸친 수학의 대부분은 다양한 과학, 산술 또는 알고리즘 공식 및 증명의 기본 패턴을 기념하는 것이었습니다.

    내 도구 상자에서 몇 가지 친숙한 도구 사용


  • reduce() 누계
  • split() 문자열을 배열로 변환
  • map() 데이터 강제 또는 조작
  • array destructuring 여러 값을 간결하게 추출하고 저장
  • sort() 숫자를 정렬하려면
  • slice() 배열에서 항목의 하위 집합 추출

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

    input.reduce(
      (sqft, box) => {
        let [l, w, h] = box.split('x').map(Number)
        let smallestArea = [l, w, h]
          .sort((a, b) => a - b)
          .slice(0, 2)
          .reduce((a, c) => a * c)
        return sqft += 2*l*w + 2*w*h + 2*h*l + smallestArea
      }
    , 0)
    


    2 부



    사소한 수학적 조정


  • 더 짧은 방정식
  • 그리고 상대적으로 변경되지 않은 알고리즘

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

    input.reduce(
      (sqft, box) => {
        let [l, w, h] = box.split('x').map(Number)
        let smallestPerimeter = [l, w, h]
          .sort((a, b) => a - b)
          .slice(0, 2)
          .map(el => el * 2)
          .reduce((a, c) => a + c)
        return sqft += l*w*h + smallestPerimeter
      }
    , 0)
    


    두 부분 모두 1년 전



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

    function dayTwoPart1(input) {
      return input.map(box => wrappingPaperFor(box))
                  .reduce((acc, curr) => { return acc + curr }, 0)
    }
    
    function dayTwoPart2(input) {
      return input.map(box => ribbonFor(box))
                  .reduce((acc, curr) => { return acc + curr }, 0)
    }
    
    function wrappingPaperFor(box) {
      return surfaceAreaFor(box) + slackFor(box)
    }
    
    function surfaceAreaFor(box) {
      let [l, w, h] = box.split("x").map(i => +i)
      return (2 * l * w) + (2 * w * h) + (2 * h * l)
    }
    
    function slackFor(box) {
      let sortedBox = box.split("x").map(i => +i).sort((a,b) => a - b)
      return sortedBox[0] * sortedBox[1]
    }
    function ribbonFor(box) {
        let [s1, s2, s3] = box.split("x").map(i => +i).sort((a,b) => a - b)
        return (s1 + s1 + s2 + s2) + (s1 * s2 * s3)
    }
    


  • 모두 매우 간단합니다
  • 거의 손해를 입힐 정도
  • 그런 다음 이 퍼즐에는 간단한 수학이 많이 필요했습니다
  • .
  • Day 3과 마찬가지로 두 번째로 작성한 코드가 매우 자랑스럽습니다
  • .

    해냈어!!


  • 두 부분 모두 해결했습니다!
  • 처음에는 매우 분리된 기능적 접근 방식으로...그런 다음 다시 연결되어 설득력 있는 방식으로 접근합니다!

  • 이 퍼즐의 수학은 그다지 흥미롭지 않았지만 놀랍도록 흥미로운 수학을 특징으로 하는 다른 모든 퍼즐에 대한 콜백 역할을 했습니다.

    하루 남았습니다!

    좋은 웹페이지 즐겨찾기