사이버 공간의 폭발물
코드 출현 2016 9일 차
1 부
같은 날, 다른 해
2017 Day 9은 유사한 주제의 문제인 문자 스트림 처리를 제공했습니다.
이번에 독특한 측면은 다음과 같습니다.
루프 사양 작성
Set answer to 0
Set pointer to 0
Do as long as pointer is not beyond the length of the input string
Increment answer and pointer depending on the value at pointer:
1. Value is (
Create marker as an empty string
Append to marker one character at a time for all characters after the ( and before the next )
Split the resulting string at the x into an array of two strings
Coerce each string to a number
Increment answer by the product of both numbers
Increment pointer by the sum of the length of marker, the first of the two numbers, and 2
2. Value is anything else
Increment answer by 1
Increment pointer by 1
Return answer
내가 가장 이해하기 힘들었던 방정식:
Increment pointer by the sum of the length of marker, the first of the two numbers, and 2
코드를 약간 수정한 후 코드에서 휴식을 취한 후 내 알고리즘이 작동하는 방식을 고려하여 우승 요소를 발견했습니다.
각 단위 테스트를 실행한 다음 내 퍼즐 입력
그런 다음 내 퍼즐 입력에서 실행합니다.
JavaScript의 핵심 루프:
let answer = 0, pointer = 0
while (pointer < input.length) {
switch (input[pointer]) {
case "(":
let marker = ""
for (let j = pointer + 1; input[j] !== ')'; j++) {
marker += input[j]
}
let [chars, times] = marker.split('x').map(Number)
answer += chars * times
pointer += marker.length + 2 + chars
break;
default:
answer++
pointer++
}
}
return answer
2 부
여전히 길이지만 지금은...재귀?
그래서...좋고 나쁜 소식인 것 같아요.
두 번째 예를 더 자세히 연구해야 합니다.
X(8x2)(3x3)ABCY
X
는 정상입니다. 합계1
를 더합니다.(8x2)
대상 (3x3)ABC
16
를 더하고 Y
로 이동하는 대신decompress
해야 합니다.(3x3)
대상 ABC
decompress
를 시도하면 3
가 됩니다.(3x3)ABC
압축해제 길이는 98x2
대신 이제 9x2
= 18
18
를 더한 다음 Y
로 이동Y
는 정상입니다. 합계1
를 더합니다.1 + 18 + 1 = 20
흠. 그것은 복잡해 보인다.
하지만 이 작업을 수행하려면 Part 1 알고리즘을 약간만 조정하면 된다는 직감이 있습니다.
재귀를 사용하도록 알고리즘 업데이트
answer
와 chars
의 곱만큼 times
를 증가시키는 대신 함수 호출에서 반환된 숫자만큼 answer
를 증가시키겠습니다. 바로 뒤의 문자열pointer
그게 다인 것 같아!
각 단위 테스트를 실행한 다음 내 퍼즐 입력에서
그런 다음 내 퍼즐 입력에서 실행합니다.
JavaScript의 새로운 핵심 루프:
function decompress(stream) {
let answer = 0, pointer = 0
while (pointer < input.length) {
switch (input[pointer]) {
case "(":
let marker = ""
for (let j = pointer + 1; input[j] !== ')'; j++) {
marker += input[j]
}
let [chars, times] = marker.split('x').map(Number)
answer += times * decompress(
stream.slice(
pointer + marker.length + 2,
pointer + marker.length + 2 + chars
)
)
pointer += marker.length + 2 + chars
break;
default:
answer++
pointer++
}
}
return answer
}
내 재귀 알고리즘이 작동하는 방식에 대한 애니메이션:
해냈어!!
Reference
이 문제에 관하여(사이버 공간의 폭발물), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rmion/explosives-in-cyberspace-mph텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)