함수형 스타일 프로그래밍은 굉장합니다(동형 예제).

이 게시물은 함수형 스타일 프로그래밍에 대한 모양과 느낌을 제공하고 함수형 프로그래밍 방식으로 프로그램을 작성하면 어떤 모습일지 대략적으로 보여줍니다.

엄밀한 함수형 프로그래밍 가이드는 아니지만, 함수형 프로그래밍 마인드로 문제를 처리할 때 얼마나 흥미롭고 강력한지 보여줍니다.

문제



프로그래밍 작업 면접 중에 질문implement an algorithm to detect if 2 strings are isomorphic하는 것은 매우 일반적인 문제이며 이에 대한 많은 답변이 있을 수 있습니다. 다시 해봅시다.

도구


  • 브라우저. 따라서 실행 중인 브라우저에서 F12를 눌러 구현하는 순수한 JavaScript를 작성할 수 있습니다.



  • 요구 사항을 분석하면 실제로 용어isomorphic가 요구 사항을 잘 반영하고 있음을 알 수 있습니다. 즉, 동일한 형태를 갖는다는 의미입니다. 따라서 의미를 표현하는 코드를 작성할 수 있습니다.

    const isomorphic = equalBy(structure)
    


    지금까지 우리는 함수equalBy의 서명을 가지고 있습니다. 구현해 보겠습니다.

    const equalBy = fn => (a, b) => fn(a) === fn(b)
    


    자연스럽고 자기 표현입니다.

    이제 isomorphic 를 자세히 살펴보면 문자열의 구조에만 관심이 있고 그 안의 세부 문자에는 신경 쓰지 않는다는 것을 알았습니다. 그렇다면 문자열의 형식(또는 구조)을 어떻게 표현할까요?

    요구 사항에 제공된 예제를 검토하여 문자열의 문자 인덱스로 문자열의 구조를 표현하는 아이디어를 얻습니다. 이는 세부 문자에서 추상화되도록 숫자로 표현할 수 있습니다. 따라서 다음 코드를 작성합니다.

    const structure = s => [...s].map(c => s.indexOf(c)).join('-')
    


    이 코드 줄은 약간 깁니다. 테스트하고 문서화해 보겠습니다.

    console.assert(structure('aabbcc') === '002244', 'A structure of a string can be expressed through the indices of the characters in it');
    


    지금까지 equalBystructure 가 모두 있으므로 isomorphic 를 실행할 준비가 되었습니다! 이를 보여주기 위해 몇 가지 테스트를 작성할 수 있습니다.

    console.assert(isomorphic('', ''), 'empty strings are isomorphic');
    console.assert(isomorphic('aabbcc', 'aabbcc'), 'strings are always isomorphic with themselves');
    console.assert(isomorphic('aabbcc', 'zzxxyy'), 'if the characters have the same indices sequence, then the strings composed by them are isomorphic');
    console.assert(!isomorphic('aabacc', 'xxyyzz'), 'even if the character indices are the same, however the sequences are not all the same, then the 2 strings composed by them are NOT isomorphic');
    console.assert(!isomorphic('aaabbcc', 'xxyyyzz'), 'if any character indices are different, then the strings composed by them are NOT isomorphic');
    console.assert(!isomorphic('abcdefghijk', 'abcdefghijba'), 'if the lengths are different, then the strings are NOT isomorphic');
    


    우리는 테스트를 실행했고 모두 통과했습니다!



    요약



    따라서 isomorphic에 대한 구현 코드는 총 3줄입니다.

    const equalBy = fn => (a, b) => fn(a) === fn(b)
    
    const structure = s => [...s].map(c => s.indexOf(c)).join('-')
    
    const isomorphic = equalBy(structure)
    

    pointless 코드를 작성하는 방법이라는 것을 알 수 있습니다. 멋진 것 외에도 간단한 확장까지 문제를 우아하게 해결합니다!

    브라우저에서 시도하거나 leetcode에서 확인할 수 있습니다: https://leetcode.com/submissions/detail/465004270/ https://leetcode.com/submissions/detail/530009145/

    좋은 웹페이지 즐겨찾기