퍼즐 입력을 보다가 겁이 많이 났습니다.
그런 다음 1부에서 해야 할 일을 읽고 잠시 마음이 편해졌습니다.
간단한 정규 표현식을 사용하면 됩니다!
괄호를 피해야 한다는 것을 기억해야 했고, 그러면 다음과 같은 정규식을 얻을 수 있었습니다.
/mul\((\d*),(\d*)\)/g
이제 각 일치 항목에 대해 적절한 추출과 계산을 수행해야 합니다
전체 작업 코드는 다음과 같습니다.
let total = [...input.matchAll(/mul\((\d*),(\d*)\)/g)].reduce( (total, match) => { total += match .slice(1, 3) .map(Number) .reduce((a, b) => a * b); return total; }, 0 );
예제 입력에 대한 정답을 생성합니다.
퍼즐 입력을 시도하면...
정답!!!
심호흡...........
...........2부
입력이 다양한 단어로 가득 차 있기 때문에 고려해야 할 모든 종류의 새로운 규칙이 추가될 것이라고 생각했습니다.
다행히 유효한 mul 구문의 시작과 끝 역할을 하는 두 개의 새로운 단어가 있습니다.
이제 각 do() 및 don't()를 색인화하고 구문 분석할 mul 문에 대한 올바른 부분을 검색하여 유효한 문을 분리하는 연습처럼 느껴집니다.
정규식을 사용하여 do() 및 don't()의 모든 항목을 일치시키고 싶습니다.
/don't\(\)|do\(\)/g
그러면 입력 문자열의 경로를 따라 교대로 체크포인트가 있어야 합니다.
그렇다면 do()와 don't() 체크포인트 사이의 하위 문자열을 추출하고 mul을 확인할 수 있습니다.
예제와 전체 입력을 모두 확인하겠습니다.
플래그와 해당 인덱스를 분리하는 알고리즘은 다음과 같습니다.
let flags = [...input.matchAll(/don't\(\)|do\(\)/g)].map((el) => { return [el[0], el.index]; });
확인됨:
좀 더 복잡해졌습니다.
활성화되기 시작하므로 인덱스 0부터 첫 번째 dont()까지 가져와야 합니다. 그래서 그 색인을 찾아야 해요. 그리고 해당 하위 문자열을 확인하세요.
이후부터는 모든 후속 don't()를 건너뛰고 다음 do()를 찾을 수 있습니다.
그것을 새로운 시작 인덱스로 삼아 다음 don't()를 찾아야 합니다. 그곳이 나의 새로운 종착역이다. 해당 하위 문자열을 확인하세요.
그리고 반복: 다음 do() 찾기, 다음 don't() 찾기, 하위 문자열 확인
이것은 마치 while 루프처럼 느껴집니다.
알고리즘을 작성해 보면 더 자세한 내용을 알 수 있습니다.
패턴이 부족한 do-don't 발생 순서를 처리하기 위한 다양한 조건:
/mul\((\d*),(\d*)\)/g
다행히도 예제 입력에 대한 정답이 생성됩니다.
퍼즐 입력을 처리한 후 무엇이 생성되나요?
...
정답!!!
하지만 확인하기 전에 확인할 하위 문자열의 각 시작 및 끝 인덱스를 확인하기 위해 콘솔 로깅 문을 추가했습니다.
배열의 플래그 순서와 비교해봤습니다.
모든 것이 괜찮아 보여서 제출했습니다.
그리고 정답을 맞췄어요!
정말 즐겁고 보람찬 기분이네요!
또 이른 아침. 또 힘들게 얻은 금별 2개.
4일차까지!
위 내용은 고민해 보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!