주간 챌린지 #082 태스크 #1::(Raku)

8282 단어

작업 #1 › 공통 요소



제출자: Niels van Dijke

두 개의 양수 $M과 $N이 주어집니다.

주어진 숫자의 모든 공통 요소를 나열하는 스크립트를 작성하십시오.
예 1:

Input:
    $M = 12
    $N = 18

Output:
    (1, 2, 3, 6)

Explanation:
    Factors of 12: 1, 2, 3, 4, 6
    Factors of 18: 1, 2, 3, 6, 9



Example 2:

Input:
    $M = 18
    $N = 23

Output:
    (1)

Explanation:
    Factors of 18: 1, 2, 3, 6, 9
    Factors of 23: 1


생각보다 정말 쉬웠어요... 더 쉽다고 생각하는 작업 #2와는 정반대입니다.

N = 1000이 주어지면 아래와 같은 일련의 제수를 얻을 수 있습니다.

> [ 1 .. 1000 ].grep({ 1000 %% $_ })
(1 2 4 5 8 10 20 25 40 50 100 125 200 250 500 1000)


원하는 경우 for 루프 또는 "gather and take"을 사용할 수 있습니다.

두 제수를 모두 찾는 작업이 끝나면 다음을 생성할 수 있습니다.
교차를 포함하는 집합

> [ 1 .. 12 ].grep({ 12 %% $_ }) (&) [ 1..18 ].grep({ 18 %% $_ })
Set(1 2 3 6)


값만 가져옵니다.

([ 1 .. 12 ].grep({ 12 %% $_ }) (&) [ 1..18 ].grep({ 18 %% $_ })).keys.sort
(1 2 3 6)


infix (&), infix ∩
Challenge #076 Task #2에서 볼 수 있듯이 code 동안 "∩"중위사를 사용했습니다.
나는 Raku에서 this perl code과 같은 것을 썼습니다. 하지만 "Set"을 사용하면 큰 차이나 약간 빠른 차이를 볼 수 없었습니다. 😂 그래서 "raku가 더 빠른 것을 주면 왜 내 코드를 사용해야합니까?"라고 생각하여 간단한 줄로 변경했습니다. 아주 편리한 연산자!!

gcd 중위



그러나 우리는 Raku에 gcd가 있으므로 두 제수를 모두 만들 필요가 없습니다.

with [gcd] (12,18) { [ 1..$_ ].grep(-> \k { $_ %% k }) }
(1 2 3 6)


최종 코드




sub MAIN ( *@n where { @n.elems == 2 and @n.all ~~ Int and @n.all > 0 } ) {
    with [gcd] @n {
        say( [1.. $_].grep(-> \k {$_ %% k}));
    }
}


여전히 확실하지 않은 경우 "any"를 사용할 수 있습니다.

sub MAIN ( *@n where { @n.elems == 2 and @n.all ~~ Int and @n.all > 0 } ) {
    say( [1.. @n.min].grep({any(@n)%%$_}) );
}


읽어주셔서 감사합니다~!

좋은 웹페이지 즐겨찾기