이전 연습: 여행 비용를 공평하게 나눠라  다음 연습: 안녕, UI! 작전명: 창을 띄워라

 

계속 쉬운 문제만 푼다. 짧게 금방 풀 수 있어서 좋다.

 

문제

http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110201&format=html

리스트에서 인근한 값들의 차이를 구했을 때 1~N-1의 숫자를 모두 포함할 때 이 리스트를 jolly jumper라 부른다고 한다. 주어진 리스트가 jolly인지 아닌지 판단하는 문제.

 

풀이

그림_4.png

  1. class Array
      def jolly?
        differences.sort == (1...length).to_a
      end
     
      def differences
        self[0..-2].zip(self[1..-1]).map{|x| (x[0] - x[1]).abs }
      end
    end

 

 

logo.png

  1. : differences ( seq -- new-seq )
      [ but-last ] keep rest v- [ abs ] map ;

    : jolly? ( seq -- ? )
      differences natural-sort
      [ length >array [ 1+ ] map ] keep
      = ;

 

 

erlang.gif

  1. % from trip.erl
    subtract(A, B) -> subtract(A, B, []).
    subtract([A|H], [B|T], L) -> subtract(H, T, L ++ [abs(A-B)]);
    subtract([], [], L) -> L.

    differences(A) ->
      List1 = lists:sublist(A, length(A)-1),
      List2 = lists:sublist(A, 2, length(A)),
      subtract(List1, List2).
     
    is_jolly(L) ->
      lists:sort(differences(L)) == lists:seq(1, length(L)-1).

 

 

후기

  • 약간 허전한데, 맞게 푼건가? -_-;
  • 이번에 만든 factor 코드가 살짝 마음에 든다 :)
  • erlang은 여행 비용를 공평하게 나눠라에서 만든 함수를 재활용해서 쉽게 해결되었다.

 

 

Leave a Reply

Website

Email