이 문제를 해결하는 방법은 간단해 보입니다.
Parse the input into two equal lists of numbers Sort each list in ascending order Compare both values at each index Determine the absolute value after calculating the difference Increment a tally by the absolute value
먼저 각 항목이 숫자인 2개 항목 목록을 만듭니다.
input.split('\n').split(' ').map(Number)
그런 다음 색인을 기준으로 항목을 별도의 목록으로 추출하겠습니다.
let [list1, list2] = [ input.map((_,i) => i == 0), input.map((_,i) => i == 1) ]
첫 번째 실수: 연결 분할.
배열에서는 분할을 호출할 수 없습니다.
map과 같은 반복 메서드 내에서 분할해야 합니다.
input.split("\n").map(...);
두 번째 실수: 공간이 부족합니다.
입력에는 각 숫자 사이에 하나가 아닌 여러 개의 공백이 포함되어 있습니다.
input.split("\n").map((el) => el.split(" ").map(Number));
세 번째 실수: 목록 액세스에 대한 지나친 생각.
내 코드는 중첩된 각 목록이 하나의 요소인 것처럼 작동하고 해당 요소가 목록에서 첫 번째인지 두 번째인지에 따라 부울 값을 반환했습니다.
뭐???!!!
이 코드는 각 목록을 인식하고 첫 번째 또는 두 번째 항목을 유지합니다.
let [list1, list2] = [ input.map(list => list[0]), input.map(list => list[1]), ];
아아, 내 알고리즘은 이제 두 개의 숫자 목록을 생성합니다!
휴, 10개월 동안 안 하다가 좀 녹슬었나봐요.
짧고 간결해야 합니다.
사실 바로 위의 코드에 추가하겠습니다.
let [list1, list2] = [ input.map(list => list[0]).sort((a,b) => a - b), input.map(list => list[1]).sort((a,b) => a - b), ];
예제 입력에서 매력적으로 작동했습니다.
[ 1, 2, 3, 3, 3, 4 ] [ 3, 3, 3, 4, 5, 9 ]
let answer = 0; for (let i = 0; i < list1.length; i++) { answer += Math.abs(list1[i] - list2[i]); }
다음 예에서는 작동합니다: 11
근데 내 퍼즐 입력에도 작동하나요?
그렇습니다!
우후! 금별 하나!
지침에 따르면 다음과 같습니다.
For each number in list 1 For each number in list 2 If there's a match Increment a tally by 1
즉, 목록 2는 목록 2의 길이와 목록 1의 길이를...배로 검사한다는 뜻입니다.
각 항목 1000개: 확인 100만개
나쁘지 않네요. 하지만 그건 불필요한 것 같습니다.
제가 관심 있는 것은 목록 2에 있는 각 숫자의 개수입니다.
그래서 1000개의 숫자를 모두 한 번 확인하고 숫자의 개수에 대한 지도를 구축할 수 있습니다. 그럼 그 목록을 1000번 확인해 보세요.
2000 < 100만
저는 이 접근 방식이 더 마음에 듭니다. 코드로!
예제 목록은 다음과 같습니다.
4, 3, 5, 3, 9, 3
그래서 저는 다음과 같은 객체를 원합니다:
{ 4: 1, 3: 3, 5: 1, 9: 1 }
Part 1 알고리즘의 list2를 사용하여 이 객체를 빌드하려면 축소를 수행해야 합니다.
let counts = list2.reduce((obj, num) => { if (!(num in obj)) { obj[num] = 1 } else { obj[num] += 1 } return obj }, {})
놀랍게도 해당 스니펫은 예상대로 정확하게 작동합니다!
obj의 num에 대한 올바른 구문을 잊어버린 줄 알았는데 그게 전부입니다!
숫자와 관련된 존재 및 값을 확인하는 조건을 사용하는 또 다른 축소:
Parse the input into two equal lists of numbers Sort each list in ascending order Compare both values at each index Determine the absolute value after calculating the difference Increment a tally by the absolute value
점수가 자꾸 틀리네요.
이유가 계속 궁금했어요
인쇄할 값이 점점 더 많은 console.log() 문을 계속 추가했습니다.
예상하지 못한 가치가 계속 나타났어요.
그러다가 봤어요
저는 사용자 정의 카운트 개체가 아니라 list2와 비교하고 있었습니다!
자아에게 큰 펀치를 날립니다. 하지만 첫날에 딱 필요했어요.
작업 코드는 다음과 같습니다.
input.split('\n').split(' ').map(Number)
예제 입력에 대한 정답이 생성됩니다.
내 퍼즐 입력에도 똑같이 적용되기를 바랍니다.
그리고 번개처럼 빠르게 진행되기를 바랍니다!
그렇습니다!
으아아아아아아!!!
일을 시작하는 두 개의 금색 별.
저를 계속 초심자로 만드는 몇 가지 실수도 있습니다.
내가 이 퍼즐을 좋아하는 이유는 바로 이것이다.
2일차도 계속됩니다!
위 내용은 역사가 히스테리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!