매주 Mohammad S. Anwar는 우리 모두가 두 가지 주간 작업에 대한 해결책을 생각해 낼 수 있는 주간 챌린지를 보냅니다. 내 솔루션은 먼저 Python으로 작성된 다음 Perl로 변환됩니다. 이는 우리 모두가 코딩을 연습할 수 있는 좋은 방법입니다.
도전, 나의 솔루션
양의 정수 목록(@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
정수 배열 @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 중국어 웹사이트의 기타 관련 기사를 참조하세요!