코드 2021의 출현--잠수!--수수께끼

안녕하세요!저는 Xavier Jouvenot입니다. 여기는 Advent Of Code 2021의 긴 시리즈에 관한 두 번째 부분입니다.
이 새 게시물에 대해 2021년 12월 2일부터'스쿠버다이빙!'이라는 제목으로 이 문제를 해결할 예정이다.나는 C++로 해결 방안을 제시하지만 추리는 다른 언어에 응용할 수 있다.
셀프 마케팅: 내 website에서 컴퓨터 과학과 프로그래밍에 관한 다른 글을 찾을 수 있다😉

제1부


문제.


이 문제의 전체 버전은 Advent of Code website에서 직접 찾을 수 있습니다. 저는 여기서 문제의 본질만 설명합니다.
소나기를 이용해 우리 주위의 환경을 식별한 후 첫날, 우리는 지금 우리 잠수함과 함께 이동하고 싶다.이를 위해 잠수함은 세 가지 지령을 이해할 수 있다.
  • forward Xhorizontal position을 X단위로 늘린다.
  • down Xdepth을 X단위로 늘린다.
  • up Xdepth을 X단위로 줄인다.
  • 잠수함은 이미 프로그램 지령이 있기 때문에, 우리는 우리가 어디로 가는지 알고, depthhorizontal position의 최종 위치를 계산해야 한다.이 문제(그리고 사이트)에 대한 답은 하나뿐입니다. 우리는 반드시 우리가 찾으려는 두 개의 값을 곱해야 합니다. 결과는 바로 우리의 답입니다.

    솔루션


    따라서 우리는 두 가지 일을 할 수 있어야 한다.
  • Dell에 대한 명령 결정
  • 우리가 읽은
  • 명령에 따라 depth 또는 horizontal positionC++에서는 다음과 같이 표시됩니다.
    #include <array>
    #include <cassert>
    #include <iostream>
    #include <string>
    #include <string_view>
    
    constexpr std::array<std::string_view, 1000> input = { /* ... */ };
    
    constexpr bool isForwardInstruction (const std::string_view instruction) { return instruction.substr(0, 7) == "forward" ;}
    constexpr bool isDownInstruction (const std::string_view instruction) { return instruction.substr(0, 4) == "down" ;}
    constexpr bool isUpInstruction (const std::string_view instruction) { return instruction.substr(0, 2) == "up" ;}
    
    int main()
    {
        size_t horizontalPosition{0}, depth{0};
    
        for(const auto& instruction : input)
        {
            if(isForwardInstruction(instruction)) { horizontalPosition += std::stoi(instruction.substr(8).data()); continue; }
            if(isDownInstruction(instruction)) { depth += std::stoi(instruction.substr(5).data()); continue; }
            if(isUpInstruction(instruction)) { depth -= std::stoi(instruction.substr(3).data()); continue; }
            assert(false); // Unkwnow input
        }
    
        std::cout << "The solution is: " << (horizontalPosition * depth) << std::endl;
    
        return 0;
    }
    
    보시다시피 첫 번째 단계는 3개의 함수 isForwardInstruction, isDownInstructionisUpInstruction이 처리하여 우리가 읽고 있는 현재 명령을 식별할 수 있습니다.
    명령을 실행하는 for 순환에서 우리는 문제에서 명령의 정의에 따라 상응하는 값을 수정합니다: substr 함수 호출은 명령과 관련된 숫자를 문자열로 추출할 수 있도록 합니다.std::stoi 함수 호출은 문자열을 실제 숫자로 변환하여 변수를 가감 연산할 수 있습니다.
    마지막으로, 우리는 지령 목록에서 추출한 정보를 포함하는 두 변수를 곱해서 필요한 결과를 표시합니다.
    교란기
    문제 해결:
    퀴즈 정답은 1746616입니다.

    제2부분


    문제.


    분명히 이전의 계산 방법은 틀렸다😛
    그래서 우리는 지금 다른 변수를 추적해야 한다. aim!이 지침은 다음과 같이 설명해야 합니다.
  • 하강 X 목표 X 개 단위를 증가시킵니다.
  • 상향 X 목표 X 개 단위를 감소합니다.
  • forward X는
  • 수평 위치 X 단위 증가.
  • 그것은 너의 목표를 X로 곱해서 너의 깊이를 증가시킨다
    설령 우리가 새로운 변수를 가지고 있다 하더라도 최종 결과는 여전히 잠수함의 depthhorizontal position을 곱한 결과이다.😉

    솔루션


    제1부분의 해결 방안에 대해 코드는 사실상 약간의 수정만 했다!우리가 해야 할 일은 모든 명령과 관련된 코드를 바꾸는 것이다. 이것은 for 순환의 코드가 현재 다음과 같다는 것을 의미한다.
    if(isDownInstruction(instruction)) { aim += std::stoi(instruction.substr(5).data()); continue; }
    if(isUpInstruction(instruction)) { aim -= std::stoi(instruction.substr(3).data()); continue; }
    if(isForwardInstruction(instruction))
    {
        const auto units = std::stoi(instruction.substr(8).data());
        horizontalPosition += units;
        depth += units * aim;
        continue;
    }
    
    문제에서 말한 바와 같이 앞의 두 지령에서 변수 aim을 수정했고 마지막 지령에서 우리는 depth을 고려했고 horizontal positionaim을 수정했다.
    필요한 경우 file versioned on GitHub의 전체 코드를 볼 수 있습니다.😉
    교란기
    문제 해결:
    퀴즈 정답은 1741971043입니다.

    결론


    이 글의 해결 방안은 프로그램을 실행할 수 있는 모든 원본 코드를 포함하지 않고, 단지 이 문제를 해결하는 원본 코드의 재미있는 부분일 뿐이라는 것을 알 수 있다.만약 당신이 처음부터 끝까지 프로그램을 보고 싶다면, 당신은 나의 GitHub account을 방문하여 완전한 해결 방안을 탐색하고, 평론이나 질문을 추가할 수 있으며, 만약 당신이 원한다면, 당신이 본문을 읽는 플랫폼에서 이것도 내가 문장의 질을 향상시키는 데 도움이 될 것이다.
    본문을 읽어주셔서 감사합니다. 제가 다음 글을 쓰기 전에 좋은 하루 되세요.😉

    재미있는 링크

  • continue documentation
  • constexpr documentation
  • std::array documentation
  • std::string_view documentation
  • std::stoi
  • range-based for loop documentation
  • Advent of Code – Day 2
  • 10xlearner website
  • 좋은 웹페이지 즐겨찾기