코드 2021의 출현--잠수!--수수께끼
6020 단어 tutorialcppchallengeadventofcode
이 새 게시물에 대해 2021년 12월 2일부터'스쿠버다이빙!'이라는 제목으로 이 문제를 해결할 예정이다.나는 C++로 해결 방안을 제시하지만 추리는 다른 언어에 응용할 수 있다.
셀프 마케팅: 내 website에서 컴퓨터 과학과 프로그래밍에 관한 다른 글을 찾을 수 있다😉
제1부
문제.
이 문제의 전체 버전은 Advent of Code website에서 직접 찾을 수 있습니다. 저는 여기서 문제의 본질만 설명합니다.
소나기를 이용해 우리 주위의 환경을 식별한 후 첫날, 우리는 지금 우리 잠수함과 함께 이동하고 싶다.이를 위해 잠수함은 세 가지 지령을 이해할 수 있다.
forward X
은 horizontal position
을 X단위로 늘린다.down X
은 depth
을 X단위로 늘린다.up X
은 depth
을 X단위로 줄인다.depth
과 horizontal position
의 최종 위치를 계산해야 한다.이 문제(그리고 사이트)에 대한 답은 하나뿐입니다. 우리는 반드시 우리가 찾으려는 두 개의 값을 곱해야 합니다. 결과는 바로 우리의 답입니다.솔루션
따라서 우리는 두 가지 일을 할 수 있어야 한다.
depth
또는 horizontal position
C++에서는 다음과 같이 표시됩니다.#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
, isDownInstruction
과 isUpInstruction
이 처리하여 우리가 읽고 있는 현재 명령을 식별할 수 있습니다.명령을 실행하는 for 순환에서 우리는 문제에서 명령의 정의에 따라 상응하는 값을 수정합니다:
substr
함수 호출은 명령과 관련된 숫자를 문자열로 추출할 수 있도록 합니다.std::stoi 함수 호출은 문자열을 실제 숫자로 변환하여 변수를 가감 연산할 수 있습니다.마지막으로, 우리는 지령 목록에서 추출한 정보를 포함하는 두 변수를 곱해서 필요한 결과를 표시합니다.
교란기
문제 해결:
퀴즈 정답은 1746616입니다.
제2부분
문제.
분명히 이전의 계산 방법은 틀렸다😛
그래서 우리는 지금 다른 변수를 추적해야 한다.
aim
!이 지침은 다음과 같이 설명해야 합니다.설령 우리가 새로운 변수를 가지고 있다 하더라도 최종 결과는 여전히 잠수함의
depth
과 horizontal 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 position
과 aim
을 수정했다.필요한 경우 file versioned on GitHub의 전체 코드를 볼 수 있습니다.😉
교란기
문제 해결:
퀴즈 정답은 1741971043입니다.
결론
이 글의 해결 방안은 프로그램을 실행할 수 있는 모든 원본 코드를 포함하지 않고, 단지 이 문제를 해결하는 원본 코드의 재미있는 부분일 뿐이라는 것을 알 수 있다.만약 당신이 처음부터 끝까지 프로그램을 보고 싶다면, 당신은 나의 GitHub account을 방문하여 완전한 해결 방안을 탐색하고, 평론이나 질문을 추가할 수 있으며, 만약 당신이 원한다면, 당신이 본문을 읽는 플랫폼에서 이것도 내가 문장의 질을 향상시키는 데 도움이 될 것이다.
본문을 읽어주셔서 감사합니다. 제가 다음 글을 쓰기 전에 좋은 하루 되세요.😉
재미있는 링크
Reference
이 문제에 관하여(코드 2021의 출현--잠수!--수수께끼), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/10xlearner/advent-of-code-2021-dive-puzzle-2-4nig텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)