행운의 정렬

王林
풀어 주다: 2024-09-03 15:08:15
원래의
1188명이 탐색했습니다.

The lucky sort

주간 챌린지 284

매주 Mohammad S. Anwar는 우리 모두가 두 가지 주간 작업에 대한 해결책을 생각해 낼 수 있는 주간 챌린지를 보냅니다. 내 솔루션은 먼저 Python으로 작성된 다음 Perl로 변환됩니다. 이는 우리 모두가 코딩을 연습할 수 있는 좋은 방법입니다.

도전, 나의 솔루션

작업 1: 행운의 정수

정수 배열 @int가 제공됩니다.

행운의 정수를 찾으면 -1을 반환하는 스크립트를 작성하세요. 둘 이상이면 가장 큰 것을 반환합니다.

행운의 정수는 해당 값과 동일한 배열 빈도를 갖는 정수입니다.

내 솔루션

이 작업은 비교적 간단하므로 많은 설명이 필요하지 않습니다. 저는 각 정수의 빈도에 대한 freq라는 사전(Perl의 해시)을 만듭니다. 그런 다음 freq 키(가장 높은 값부터)를 반복합니다. 정수의 빈도가 값과 같으면 해당 숫자를 반환합니다. 반복자가 소진되면 -1을 반환합니다.

def lucky_integer(ints: list) -> str:
    freq = Counter(ints)

    for i in sorted(freq, reverse=True):
        if i == freq[i]:
            return i

    return -1
로그인 후 복사

$ ./ch-1.py 2 2 3 4
2

$ ./ch-1.py 1 2 2 3 3 3
3

$ ./ch-1.py 1 1 1 3
-1
로그인 후 복사

작업 2: 상대 정렬

@list1과 @list2라는 두 개의 정수 목록이 제공됩니다. @list2의 요소는 고유하며 @list1에도 있습니다.

@list1 항목의 상대적 순서가 @list2 항목의 상대적 순서와 동일하도록 @list1의 요소를 정렬하는 스크립트를 작성하세요. @list2에 누락된 요소는 @list1 끝에 오름차순으로 배치해야 합니다.

내 솔루션

Python에는 목록에 대한 인덱스 함수가 ​​있지만 항목이 목록에 없으면 ValueError 예외가 발생합니다. 따라서 lst에서 val의 위치를 ​​찾으면 반환하고, 없으면 목록의 길이를 반환하는 find_index라는 함수를 만들었습니다.

def find_index(lst: list, val: int):
    return lst.index(val) if val in lst else len(lst)
로그인 후 복사

Perl 솔루션도 동일한 기능을 갖고 있으며 List::MoreUtil의 first_index를 사용하여 위치를 찾습니다.

sub find_index( $lst, $val ) {
    my $idx = first_index { $_ == $val } @$lst;
    return $idx == -1 ? scalar(@$lst) : $idx;
}
로그인 후 복사

첫 번째 목록을 정렬할 때 sorted 기능을 사용합니다. 각 항목은 인덱스 위치와 정수의 튜플로 정렬됩니다. 이렇게 하면 결과 목록의 첫 번째 부분이 두 번째 목록의 위치에 따라 정렬되고 나머지 값은 숫자별로 정렬됩니다.

def relative_sort(list1: list, list2: list) -> list:
    return sorted(list1, key=lambda i: (find_index(list2, i), i))
로그인 후 복사

Perl 솔루션은 동일한 논리를 사용하지만 완전히 다른 구문을 사용합니다.

sub main ($lists) {
    my $list1 = $lists->[0];
    my $list2 = $lists->[1];

    my @solution = sort {
        find_index( $list2, $a ) <=> find_index( $list2, $b )
          or $a <=> $b
    } @$list1;
    say '(', join( ', ', @solution ), ')';
}
로그인 후 복사

명령줄을 통한 입력의 경우 정수 목록이어야 하는 JSON 문자열을 사용합니다.

$ ./ch-2.py "[[2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5],[2, 1, 4, 3, 5, 6]]"
(2, 2, 1, 4, 3, 3, 5, 6, 7, 8, 9)

$ ./ch-2.py "[[3, 3, 4, 6, 2, 4, 2, 1, 3],[1, 3, 2]]"
(1, 3, 3, 3, 2, 2, 4, 4, 6)

$ ./ch-2.py "[[3, 0, 5, 0, 2, 1, 4, 1, 1],[1, 0, 3, 2]]"
(1, 1, 1, 0, 0, 3, 2, 4, 5)
로그인 후 복사

위 내용은 행운의 정렬의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿