그는 이것에 대한 인턴 엘프가 없습니까?

코드 출현 2015 5일차



1 부


  • 마지막이자 첫 번째인 regex 건틀릿?
  • 트리오 regex
  • reduce()every() 모두 마무리하기 위해

  • 마지막이자 첫 번째 정규식 건틀릿?


  • 입력이 문자열 목록임
  • 일부 문자열은 valid입니다.
  • 기타는 그렇지 않습니다
  • 문자열의 적절한 범주를 식별하려면 하나 이상의 regular expression s
  • 를 사용해야 합니다.

    지금까지 여러 가지가 있었습니다.

    그들은 모두 이것을 위해 나를 준비하고 있습니다!

    정규식의 트리오



    contains at least three vowels



    단일 모음 문자와 일치하는 regex는 다음과 같습니다.

    /[aeiou]/
    

    matchAll() 와 결합할 때 일치하는 항목의 수는 3개 이상이어야 합니다.

    [...text.matchAll(/[aeiou]/)].length >= 3
    


    contains at least one letter that appears twice in a row



    임의의 문자를 연속으로 두 번 일치시키는 regex는 다음과 같습니다.

    /(\w)\1/
    

    matchAll() 와 결합할 때 일치하는 항목의 수는 1 이상이어야 합니다.

    [...text.matchAll(/(\w)\1/)].length > 0
    


    does not contain the strings ab, cd, pq, or xy, even if they are part of one of the other requirements


    regex , ab , cd 또는 pq 와 일치하는 xy 는 다음과 같습니다.

    /ab|cd|pq|xy/
    

    matchAll() 와 결합할 때 일치하는 항목의 수는 0이 되는 것이 좋습니다.

    [...text.matchAll(/ab|cd|pq|xy].length == 0
    


    reduce() 및 every()를 모두 마무리합니다.


  • reduce() 문자열
  • nice 카운트를 누적합니다.
  • every() 모든 테스트 통과 확인

  • 자바스크립트 내 알고리즘:

    input.reduce(
      (nice, text) => 
        nice += [
          [...text.matchAll(/[aeiou]/)].length >= 3,
          [...text.matchAll(/(\w)\1/)].length > 0,
          [...text.matchAll(/ab|cd|pq|xy/)].length == 0
        ].every(el => el == true) ? 1 : 0
    , 0)
    


    정답을 생성했습니다!

    파트 1, 1년 전


  • Advent of Code를 발견했을 때 2015년
  • 부터 시작하여 며칠의 퍼즐을 시도했습니다.
  • 5일차는 내가 멈춘 곳이었다
  • 파트 1만 완료했습니다.

  • 그때 내가 한 방법은 다음과 같습니다.

    contains at least three vowels



    각 모음을 문자별로 센다:

    function hasMin3Vowels(str) {
      let vowels = ['a','e','i','o','u']
      let numVowels = 0
      str.split("").forEach(char => {
        if (vowels.includes(char)) {
          numVowels += 1
        }
      })
      return numVowels >= 3
    }
    


    contains at least one letter that appears twice in a row



    다음 문자가 현재 문자와 일치하는 위치를 확인합니다.

    function hasOneLetterTwiceInARow(str) {
      let matches = 0
      str.split("").forEach((char, idx) => {
        if (idx !== str.length - 1) {
          if (char == str[idx + 1]) {
            matches += 1
          }
        }
      })
      return matches > 0
    }
    


    does not contain the strings ab, cd, pq, or xy, even if they are part of one of the other requirements



    잘못된 쌍이 있는지 문자열을 확인합니다.

    function hasNoDisallowedStrings(str) {
      let output = 0;
      let disallowedStrings = ['ab', 'cd', 'pq', 'xy']
      disallowedStrings.forEach(bad => {
        if (str.indexOf(bad) !== -1) {
          output += 1
        }
      })
      return output == 0;
    }
    


    래퍼 기능:

    function isNice(str) {
        return hasMin3Vowels(str) && hasOneLetterTwiceInARow(str) && hasNoDisallowedStrings(str)
    }
    


    래핑 반복자:

    input.map(str => isNice(str))
      .filter(str => str == true)
      .length
    


    이 코드가 좋지 않아 보이지만 이번 라운드에서 어떻게 해결했는지 매우 자랑스럽습니다.

    2 부



    정규식 듀오



    contains a pair of any two letters that appears at least twice in the string without overlapping



    겹치지 않는 연속 문자 쌍을 일치시키는 regex는 다음과 같습니다.

    /(\w)(\w).*\1\2/
    

    matchAll() 와 결합할 때 일치하는 항목의 수는 1 이상이어야 합니다.

    [...text.matchAll(/(\w)(\w).*\1\2/)].length > 0
    


    contains at least one letter which repeats with exactly one letter between them



    패턴 A*A에서 세 문자를 일치시키는 regex는 다음과 같습니다.

    /(\w)(\w)\1/
    

    matchAll() 와 결합할 때 일치하는 항목의 수는 1 이상이어야 합니다.

    [...text.matchAll(/(\w)(\w)\1/)].length > 0
    


    JavaScript에서 내 업데이트된 알고리즘:

    input.reduce(
      (nice, text) => 
        nice += [
          [...text.matchAll(/(\w)(\w).*\1\2/)].length > 0,
          [...text.matchAll(/(\w)(\w)\1/)].length > 0
        ].every(el => el == true) ? 1 : 0
    , 0)
    


    정답을 생성했습니다!

    해냈어!!


  • 두 부분 모두 해결했습니다!
  • 5가지를 사용하여 regex !

  • 이 퍼즐은 내가 새로 찾은 편안함 공예regular expressions의 부인할 수 없는 증거였습니다.

    거의 1년 전에 AoC를 처음 발견한 후 시도했을 때 비regex 방법을 사용하여 파트 1을 거의 풀지 못했고... 파트 2도 시도하지 않았습니다.

    그러나 이날 나는 이 퍼즐을 30분도 안 되어 완성했다. 거의 쉽게 느껴졌습니다!

    잘했어, 자기. 잘했어요.

    좋은 웹페이지 즐겨찾기