주간 도전 137

Challenge , My solutions

그래서 어젯밤 Mohammad가 Black Caps에 패한 인디언을 위로하는 동안 호주에 거주하는 키위로서 나는 매우 행복한 소년이었습니다. 케인 윌리엄슨과 선수들에게 수고했습니다.

작업 #1 › 장기간





장년인 1900년에서 2100년 사이의 모든 연도를 찾는 스크립트를 작성하십시오.

내 솔루션



1752년에 Gregorian calendar으로 전환했을 때 그들은 분명히 컴퓨터를 염두에 두지 않았습니다. 데이트 수학은 정말 짜증납니다. Y2K가 심각하다고 생각했다면 (존재하지 않는) 29/2/2100이 더 나빠질 것이라고 생각합니다. 먼저 2038 date problem을 처리해야 합니다. 그러나 나는 빗나간다.

뉴질랜드와 호주에서는 '장년'과 '53주'라는 용어를 전혀 사용하지 않아서 그 의미를 찾아봐야 했습니다. this article에 따르면 "연도가 목요일에 시작하거나 수요일에 시작하는 윤년인 경우 해당 연도에는 53주가 표시됩니다. 이 주 번호는 일부 유럽 및 아시아 국가에서 일반적으로 사용되지만 그리 많지는 않습니다. 미국에서."

이것은 그 후에 다소 간단한 운동으로 보입니다. 1900년 1월 1일은 월요일이었다는 사실부터 시작합니다. 저는 $year를 1900으로, $day_of_week를 1로 설정했습니다(여기서 0 = 일요일, 6 = 토요일). 윤년에 요일이 4(목요일) 또는 3(수요일)이면 @long_years 배열에 추가합니다.

다음 사실은 내년의 첫날이 현재 연도보다 하루(또는 윤년의 경우 이틀) 늦다는 것입니다. 예를 들어 1900년 1월 1일은 월요일이었으므로 1901년 1월 1일은 화요일이었습니다. 1900년은 윤년이 아님을 기억하십시오. 필요에 따라 $year$day_of_week를 변경하고 2100까지 루프를 계속 실행합니다.

출력을 예제와 비교하면 동일한 결과를 얻을 수 있으므로 잘 되길 바랍니다.




$ ./ch-1.pl 
1903, 1908, 1914, 1920, 1925, 1931, 1936, 1942, 1948, 1953, 1959, 1964, 1970, 1976, 1981, 1987, 1992, 1998, 2004, 2009, 2015, 2020, 2026, 2032, 2037, 2043, 2048, 2054, 2060, 2065, 2071, 2076, 2082, 2088, 2093, 2099


작업 #2 › 라이크렐 수





10 ≤ $n ≤ 1000의 숫자가 주어집니다.

주어진 숫자가 Lychrel number인지 확인하는 스크립트를 작성하십시오. 작업을 단순하게 유지하기 위해 다음 규칙을 적용합니다.
  • 반복 횟수가 500에 도달하면 중지합니다.
  • 숫자 >= 10,000,000이 되면 중지합니다.

  • 내 솔루션



    날짜 수학이 어렵다고 생각했다면 정수론이 마음을 사로잡을 것입니다. Wikipedia 페이지에는 아래 방정식이 포함되어 있는데 어디서부터 시작해야 할지 모르겠습니다!



    그래서 그것은 저에게 무차별 대입 방법입니다. Perl의 장점 중 하나는 숫자와 숫자를 포함하는 문자열 사이의 구별이 거의 존재하지 않는다는 것입니다. 내부적으로는 다르다는 것을 알고 있지만 코딩 관점에서 볼 때 둘 사이의 전환은 매끄럽습니다.

    역방향 함수(스칼라 컨텍스트에서 문자열을 반전)를 사용하여 비교하여 입력이 회문인지 확인합니다. 그렇지 않은 경우 두 숫자를 더하고 일치하거나 위의 규칙에 도달할 때까지 프로세스를 반복합니다.

    예시




    $ ./ch-2.pl 56
    0
    
    $ ./ch-2.pl 57
    0
    
    $ ./ch-2.pl 59
    0
    
    $ ./ch-2.pl 788
    1
    

    좋은 웹페이지 즐겨찾기