값 목록에서 범위 결정


18

정렬되지 않은 고유 한 양의 정수 목록이 제공되면 가능한 가장 긴 순차 정수 범위의 가장 짧은 목록을 출력하십시오.

입력

  • 고유 한 양의 정수로 구성된 정렬되지 않은 목록
    • 예 : 9 13 3 11 8 4 10 15
  • 다음 중 하나에서 입력을 가져올 수 있습니다.
    • stdin
    • 명령 줄 인수
    • 함수 인수

산출

  • 한 줄에 stdout 또는 언어와 가장 유사한 출력으로 인쇄 된 정렬 된 범위 또는 개별 값 목록.
    • 둘 이상의 순차 정수 (목록의 위치가 아닌 값에 의한 순차)가있는 경우-를 사용하여 포함 범위로 표시됩니다. 8-11
    • 다른 모든 정수는 다른 표기법없이 간단히 인쇄됩니다.
    • 단일 공간은 출력을 구분합니다
  • 입력에없는 숫자는 출력에 있어서는 3 5 6안됩니다. 예를 들어 존재하지 3-6않기 때문에 단축 할 수 없습니다4

실시 예

성공한:

 IN> 9 13 3 11 8 4 10 15 6
OUT> 3-4 6 8-11 13 15

 IN> 11 10 6 9 13 8 3 4 15
OUT> 3-4 6 8-11 13 15

 IN> 5 8 3 2 6 4 7 1
OUT> 1-8

 IN> 5 3 7 1 9
OUT> 1 3 5 7 9

잘못된:

 IN> 9 13 3 11 8 4 10 15
OUT> 3-15

범위는 입력에없는 값을 포함합니다

 IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15

모든 순차 값은 범위로 표시되어야합니다

 IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15

범위를 분할, 8-9그리고 10-11해야8-11

 IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15

출력이 올바르게 주문되지 않았습니다

규칙

  • 표준 허점은 허용되지 않습니다
  • 당신의 언어가 이것을 할 수있는 기능을 가지고 있다면 그것은 허용되지 않습니다
  • 당신은 전체 프로그램 또는 함수를 작성할 수 있습니다
  • 후행 공백은 중요하지 않습니다

점수

  • 최소 바이트 수

1
첫 번째 문장은 정말 혼란 스럽다. "가장 긴 순차 정수 범위의 가장 짧은 목록을 출력"이라고 말하는 것이 좋습니다. 그렇지 않으면, 좋은 도전입니다!
Nathan Merrill

2
우리는 전에이 문제를 겪었을 것이라고 확신하지만 올바른 검색어를 찾지 못했습니다. 기억 나?
xnor

4
@CoreyOgburn 그런데 PPCG에 게시하라는 메시지는 무엇입니까? 우리는 왜 많은 신규 사용자들이 들어오는 지 알아 내려고 노력하고 있습니다.
xnor

2
@xnor 나는 몇 달 동안 사이트를 감시했다. 내가 사용하는 언어는 대개 답을 얻을 수있는 좋은 후보가 아니며 오늘까지 게시 할 질문이 없었습니다.
Corey Ogburn

1
@ xnor : Maltysen의 숙제 목록과 비슷하지만 동일하지는 않습니다.
Alex A.

답변:


9

파이썬 2, 123120 바이트

N=sorted(map(int,raw_input().split(' ')));print(''.join((''if n+1in N else'-'+`n`)if n-1in N else' '+`n`for n in N)[1:])

입력이 함수 인수로 목록이 될 수있는 경우 (조건문에 대해 mbomb007 및 xnor 감사)

93 90 81 바이트

def f(N):print''.join((' '+`n`,`-n`*-~-(n+1in N))[n-1in N]for n in sorted(N))[1:]

(공백 공백이 허용되는 경우 77 바이트-마지막을 삭제 [1:])


당신은 변경할 수 str(n)하는 `n`파이썬 2로 전환하는 경우, 몇 바이트를 저장
mbomb007

또한 사용하는 대신 입력으로리스트를받는 함수를 만들 수 있습니다 raw_input(), 당신은 변경할 수 있습니다 '-'+`n``-n`. 그리고 이제 Python 2를 사용하고 있으므로 print. 뒤에 괄호를 제거 할 수 있습니다 .
mbomb007

문자열을 하나씩 생성하는 것은 영리합니다. 바이트 저장의 경우 일반적으로 목록 선택 또는 산술 def f(N):print''.join([' '+`n`,`-n`*(n+1 not in N)][n-1 in N]for n in sorted(N))[1:](더 이상 골프화 가능)로 조건부 작업을 수행하는 것이 더 짧습니다 .
xnor

set(N)대신에 사용할 수 있습니다 sorted(N); 이것은 cPython을 사용할 때 가장 작은 것부터 가장 낮은 것까지 올바르게 반복되지만 모든 구현에서 작동하지 않을 수 있으므로 이것이 유효한지 여부에 대한 질문이 있습니다.
KSab

6

자바 스크립트 (ES6) 171 154 140 137 바이트

팁에 대한 edc65와 vihan1086에 감사드립니다! [...n]매우 좋지만 여러 자리 숫자로 인해이 경우에는 작동하지 않습니다.

f=n=>{s=e=o='';n.split` `.map(Number).sort((a,b)=>a-b).map(v=>{s=s||v;if(e&&v>e+1){o+=`${s<e?s+'-'+e:s} `;s=v}e=v});return o+(s<e?s+'-'+e:e)}

ES5의 변형 198 184 183 174 바이트

f=function(n){s=e=o='';n.split(' ').map(Number).sort(function(a,b){return a-b}).map(function(v){s=s||v;if(e&&v>e+1){o+=(s<e?s+'-'+e:s)+' ';s=v}e=v});return o+(s<e?s+'-'+e:e)}


n. 괄호없이 분할하면 완전히 새로운 것입니다! 그러나 [...n]더 좋습니다
edc65

@ edc65 고마워, 그런 식으로 문자열을 풀 수 있다고 생각하지 않았습니다.
rink.attendant.6


...하지만 ... 예제와 함께 작동합니까? 여러 자리 숫자가 있으므로 ""(공백)이 아닌 ""(빈 문자열)로 분할해야합니다. 아마 당신에게 잘못된 팁을 주었을 것입니다
edc65

@ edc65 나는 뭔가 다르게 보였고 테스트 사례가 실패했음을 깨달았다. 그래도 새로운 것을 배우는 것이 좋습니다
rink.attendant.6

4

루비, 86 84 바이트

s=->*a{puts a.sort.slice_when{|i,j|i+1!=j}.map{|e|e.size<2?e:[e[0],e[-1]]*"-"}*" "}

# demo
s[9, 13, 3, 11, 8, 4, 10, 15, 6]
# => 3-4 6 8-11 13 15

이에 대한 문서의 예에서 약간 golfed 버전입니다 slice_when .


4

CJam, 35 바이트

l~${__0=f-ee::=0+0#/((oW>Wf*S+oe_}h

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

l~$     e# Read a line from STDIN, evaluate it and sort the result.
{       e# Do:
  _     e#   Push a copy of the array.
  _0=f- e#   Subtract the first element from all array elements.
  ee    e#   Enumerate the differences: [0 1 4] -> [[0 0] [1 1] [2 4]]
  ::=   e#   Vectorized quality: [i j] -> (i == j)
  0+    e#   Append a zero.
  0#    e#   Push the first index of 0.
  /     e#   Split the array into chunks of that size.
  (     e#   Shift out the first chunk.
  (o    e#   Print its first element.
  W>    e#   Discard all remaining elements (if any) except the last.
  Wf*   e#   Multiply all elements of the remainder by -1.
  S+o   e#   Append a space and print.
  e_    e#   Flatten the rest of the array.
}h      e# Repeat while the array is non-empty.

4

루비, 70 바이트

이와 같은 문제로 인해 Ruby API에서 적절한 메소드를 확인하는 경향이 있으며 오늘은 새로운 메소드를 발견했습니다. Array#slice_when Ruby v2.2에 새로 도입되어이 정확한 상황을위한 것으로 보입니다.

f=->a{puts a.sort.slice_when{|i,j|j-i>1}.map{|x|x.minmax.uniq*?-}*' '}

배열을 정렬하고 적절하게 슬라이스 한 후에는 각 하위 배열을 가져 와서 가장 높은 요소와 가장 낮은 요소에서 문자열을 만든 다음이 전체 배열을 문자열로 결합합니다.

예:

f.call [9,13,3,11,8,4,10,15,6] 인쇄물 3-4 6 8-11 13 15


4

SWI-도입부 165 162 159 바이트

b(Z,C,[D|E]):-Z=[A|B],(A=:=D+1,(B=[],put(45),print(A);b(B,C,[A,D|E]));(E=[],tab(1),print(A);writef('-%t %t',[D,A])),b(B,A,[A]));!.
a(A):-sort(A,B),b(B,_,[-1]).

꽤 나쁘지만 다시 Prolog는 끔찍한 골프 언어입니다.

예 : a([9,13,3,11,8,4,10,15,6]).출력3-4 6 8-11 13 15


3

CJam, 38 33 바이트

@Dennis가 제안한 아이디어와 코드 조각을 사용하는 새로운 버전 :

l~$_,,.-e`{~T+\_T+:T;(_2$+W*Q?S}/

온라인으로 사용해보십시오

입력 형식은 대괄호 안에있는 CJam 배열입니다.

기본 아이디어는 정렬 된 입력 시퀀스에서 단조로운 시퀀스를 먼저 빼는 것입니다.

3  4  8  9 10 11 13 15
0  1  2  3  4  5  6  7  (-)
----------------------
3  3  6  6  6  6  7  8

이 차이에서 같은 간격의 일부인 값은 같은 값을 갖습니다. 이 차이에 CJam RLE 연산자를 적용하면 간격이 직접 열거됩니다.

빼는 순차 값은 출력 중에 다시 추가해야합니다. 내 코드에서 어떻게 수행되는지 완전히 만족하지는 않습니다. 더 우아한 방법으로 몇 바이트를 절약 할 수 있다고 생각합니다.

구간의 출력을 생성하기 위해 최종 값에 대해 음수를 생성하는 Dennis의 아이디어를 사용합니다. - 하고 구간 크기에 따라 하나의 값만 추가 / 생략하면되기 때문에 논리를 단순화합니다. .

설명:

l~    Get input.
$     Sort it.
_,,   Create monotonic sequence of same length.
.-    Calculate vector difference between the two.
e`    Calculate RLE of difference vector.
{     Loop over entries in RLE.
  ~     Unpack the RLE entry, now have length/value on stack.
  T+    Add position to get original value for start of interval.
  \     Bring length of interval to top of stack.
  _T+:T;  Add length of interval to variable T, which tracks position.
  (     Decrement interval length.
  _     Copy it, we need it once for calculating end value, once for ternary if condition.
  2$    Copy interval start value to top...
  +     ... and add interval length - 1 to get end value.
  W*    Negate end value.
  Q?    Output end value if interval length was > 1, empty string otherwise.
  S     Add a space.
}%    End loop.

그것은 RLE를 영리하게 사용합니다! 내 답변에서 범위 처리 및 입력 형식을 빌려서 34 바이트로 줄일 수 있습니다.l~$_,,.-e`{~T+\_T+:T;,f+(\W>Wf*S}/
Dennis

원래 솔루션을 살펴 보았을 때 -코드에 표시되지 않고 조건없이 출력에 들어가는 방법에 대해 약간의 신비가있었습니다 . 이제 나는 그것을 얻는다 : 그것은 최종 값을 음수로 바꾸는 것에서 온다! 나는 이것을 생각해 냈을 것이므로 그것을 복사하는 것에 대해 기분이 좋지 않을 것입니다. 나는 다음에 그것을 배우려고 노력할 것입니다! :)
Reto Koradi 2016 년

그럴 수 있지. 방법에 대한 l~$_,,.-e{~ T + _T + : T (_ 2 $ + W * Q S?} / '즉, 더 많은 유사한 자신의 코드에이고 무게 불구하고 단지 33 바이트?.
데니스

당신이 고집한다면 @Dennis Ok. :) 실제로 간격 종료에 대해 음수 값을 생성한다는 핵심 아이디어를 취하면이를 구현하는 데 매우 간단한 방법처럼 보입니다. 감사.
Reto Koradi

2

커피 스크립트, 178 161 바이트

내 JavaScript 답변과 같습니다. 이해력을 사용하면 코드가 더 짧은 지 알아낼 필요가 있습니다.

f=(n)->s=e=o='';n.split(' ').map(Number).sort((a,b)->a-b).map((v)->s=s||v;(o+=s+(if s<e then'-'+e else'')+' ';s=v)if(e&&v>e+1);e=v);o+(if s<e then s+'-'else'')+e

기발한:

f=(n)->o='';s=e=0;n.split(' ').map(Number).sort((a,b)->a-b).forEach((v,i)->if!i then s=v else(o+=s+(if s<e then'-'+e else'')+' ';s=v)if(v!=e+1);e=v);o+(if s<e then s+'-'else'')+e

1

파이썬 2 126 122 121 바이트

나는 이것이 더 짧아 질 수 있다는 것을 알고 있습니다. 어디를 모릅니다 [#, #, #, #, ..., #]. form의 입력이 필요합니다 .

l=sorted(input());s=`l[0]`;c=0;x=1
while x<len(l):y,z=l[x],l[x-1];s+=(('-'+`z`)*c+' '+`y`)*(y-z>1);c=(y-z<2);x+=1
print s

당신은 exec꽤 자주 해결책을 찾는 것 같습니다 .
mbomb007

@ mbomb007 xnor를 생각하고있을 수도 있습니다.
Kade

1
다음을 교체 할 수 있어야 while x<len(l)while l[x:] 몇 바이트를 저장합니다.
mathmandan 2016 년

1

자바, 191 바이트

void f(int[]a){java.util.Arrays.sort(a);for(int b=a.length,c=b-1,i=0,j=a[0],l=j;++i<b;){if(a[i]!=++j||i==c){System.out.print((l+1==j?l+(i==c?" "+a[c]:""):l+"-"+(i==c?j:j-1))+" ");l=j=a[i];}}}

범위를 확인하고 그에 따라 인쇄합니다. 불행히도 프로그램은 마지막 숫자 또는 범위를 인쇄하지 않고 종료되므로 배열의 마지막 요소에 대해 특별한 경우를 만들어야했습니다.


1

자바, 171162 바이트

String s(int[] n){Arrays.sort(n);int p=0,b=0;String r="",d="";for(int c:n){if(c==++p)b=1;else{if(b==1){r+="-"+--p+d+c;p=c;b=0;}else{r+=d+c;p=c;}d=" ";}}return r;}

입력을 int 배열로 가져오고 공백으로 구분 된 문자열 목록으로 출력을 리턴합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.