중복을 그룹화하여 배열 열거 수 있습니다. 테스트 사례 : Input

이 과제의 목표는 양의 정수 배열을 가져 와서 요소처럼 그룹화하여 해당 인덱스를 열거하는 것입니다.

중복되지 않은 열거는 쌍 배열을 출력하여 수행됩니다 ( (value, index)예 : [3, 4, 13, 9, 2]=>) [[3,1],[4,2],[13,3],[9,4],[2,5]].

그러나 주어진 요소가 두 번째로 나타나면 자체 쌍이 제공되지 않고 대신 첫 번째 그룹에 추가됩니다. 우리가 3 9를 대체 우리 위의 예 경우, 출력에 우리는 제거 할 [9,4]및 교체 [3,1]와 함께 [3,1,4].

출력에서 그룹은 첫 번째 발생 순서로 정렬되어야하며 인덱스는 오름차순이어야합니다. 요소는 색인보다 먼저 그룹에서 첫 번째 여야합니다. 출력은 0 또는 1 인덱싱 될 수 있습니다. 배열에 하나 이상의 요소가 있다고 가정 할 수 있습니다.

테스트 사례 :

Input           | Output (One-indexed)
[3, 2, 2, 3]    | [[3, 1, 4], [2, 2, 3]]
[17]            | [[17, 1]]
[1, 1]          | [[1, 1, 2]]
[1, 1, 2]       | [[1, 1, 2], [2, 3]]
[1, 2, 3, 4]    | [[1, 1], [2, 2], [3, 3], [4, 4]]
[1, 1, 1, 1]    | [[1, 1, 2, 3, 4]]

이것은 이며 가장 적은 바이트 수입니다!



답변

Dyalog APL, 5 바이트

(⊂,)⌸

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

,⌸2 바이트 동안 거의 작동하지만 후행 0이 있습니다.


답변

J , 12 바이트

~.,&.><@I.@=

인덱스가 0입니다.

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

상자로하고있는 모든 작업을 제거 할 수 있다면 바이트 수를 상당히 줄일 수 있습니다. 나는 그것을 알아낼 수 있는지 볼 것입니다.

설명

이것은 설명하기에는 너무 이르다 (더 많은 골프가 있어야한다).

~. ,&.> <@I.@=
             =  Self-classify (comparison of each unique element to array)
            @   Composed with
          I.    Indices of ones (where it's equal)
         @      Composed with
        <       Boxed (how we deal with arrays of unequal length)
   ,&.>         Joined with
      >          Unbox each
   ,             Concatenate
    &.           Box again
~.              Unique elements


답변

05AB1E , 10 바이트

ÙεDIQƶ0K)˜

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

설명

Ù             # remove duplicates
 ε            # apply to each element
  D           # duplicate
   IQ         # compare for equality with input
     ƶ        # multiply each element by its index (1-based)
      0K      # remove zeroes
        )˜    # wrap in a flattened list


답변

파이썬 3 , 83 82 바이트

Mego 덕분에 -1 바이트

lambda x:[[n]+[j for j,m in enumerate(x)if m==n]for n in sorted({*x},key=x.index)]

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


답변

하스켈 , 48 바이트

import Data.List
f l=nub[k:elemIndices k l|k<-l]

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


답변

첨부 , 15 바이트

Flat=>Positions

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

이것은 =>연산자 형식의 흥미로운 사례 입니다 Map. 이 기능 인자가있을 때 fg, Map함수 반환 f => g[x]이상을 x. 즉, RHS가 입력에 적용된 다음 LHS가 매핑됩니다.

내장 Positions은 인덱스로 항목 그룹을 나타내는 배열을 생성합니다. 기본적으로 두 번째 인수가 제공되지 않으면 Positions첫 번째 인수가 사용됩니다. Flat그런 다음 질문에 필요한대로 각 항목에 매핑됩니다.

대체 솔루션

31 바이트

MapArgs[Concat#~Indices,Unique]

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

아주 짧고 내장 된 대안입니다. 추가 인수를 제공 할 수 있다는 점을 제외하고 MapArgs와 같은 함수 Map입니다. 예를 들어 MapArgs[{_1 + _2}, 1..3, 3]입니다 [4, 5, 6]. 마찬가지로 Map두 개의 기능 인수가 제공되면 커리됩니다. 매핑되는 함수 Concat#~Indices는 포크입니다. 이 포크는 Unique입력 항목과 입력 자체에 적용됩니다. 이것은 Concat[_, Indices[_2, _]]( Indices스왑 인수를 통해 ~)로 변환되며 , 이는 매핑되는 요소 ( _)를 _입력 배열에서 해당 요소의 인덱스 _2와 짝을 이룹니다 ( MapArgs)

43 바이트

{Flat=>Zip[Unique[_],Indices[_,Unique[_]]]}

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

이것은 실제로 솔루션 # 1과 # 2의 더 장황한 (그러나 더 읽기 쉬운) 조합입니다.


답변

젤리 , 6 바이트

Q;"ĠṢ$

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

설명:

Q;"ĠṢ$
Q      Keep the first occurrence of each element
     $ Last two links as a monad
   Ġ    Group indices of equal elements, then sort the resulting list of groups by the element they point to
    Ṣ   Sort; used to re-order the list of groups based on first occurrence instead
  "    Vectorize link between two arguments (the first occurrences and the group list)
 ;      Concatenate