망치질 목록

DDD
DDD원래의
2024-12-30 16:34:15544검색

Hammering lists

주간 챌린지 301

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

도전, 나의 솔루션

작업 1: 가장 큰 숫자

양의 정수 목록(@ints)이 제공됩니다.

주어진 목록의 모든 요소를 ​​가장 큰 숫자로 배열하고 반환하는 스크립트를 작성하세요.

내 솔루션

과도하게 생각하는 것일 수도 있지만 말처럼 쉽지는 않습니다.

한 가지 옵션은 모든 순열을 계산하고 어느 숫자가 가장 큰지 확인하는 것입니다. 그러나 더 많은 정수를 추가하면 리소스가 많이 소모됩니다. 13개의 정수가 있다면 60억 개가 넘는 순열이 있습니다. 그래서 나는 이것을 가능한 해결책에서 배제합니다.

그래서 해야 할 일은 정수를 정렬하고 결합하여 결과를 출력하는 것입니다. Python은 문자열과 정수를 다르게 처리하므로 정렬된 목록을 문자열로 변환하고 결합한 후 다시 정수로 변환해야 합니다.

def largest_number(ints: list) -> int:
    sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True)
    return int(''.join(map(str, sorted_ints)))

정렬의 경우 조금 복잡합니다. 두 번째 제공된 예에서는 3, 30, 34가 모두 주어진 정수임을 알 수 있습니다. 이를 위해 항목(최고에서 최저) 34, 3, 30을 주문하면 가장 큰 숫자가 얻어지는 것으로 알고 있습니다.

number_sort 함수의 경우 정수를 문자열 s1 및 s2로 변환합니다. 그러면 s1과 s2의 연결인 정수 c1이 있고, c2는 s2와 s1의 연결입니다.

c1이 c2보다 작으면 -1을 반환합니다. 더 크면 1을 반환하고, 같으면 0을 반환합니다. 정렬 함수는 이 정보를 사용하여 필요에 따라 목록을 정렬합니다.

def number_sort(i1: int, i2: int) -> int:
    s1 = str(i1)
    s2 = str(i2)

    c1 = int(s1 + s2)
    c2 = int(s2 + s1)

    if c1 < c2:
        return -1
    if c1 > c2:
        return 1

    return 0

Perl 코드가 훨씬 간단합니다 :)

sub number_sort() {
    return "$a$b" <=> "$b$a";
}

$ ./ch-1.py 20 3
320

$ ./ch-1.py 3 30 34 5 9
9534330

작업 2: 해밍 거리

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

주어진 정수 배열의 모든 정수 쌍 사이의 해밍 거리의 합을 반환하는 스크립트를 작성하세요.

두 정수 사이의 해밍 거리는 이진 표현이 서로 다른 위치의 수입니다.

내 솔루션

이전 작업에서 Python이 정수와 문자열을 다른 유형으로 처리하는 방법을 언급했습니다. Perl의 장점 중 하나는 모든 의도와 목적을 위해 변수 입력에 대해 걱정할 필요가 없다는 것입니다. 내부적으로 다르게 저장되더라도 Perl은 무엇을 해야 할지 알고 있습니다.

Perl 5.10과 Perl 5.16(내가 대부분의 Perl 개발을 수행한 버전)에는 두 가지 주목할만한 예외가 있습니다. 하나는 문자열의 경우 "10", 정수의 경우 10을 출력하는 JSON 모듈입니다.

다른 하나는 비트 연산입니다. Perlop 페이지에서 105 | 150(2개의 정수)은 255이고 "105" | "150"(두 개의 문자열)은 155입니다.

그래서 Perlop 페이지를 다시 읽었을 때 Perl의 이후 버전에서 이 문제가 해결된 것을 보고 깜짝 놀랐습니다. 이제 Perl 5.22에서 실험적이며 Perl 5.28에서 사용할 수 있는 비트 단위 기능이 있습니다. 이렇게 하면 비트 연산자가 항상 값을 정수로 처리하고 문자열 기반 비트에 새로운 연산자가 있게 됩니다.

어쨌든 당면한 작업으로 돌아가세요. 이를 위해 두 정수의 모든 조합을 계산합니다. 각 조합에 대해 두 값의 XOR(배타적 논리합)을 수행하고 이를 이진수로 변환한 후 이진수 표현에서 1의 개수를 셉니다.

def largest_number(ints: list) -> int:
    sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True)
    return int(''.join(map(str, sorted_ints)))

def number_sort(i1: int, i2: int) -> int:
    s1 = str(i1)
    s2 = str(i2)

    c1 = int(s1 + s2)
    c2 = int(s2 + s1)

    if c1 < c2:
        return -1
    if c1 > c2:
        return 1

    return 0

위 내용은 망치질 목록의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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