>웹 프론트엔드 >JS 튜토리얼 >역사가 히스테리

역사가 히스테리

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-08 10:38:13712검색

Historian Hysteria

코드 2024의 출현 1일차

1부

웃는 얼굴로 한 해를 시작하는 소프트볼

이 문제를 해결하는 방법은 간단해 보입니다.

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

1단계: 두 개의 숫자 목록 만들기

먼저 각 항목이 숫자인 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 ]

나머지 3단계도 한번에!

let answer = 0;
for (let i = 0; i < list1.length; i++) {
  answer += Math.abs(list1[i] - list2[i]);
}

다음 예에서는 작동합니다: 11

근데 내 퍼즐 입력에도 작동하나요?

그렇습니다!

우후! 금별 하나!

2부

실행 시간을 테스트하는 재미있는 변형

지침에 따르면 다음과 같습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.