차이 목록 정렬


22

정수 목록의 차이 목록은 연속 멤버의 목록 차이입니다.

예를 들어 차이 목록

1, 3, 2 ,4

이다

2, -1, 2

당신의 임무는 차이 목록을 입력으로 가져 와서 원래 목록이 정렬 된 경우 차이 목록의 모양을 출력하는 것입니다.

예를 들어 차이 목록

2, 1, -2, -1

목록을 나타낼 수 있습니다

2 4 5 3 2

정렬 할 때

2 2 3 4 5

차이점 목록이있는

0 1 1 1

이것은 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.


솔루션이 독창적이라고 보장됩니까?
H.PWiz

@ H.PWiz 그렇습니다.
밀 마법사


1
@ H.PWiz 빠른 증거 : 목록은 첫 번째 요소 값과 결합 된 차이 목록 (DL)에서 완벽하게 재구성 할 수 있으므로 L에서 (FV, DL) 로의 일대일 변환이 있습니다. FV를 임의의 양만큼 증가시키는 것은 그 양을 L의 모든 원소에 첨가하는 것과 동일하므로, 그 비교가 적절하게 단조로운 경우 L의 분류를 변경할 수 없다. 즉, 추가하는 숫자로 인해 정수 오버플로가 발생하지 않는 한 정렬에 영향을 미치지 않습니다.
CR Drost

1
몇 가지 테스트 사례를 추가 할 수 있습니까? [-2, 100, -2, -1]예를 들어에 대해 다른 출력을 제공하는 솔루션이 있습니다.
Shaggy

답변:


16

05AB1E , 4 바이트

.¥{¥

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

설명

.¥{¥
.¥   # Undelta the input list
  {  # Sort it
   ¥ # And get the deltas

Undelta05AB1E는 가장 틈새가 내장되어 있습니다. o0
완전히 인간적인

2
헛소리, 나를 이길. 나는 항상 undelta를 사용하고 싶었습니다.
매직 문어 Urn

16
Undeltaಠ ___ ಠ
비즈니스 고양이

1
"Undelta"는 단순히 누적 합계입니다.
Zgarb

2
@Zgarb Undelta는 목록의 첫 번째 요소로 0을 추가 한 다음 누적 합계 또는 역 델타와 같이 정확히 말했듯이.
매직 문어 Urn

9

파이썬 3NumPy와 , 56 54 53 바이트

@Artyer 덕분에 2 바이트가 줄었습니다 ( sort표준 대신 Numpy 's sorted). 감사 오프하는 1 바이트 @notjagan (이동 0cumsum)

lambda x:diff(sort(cumsum([0]+x)))
from numpy import*

이 코드는 목록 또는 Numpy 배열을 입력하고 Numpy 배열을 출력하는 익명 함수를 정의합니다.

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


1
우와, 오늘 나 한테 새로운 걸 가르쳐 줬어 와의 접근 방식 numpy이 훨씬 길었습니다. 당신이 이미 모자를 씌우고 있기 때문에 나는 이것을 찬성하기 위해 내일 다시 올 것이다. 아주 좋아요!
Mr. Xcoder

@ Mr.Xcoder 감사합니다! 저는 Numpy의 전문가가 아닙니다. Matlab에서 한 일을 방금 따랐습니다. diff(sort([0 cumsum(x)]))(Matlab에서 [ ]연결됨)
Luis Mendo

의무 완수!
Mr. Xcoder

-1 바이트 이동시킴으로써 0cumsum.
notjagan



4

껍질 , 4 바이트

Ẋ-O∫

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

설명

      -- implicit input, e.g                               [2,1,-2,-1]
   ∫  -- cumulative sum                                    [0,2,3,1,0]
  O   -- sort                                              [0,0,1,2,3]
Ẋ     -- apply function to all adjacent pairs in the list  [(0,0),(0,1),(1,2),(2,3)]
 -    --   subtract                                        [0,1,1,1]

델타가없는 다른 언어? 아니면 더 멋진 내장?
Mr. Xcoder

@씨. Xcoder cumsum은 undelta와 같습니다.
H.PWiz

@ H.PWiz 실제로 빈 접두사를 고려하지 않으면 cumsum이 아닙니다.
아웃 골퍼 Erik 14

@EriktheOutgolfer 그렇습니다 scanl(+)0. Haskell 과 마찬가지로 껍데기가하는 일 입니다.
H.PWiz

4

Pyth , 9 바이트

@EriktheOutgolfer 덕분에 -1 바이트 .

.+S+0sM._

테스트 스위트.

Pyth , 10 바이트

.+S.u+YNQ0

온라인으로 사용해보십시오! 또는 더 많은 테스트 사례를 시도하십시오 .


내 (삭제 된) 답변에서와 같이 -1 +0sM._대신 사용할 수 있습니다 .u+YNQ0.
아웃 골퍼 Erik

@EriktheOutgolfer 왜 삭제 했습니까?
Mr. Xcoder

핵심 아이디어가 당신과 너무 비슷하다고 생각했습니다.
아웃 골퍼 Erik

@EriktheOutgolfer 좋아요, 감사합니다
Mr. Xcoder

m=+Z에 대한 동일한 길이 변형 sM._이지만 슬프게도 더 짧을 수는 없습니다.
FryAmTheEggman

4

자바 스크립트 (ES6), 57 56 바이트

@ETHproductions 덕분에 1 바이트 절약

a=>a.map(n=>t-=n,p=t=0).sort((a,b)=>b-a).map(n=>p-(p=n))

데모


.sort((a,b)=>a-b)이것이 델타를 얻는 방법입니까? 빼기로 정렬하여? : P
완전히 인간적인

@totallyhuman 첫 번째 map()는 델타를 제공합니다. 이 코드는 그것들을 정렬합니다. 2 차지도는 새로운 델타를 재구성합니다. JS sort()메소드는 기본적으로 사전 순서를 사용합니다. 따라서 숫자> 9 (슬프게도)에 대한이 특수 콜백이 필요합니다.
Arnauld

그것은 -p+(p=n)내 장비를
갈아 타게

도대체 무엇을 제출 버튼을 누르지 않았다> _ <그러나 어쨌든, 당신은 그 편집으로 바이트를 저장할 수 있다고 생각 합니다 ...
ETHproductions

@ETHproductions 감사합니다 :-)
Arnauld

3

자바 8, 123 바이트

표준 솔루션 : 누적 합계 입력, 정렬 및 차이. 실질적인 구현 요령도 없습니다.

l->{int s=l.length,d[]=new int[s+1],i=0;while(i<s)d[i+1]=d[i]+l[i++];for(java.util.Arrays.sort(d);i-->0;)l[i]=d[i+1]-d[i];}

캐스팅 Consumer<int[]>. 출력이 변형 된 입력입니다.

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

언 골프 람다

l -> {
    int
        s = l.length,
        d[] = new int[s + 1],
        i = 0
    ;
    while (i < s)
        d[i + 1] = d[i] + l[i++];
    for (java.util.Arrays.sort(d); i-- > 0; )
        l[i] = d[i + 1] - d[i];
}

감사의 말

  • 부정한 자동 증가의 마스터 인 Olivier Grégoire 덕분에 -3 바이트
  • Nevay 덕분에 -1 바이트

1
할 수 있습니다 골프 당신이 당신의 증가와 전반적인 계산을 할 위치를 재 배열하여 3 바이트 : l->{int s=l.length,d[]=new int[s+1],i=0;for(;i<s;)d[i+1]=d[i]+l[i++];java.util.Arrays.sort(d);for(i=0;i<s;)l[i]=-d[i]+d[++i];}(SE의 보이지 않는 문자를 조심을 할 때 복사 / 붙여 넣기)
올리비에 그레 구 아르

1
나의 새로운 타이틀 주셔서 감사합니다;) 여기에 더 감소 부정함이 축하의 for(;i>0;)l[i-1]=d[i]-d[--i];(마지막 루프)
올리비에 그레 구 아르

나는 그 루프를 스스로 재 작업 for(;i-->0;)l[i]=d[i+1]-d[i];하여 같은 길이에 도달했다 . 올 업데이트.
Jakob

2
을 사용하여 1 바이트를 저장할 수 있습니다 l->{int s=l.length,d[]=new int[s+1],i=0;while(i<s)d[i+1]=d[i]+l[i++];for(java.util.Arrays.sort(d);i-->0;l[i]=d[i+1]-d[i]);}.
Nevay

아 물론입니다. 감사!
Jakob


2

R , 31 32 바이트

@ user2390246 덕분에 -4 바이트 diffinv

Jarko에서 +5 바이트 cat

cat(diff(sort(diffinv(scan()))))

stdin에서 읽고 stdout에 씁니다. 주어진 시작 값 diffinv의 역수입니다 diff(기본적으로 0). 그것은 이후diff다시 편집 그 가치가 무엇인지는 중요하지 않습니다.

Jarko Dubbeldam이 지적한 것처럼 5 바이트의 비용으로 결과를 올바르게 출력해야했습니다. 아아.

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


그것은 내가 생각했던 것이기도합니다. 이 프로그램을 전체 프로그램으로 실행하면 source아무것도 출력하지 않으므로 인쇄를 처리해야합니다 .
JAD

1
diffinv대신에 cumsum0 을 사용 하지 않아도됩니다.
user2390246

@ user2390246 와우, 아주 좋은! diffinv에 대한 TIL.
주세페

나도! 내가 적용 할 수있는 이전 답변이 있는지 확인하기 위해 빠른 검색을하고있었습니다.
user2390246


1

펄 6 , 46 바이트

{[\+](0,|@_).sort.rotor(2=>-1).flat.map(*R-*)}

시도 해봐

넓히는:

{  # bare block lambda with implicit signature :(*@_)

  [\+](         # triangle reduce using &infix:«+»
    0,          # start with 0
    |@_         # Slip in the arguments from the outer block
  )             #                  (0, 2, 3, 1, 0)

  .sort         # sort the results (0,0,1,2,3)
  .rotor(2=>-1) # group in twos    ((0,0),(0,1),(1,2),(2,3))
  .flat         # flatten          (0,0,0,1,1,2,2,3)
  .map(*R-*)    # grab 2 values at a time, and subtract first from second
                # (0, 1, 1, 1)
}


1

TI 기본 (TI-84 Plus CE), 23 바이트

Prompt X
augment({0},cumSum(LX→X
SortA(LX
ΔList(LX

사용자 입력을 요구합니다. 목록은 앞에 {, 숫자로 구분 ,하고 선택적으로 후행을 입력해야합니다 }.

TI-Basic은 토큰 화 된 언어입니다 . ΔList(cumSum( 2 바이트 토큰 기타 모든 토큰이 각 바이트 하나이다.

실행 예제 ( NAME프로그램 이름 및 {4,-2,7,-4,0}입력) :

prgmNAME
X=?{4,-2,7,-4,0}
               {2 2 1 0 4}

설명:

Prompt X                  # 3 bytes, get list input, store in LX
augment({0},cumSum(LX→X   # 12 bytes, 
          # store the list ({0} prepended to the cumulative sum of LX) to LX
SortA(LX                  # 4 bytes, sort LX ascending
ΔList(LX                  # 4 bytes, implicitly print the difference list of LX

님이 필요하십니까 L?
Zacharý

목록을 저장하지만, 참조 대신 목록의 숫자 변수 X를 참조 할 경우이를 생략 할 때 재커리 @ 당신이 그들을 생략 할 수 있습니다
pizzapants184

1

C ++ (gcc) , 136 바이트

명명되지 않은 일반 람다로서 입력이 같다고 가정 std::list하고 참조 매개 변수를 통해 반환합니다.

[](auto&L){auto r=L.begin(),l=L.insert(r,0);while(r!=L.end())*r+++=*l++;for(L.sort(),l=r=--L.end();--l!=L.begin();*r---=*l);L.erase(l);}

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

언 골프 드 :

[](auto&L){
 auto r=L.begin(),
      l=L.insert(r,0); //adds a zero right in front
 while(r!=L.end())
   *r++ += *l++;       //sum left to right
 for(
  L.sort(),            //sorting invalidates the iterators
  l=r=--L.end();       //so, reinit
  --l!=L.begin();      //decrement l beforehand 
  *r-- -= *l           //diff right to left
 );
 L.erase(l);           //l==L.begin(), so this removes the temporary 0
}

1

Pyth, 8 바이트

.+S+M.uP

데모

.+S+M.uP
.+S+M.uPNQ    Implicit variables
     .u  Q    Apply the following function to the input repeatedly until it
              stops changing, then output the list of values, including the
              starting value.
       PN     Remove the last element. No-op if the list is empty.
   +M         Sum each list. This gives the cumulative sums in reverse order,
              including a 0 at the end for the empty list.
  S           Sort
.+            Deltas

+1 누적 고정 소수점을 사용한 깔끔한 해결 방법입니다. 나는 개인적으로 이것을 생각조차하지 않았다.
Mr. Xcoder

1

TI 기본, 20 바이트

cumSum(augment({0},Ans->L1
SortA(L1
ΔList(L1


1

VB.NET (.NET 4.5), 109 바이트

Sub A(n)
Dim c=n.count-1
For i=1To c
n(i)+=n(i-1)
Next
n.Sort()
For i=c To 1 Step-1
n(i)-=n(i-1)
Next
End Sub

목록을 입력으로 예상하고 직접 수정하는 함수입니다. 그런 다음 원래 매개 변수를 사용하여 출력 할 수 있습니다

  1. 목록을 통해 포워드를 추가하여 원래 목록을 다시 작성합니다 (암시 적 0을 첫 번째 요소로 가정)
  2. 원본 목록을 정렬합니다
  3. 뒤로 이동하여 차이점을 얻습니다 (따라서 다른 목록을 추적 할 필요가 없습니다) (암시 적 인 첫 번째 요소 0은 첫 번째 차이가 가장 작은 요소와 동일 함을 의미합니다)

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


TIO 링크를 업데이트 하시겠습니까?
Taylor Scott

@TaylorScott 어떤 방법으로 업데이트합니까?
Brian J

TIO 링크는 답변과 완전히 다른 코드를 보여줍니다
Taylor Scott

1
@TaylorScott Ahh .... 알겠습니다. TIO가 Mono를 사용하기 때문에 약간의 조정이 필요했지만 .NET 4.5 컴파일러를 사용하고있었습니다
Brian J

1

APL (Dyalog) , 15 14 바이트

ngn 덕분에 -1 바이트 .

2-/⍋⊃¨⊂)0,+\

+\ 누적 합계

0, 0을 붙이다

() 그것에 다음의 암묵적 기능을 적용하십시오 :

 동봉 (여러 항목을 선택할 수 있음)

⍋⊃¨ 인수를 정렬하는 각 인덱스가

¯2-/ 쌍으로 차이를 반전

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


Dyalog '17 사용자 미팅 에서 Code Golf Hackathon 참가자가 발견 한 독창적 인 솔루션 :

¯2-/l[⍋l←+\0,⎕]

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

 입력 프롬프트

0, 0을 붙이다

+\ 누적 합계

l← 로 저장 l

 정렬 할 지수를 찾으십시오 l

l[] 색인으로 사용하십시오l

¯2-/ 쌍으로 차이를 반전


1
이것이 해커 톤에서 허용되는지는 모르겠지만 포인트 프리 스타일로 다시 작성하면 문자를 저장할 수 있습니다. (¯2- / ⍋⊃¨⊂) 0, + \
ngn

@ngn 워크숍의이 부분은 참가자들이 PPCG를 시작하도록하려고했기 때문에 여기의 규칙은 PPCG의 규칙이었습니다. 감사.
Adám





0

Röda, 42 bytes

{i=0{[0];[i]if i+=_}|sort|slide 2|[_2-_1]}

Try it online!

This is similar to the Perl 6 answer. .sort is |sort, .rotor(2=>-1).flat is |slide 2 and .map(*R-*) is |[_2-_1].

Explanation:

{
  i=0 /* initialize variable i */
  /* the following block recreates the original list from differences: */
  {
    [0];       /* push 0 to the stream */
    [i]if i+=_ /* add every number in the stream to i and push i back */
  }|
  sort|    /* sort the numbers */
  slide 2| /* for values i1, i2, i3, ... in the stream
              push pairs i1, i2, i2, i3, ... */
  [_2-_1]  /* calculate difference of numbers in each pair in the stream */
}

The statement [i]if i+=_ is equivalent to

for sfv do
  if i += sfv do
    push(i)
  done
done

The += operator does not push values to the stream, so it is truthy. I could also have used some kind of block (eg. {|j|i+=j;[i]}_) to tie the addition and pushing statements together, but if is shorter.


0

Julia 0.6.0 (34 bytes)

Pretty much a copy of what has been done in R and Python 3

x->diff(sort(cumsum(vcat([0],x))))


0

J, 10 bytes

/:~&.(+/\)

explanation

"sort under scan sum": In J, the Under conjunction &. applies the transformation to its right to the input, then applies the verb to its left (in this case sort /:~) and then does the reverse transformation. That is, J understands how to invert a scan sum, which is exactly what's needed here: the successive differences are the input that, when scan-summed, will produce that scan-sum.

Try it online!

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