일요일에 Totient 번호

주간 챌린지



Challenge , My solutions

작업 1: 지난 일요일





해당 연도의 매월 마지막 일요일을 나열하는 스크립트를 작성하십시오.

내 솔루션



날짜 및 시간 계산만큼 어렵지는 않지만 날짜 수학은 어렵습니다. 빠른refresher 우리가 알고 있는 일, 월, 연도는 1582년 10월 교황 그레고리오 13세에 의해 율리우스력을 수정하고 대체하기 위해 도입되었습니다. 내가 제공한 두 가지 솔루션은 처음부터 그루지야 달력을 가정했기 때문에 이전 날짜에 대해 잘못된 결과를 제공합니다.

내 솔루션에서는 datetime의 date module을 사용합니다. 지정된 연도에 대해 매월 말일(매월 1일 + 1개월 - 1일)을 계산합니다. 또한 요일(월요일은 1, 일요일은 7)도 얻습니다. 마지막으로 마지막 날부터 요일을 기재하여 마지막 일요일을 제작합니다. 마지막 날이 일요일인 경우 7일을 빼지 않도록 % 7를 사용합니다.

Perl 솔루션의 경우 Date::Calc module 을 사용합니다. 이것은 Days_in_Month 기능을 가지고 있기 때문입니다. 월의 마지막 날을 조금 더 쉽게 계산할 수 있습니다. Python 솔루션과 달리 함수는 객체를 생성하지 않습니다. 여기에는 장단점이 있습니다.




$ ./ch-1.py 
2022-01-30
2022-02-27
2022-03-27
2022-04-24
2022-05-29
2022-06-26
2022-07-31
2022-08-28
2022-09-25
2022-10-30
2022-11-27
2022-12-25


과제 2: 완벽한 토션트 수





처음 20개Perfect Totient Numbers를 생성하는 스크립트를 작성합니다.

내 솔루션



이 솔루션을 과도하게 설계했을 수 있습니다. 첫 번째 시도는 실행하는 데 거의 4분이 걸렸습니다. 내 최종 솔루션은 Python에서 4½초, Perl에서 13초가 걸렸습니다.

즉, 내 솔루션에 대해 자세히 설명해야 합니다. 처음부터 시작하겠습니다. 나는 primes (목록), factors (세트의 사전) 및 totient (정수의 사전)의 세 가지 전역 변수를 정의합니다. 이들은 주로 우리가 이미 계산한 숫자의 캐싱 결과에 사용됩니다.

그런 다음 각 변수를 채우는 세 가지 함수가 있습니다. 그들 모두는 숫자를 입력으로 사용합니다. is_prime 숫자는 소수인 경우 primes 목록에 추가됩니다. 이것은 숫자가 나머지 없이 이미 발견된 소수로 나눌 수 있는지 확인하여 수행됩니다. get_factors 함수는 숫자를 구성하는 소수 집합을 반환합니다. 예를 들어 숫자 18의 경우 {2, 3}(2 × 3 × 3) 집합을 반환합니다.
get_totients 함수는 1과 상대 소수가 1인 숫자 사이의 정수 수를 반환합니다(즉, 해당 숫자의 최대 공약수는 1입니다). get_factors 함수가 집합을 반환하므로 교차 메서드를 사용하여 공통 소수가 있는지 확인할 수 있습니다.

다음으로 is_ptn 함수가 있습니다. 이것은 get_totients 함수를 사용하여 숫자의 상대적인 소수의 수를 계산하고 1에 도달할 때까지 while 루프에서 재귀적으로 수행합니다. 마지막으로 총계를 원래 숫자와 비교하고 일치하면 True를 반환하고 False를 반환합니다. 그렇지 않으면.

마지막으로 이러한 유형의 도전에 대한 일반적인 래퍼인 main 함수가 있습니다. solutions 목록과 15개의 숫자가 될 때까지 계속되는 증가하는 while 루프가 있습니다.

Perl 코드는 거의 동일합니다. 적절한 경우 전역 변수 대신 state 함수를 사용하고 두 배열을 비교할 때 none 함수를 사용합니다. 이것이 두 코드 세트 간의 주요 성능 차이라고 생각합니다.




$ ./ch-2.py 
3, 9, 15, 27, 39, 81, 111, 183, 243, 255, 327, 363, 471, 729, 2187, 2199, 3063, 4359, 4375, 5571

$ ./ch-2.pl 
3, 9, 15, 27, 39, 81, 111, 183, 243, 255, 327, 363, 471, 729, 2187, 2199, 3063, 4359, 4375, 5571

좋은 웹페이지 즐겨찾기