주간 챌린지 #080::Haskell

Haskell로 PWC #080을 풀면서 Raku로도 더 간단한 방법이 있다는 것을 깨달았습니다.

표준 하스켈 모듈에서 Data.Set을 사용하여 작업 #1을 해결할 수 있습니다.
Set and SetHashReview을 읽는 동안 Raku에 PWC #076이 있다는 것을 간신히 기억합니다.

아래 코드는 하스켈에서 작업 #1의 솔루션입니다.

작업 #1



...
{- tested with:
runhaskell ch-1.hs 5 -2 2 0
-}

smallestPostiveNumber ints = -- result "1" with empty list
  (head.dropWhile (isJust.((flip Set.lookupIndex) (Set.fromList ints)))) [1..]
...

더 짧을 수 있습니다 :-)

[1..].first({@*ARGS.Set$_}).say

나는 "∞"가 실제로는 4바이트라고 생각하지만 "∌"는 "(cont).not"보다 약간 짧습니다.

하스켈에서 작업 #2를 해결하는 동안
양쪽 다 비교할 필요가 없다는 걸 깨닫고..
한 방향만 필요합니다!

작업 #2




countCandies []    = 0
countCandies ranks = defaultCandies + extraCandies
  where
    leftGroup = init ranks
    rightGroup = tail ranks
    defaultCandies = length ranks
    extraCandies =
      sum $ zipWith (\l r -> if l /= r then 1 else 0) leftGroup rightGroup


내가 작성한 원래 코드는 다음과 같습니다.

    extraCandies1 =
      sum ( zipWith (\l r -> if l < r then 1 else 0) leftGroup rightGroup )
    extraCandies2 =
      sum ( zipWith (\l r -> if l > r then 1 else 0) leftGroup rightGroup )

그리고 나서.. "저게 뭐였지?""/="? (/=는 Perl/Raku의 "!="와 동일)

즉, raku에서도 코드를 줄일 수 있습니다!


sub MAIN{(|@_,|(|@_.rotor(2=>-1).grep({[!=] $_}))).elems.say}

하지만 아내는 내가 지금 웃고 있는 이유를 이해하지 못했습니다.
p.) 언젠가 CodeBlock에서 "raku"를 사용할 수 있기를 바랍니다. (지금은 "펄"을 사용하고 있습니다)

좋은 웹페이지 즐겨찾기