#펄 주간 챌린지 #74

4566 단어 perl
다시 한 번 안녕하세요. 다음은 Perl Weekly Challenge에 대한 또 다른 게시물입니다. 이번에는 Perl 5에서 두 가지 과제를 모두 수행했습니다.

나는 둘 다 라이브 코딩했습니다.
  • 챌린지-74, 작업 1:
  • 챌린지-74, 작업 2:
  • 파트 1: https://www.twitch.tv/videos/716304993
  • 파트 2: https://www.twitch.tv/videos/716329311


  • 작업 1은 어떻게 생겼습니까?

    package Majority;
    
    use strict;
    use warnings;
    
    use List::MoreUtils 'frequency';
    
    sub element {
    # Majority element in the list is the one that appears more than floor(size_of_list/2).
        my ( $self, @A ) = @_;
        my $majority_element = -1;
    
        my $floor = @A / 2;
    
        my %frequencies = frequency @A;
    
        for my $element ( @A ) {
            if ( $frequencies{$element} > $floor ) {
                $majority_element = $element;
                last;
            }
        }
    
        return $majority_element;
    }
    
    1;
    


    매우 간단한 모듈입니다. List::MoreUtils를 사용하여 주파수를 얻었고 거기에서 매우 간단했습니다. 라이브 코딩을 보면 문서화에 약간 어려움을 겪었음을 알 수 있습니다. Mohammad Anwar가 결과를 지켜보면서 나 같은 사람들을 위해 POD를 변경하기 위해 모듈에서 PR을 제기하여 더 명확하게 만들었습니다!

    두 번째 챌린지의 경우 내 모듈은 다음과 같습니다.

    package FNR;
    
    use strict;
    use warnings;
    
    use List::MoreUtils 'frequency';
    
    sub from_string {
        my ( $self, $string ) = @_;
        my $sequence = '';
    
        my $end = length $string;
    
        for my $offset ( 1 .. $end ) {
            my $chars = substr $string, 0, $offset;
            $sequence .= $self->_fnr($chars);
        }
    
        return $sequence;
    }
    
    sub _fnr {
        my ( $self, $chars ) = @_;
        my @characters = split '', $chars;
        my %frequencies = frequency( @characters );
    
        for my $key ( reverse @characters ) {
            return $key if $frequencies{$key} == 1;
        }
    
        return '#';
    }
    
    1;
    


    이 경우 작업을 두 가지 방법으로 나누는 것이 즐거웠습니다.

    첫 번째 방법은 문자열 조작을 수행했습니다. 하위 문자열 주위를 반복합니다. 실제 FNR을 결정하기 위해 다시 List::MoreUtils의 빈도 함수를 사용하는 첫 번째 메서드에서 호출되는 두 번째 "비공개"메서드입니다.

    저는 두 가지 모두에서 취한 TDD 접근 방식에 만족했습니다. 다음은 두 번째 작업에 대한 테스트 파일입니다.

    use Test2::V0 -target => 'FNR';
    
    subtest 'from_string()' => sub {
        subtest 'Example 1' => sub {
            note "Input: ‘ababc’";
            note "Output: ‘abb#c’";
            is $CLASS->from_string('ababc'), 'abb#c',
                'The first example is correct';
        };
    
        subtest 'Example 2' => sub {
            note "Input: ‘xyzzyx’";
            note "Output: ‘xyzyx#’";
    
            is $CLASS->from_string('xyzzyx'), 'xyzyx#',
                'The second example is correct';
    
        };
    };
    
    subtest '_fnr()' => sub {
        my %tests = (
            'a' => 'a',
            'ab' => 'b',
            'aba' => 'b',
            'abab' => '#',
            'ababc' => 'c'
        );
    
        while ( my ( $input, $expected ) = each %tests ) {
            is $CLASS->_fnr($input), $expected, "$input should return $expected";
        }
    };
    
    done_testing;
    
    


    두 번째 하위 테스트는 해시에 내 입력과 예상 출력이 있는 스타일로 작성한 다음 주변을 반복하고 테스트를 반복합니다. 복합적인 축복입니다. 나는 주로 수동 테스트를 선호하고 입력하고 예상하고 모두 모았습니다. 하지만 이 경우에는 말이 되는 것 같았습니다.

    위에서 말했듯이; 이 과제를 해결해서 기뻤습니다.
  • 문자열 주변의 루핑 해결
  • FNR 부분 해결

  • 파트 1을 먼저 수행하면 솔루션에 대해 걱정하지 않고 문제를 탐색하는 데 도움이 되었습니다. 챌린지의 예제는 루프를 보여주므로 도움이 되었습니다. 비디오에서 볼 수 있듯이; 나는 그것을 재현할 수 있었다.

    fnr 부분을 해결하는 것은 "flakey tests"문제에 부딪혔기 때문에 흥미로웠습니다. 나는 일정 시간을 통과한 테스트를 받았습니다. 왜요? 내가 해시의 키 주위를 돌고 있었기 때문에… 그리고 해시는 무작위 순서를 가지고 있습니다. 테스트에서 실패하는 한 가지 상황이 있었기 때문에 이것은 흥미로웠습니다. 배열(순서가 고정됨) 주위를 반복하도록 변경하면 문제가 해결되었습니다.

    linux watch 명령을 통해 테스트를 반복적으로 실행하면 잠재적인 문제에서 벗어날 수 있습니다. 수동으로 실행했다면; 또는 최종 스크립트만 테스트했습니다. 그런 다음 엣지 케이스를 놓쳤을 수 있습니다. 미래의 Lance를 위한 교훈; 시험에 합격한 후에도 반복적으로 시험하는 것은 좋은 일입니다.

    어쨌든… twitch 또는 youtube 비디오를 확인하십시오. 솔루션을 자세히 확인하려면 PerlWeeklyChallenge git repo에 있습니다: https://github.com/lancew/perlweeklychallenge-club/tree/branch–1/challenge-074/lance-wicks/perl

    좋은 웹페이지 즐겨찾기