2014-06-24 4 views
0

나는 다음과 같은 범위가 :범위 목록을 완성하고 주문 하시겠습니까?

(800..1200) 
(800..1600) 
(800..1700) 
(800..1900) 
(900..1500) 
(1000..2000) 
(2200..2300) 

을 그리고이 같은 배열 싶어 : 범위의 정렬 된 목록입니다

[(800..900), (900..1000), (1000..1200), (1200..1500), (1500..1600), (1600..1700), (1700..1900), (1900..2000), (2000..2200), (2200..2300)] 

예상 배열 (범위) 여기서 범위 [N + 1 ] .min == ranges [n] .max. 우리는 범위 사이에 어떤 간격도 없어야합니다.

이 작업을 수행하는 코드를 작성하는 데 성공했지만 루프의 if/else 목록이 길어서 읽을 수 없습니다. 누군가가 이것을 더 간결하게하는 방법에 대한 아이디어가 있는지 궁금합니다.

+1

[질문하는 방법] (http://stackoverflow.com/help/on-topic)의 # 3을 참조하십시오. 코드의 예와 그 코드가 작동하지 않는 이유에 대한 설명을 제공해야합니다. 그대로, 귀하의 질문은 주제없는 주제입니다. –

+2

첫 번째 범위가 '800 .. 900'이고 두 번째 범위가 '900..1000'이라고 결정할 때 사용하는 기준은 무엇입니까? 제외하지 않으면 도움이되지 않습니다. –

답변

1

이렇게해야합니다.

a = [(800..1200), (800..1600), (800..1700), (800..1900), 
    (900..1500), (1000..2000), (2200..2300)] 
a.each_with_object([]) { |r,a| a << r.first << r.last } 
.uniq 
.sort 
.each_cons(2) 
.to_a 
.map { |a,b| a..b } 
    #=> [800..900, 900..1000, 1000..1200, 1200..1500, 1500..1600, 
    # 1600..1700, 1700..1900, 1900..2000, 2000..2200, 2200..2300] 
+0

흥미로운 thx, 나는 이것을 반복 할 것이다. – Flyingbeaver

+0

감사하지만 녹색 체크 표시가 너무 빨리 나타나는 것을 정말 싫어합니다. 다른 답변을 방해 할 수 있으므로 더 나은 답변 일 수 있습니다. –

+0

진실은 답을 적어두면 답을 찾는데 도움이되었다는 것을 알았습니다. 중간 배열을 사용했지만 한 줄은 사용하지 않았지만 같은 아이디어를 얻었습니다 (고무 유도 프로그래밍)). 어쨌든, 귀하의 답변에 대해 감사 드리고 싶습니다. 앞으로 귀하의 현명한 조언을 기억할 것입니다. – Flyingbeaver

관련 문제