빈도별로 목록 그룹화


26

정수 목록이 주어지면 가장 먼저 나타나는 요소를 그룹화 한 다음 목록의 각 고유 요소가 한 번 그룹화 될 때까지 다음으로 가장 많이 그룹화하십시오.


예 :

입력: [1,2,3]

산출: [[1,2,3]]


입력: [1,1,1,2,2,3,3,4,5,6]

산출: [[1],[2,3],[4,5,6]]


입력: [1,1,1,4,5,6,6,6,7,7,8,8,8,8,8,8,8,9,5,6,5,6,5,6,5,6,-56]

산출: [[6, 8],[5],[1],[7],[9,4,-56]]


입력: []

산출: []


입력: (empty input)

산출: ERROR/Undefined/Doesn't matter


규칙

  • 그룹화는 최대 주파수에서 최소 주파수로 진행해야합니다.
  • 그룹화의 내부 순서는 임의적입니다 (EG 예제 3이 [8,6]대신 사용할 수 있음 ).
  • 이것은 , 가장 낮은 바이트 수의 승리입니다.

관련


1
출력이 문자열 형식 일 수 있습니까? 즉. 목록의 목록이지만 각 숫자는 정수 대신 문자로 표시됩니다.
mb7744 2018 년

답변:



7

수학, 43 바이트

Union/@SortBy[l=#,f=-l~Count~#&]~SplitBy~f&

온라인으로 사용해보십시오! (수학 사용)

또는

SortBy[Union[l=#],f=-l~Count~#&]~SplitBy~f&

5
내장이 없습니까?
매직 문어 Urn

GatherBy나는 언어를 모르는하지 않도록 때문에, 옵션.
Magic Octopus Urn

1
@carusocomputing 원래 목록에서 처음 나타나는 요소별로 그룹을 정렬하므로 나중에 그룹을 정렬해야합니다. 목록을 먼저 정렬하면 바이트를 저장할 수 있습니다 SplitBy( 처음으로 한 SortBy경우 실제로 더 복잡 할 것입니다 GatherBy).
Martin Ender

흥미 롭기 때문에 "최대에서 최소로 정렬해야한다"는 말이 엉망입니까?
Magic Octopus Urn

@carusocomputing 정확합니다.
Martin Ender 2016 년

5

파이썬 2 , 145,141 바이트

import collections as c,itertools as i;o=lambda n:lambda l:l[n]
print[map(o(0),g)for _,g in i.groupby(c.Counter(input()).most_common(),o(1))]

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

이것은 몇 년 동안 읽은 후 처음으로 제출 한 것입니다.

기본적으로 모든 요소를 카운터 에 나열하고 (목록의 각 요소 수를 사전으로) .most_common () 은 항목을 내림차순으로 정렬합니다. 그 후에는 항목을 올바른 목록으로 형식화하기 만하면됩니다.

ovs 덕분에 4 바이트가 절약되었습니다 .


4
PPCG에 오신 것을 환영합니다 :). 내가했던 것처럼 중독되지 마십시오.
Magic Octopus Urn

자신의 itemgetter 함수를 만드는 것은 가져 오는 것보다 4 바이트 더 짧습니다.o=lambda n:lambda l:l[n]
ovs

5

자바 스크립트 (ES6), 95 (101) 바이트

a=>a.map(x=>(o[a.map(y=>n+=x!=y,n=0)|n]=o[n]||[])[x*x+(x>0)]=x,o=[])&&(F=o=>o.filter(a=>a))(o).map(F)

방법?

각 소자를 위해 X 입력 어레이의 우리 계산할 수 N 의 요소 다르다는 X를 :

a.map(y => n += x != y, n = 0) | n

우리는 인덱스 nx 를 사용하여 배열 o 를 채 웁니다 .

(o[n] = o[n] || [])[x * x + (x > 0)] = x

편집 : JS는 음의 배열 인덱스를 지원하지 않기 때문에 x * x + (x > 0)양의 인덱스를 강제 하려면 수식 이 필요합니다 .

이것은 우리에게 빈도별로 그룹화되고 가장 빈번한 순서에서 가장 빈번한 순서로 원본 목록의 고유 한 요소를 포함하는 배열의 배열을 제공합니다.

그러나 외부 배열과 내부 배열에는 필터링하려는 빈 슬롯이 많이있을 수 있습니다. o 와 각 요소에 적용되는 함수 F 로이를 수행합니다 .

F = o => o.filter(a => a)

테스트 사례


나는 Set당신에게 바이트를 절약 한다고 생각한다 a=>a.map(e=>(r[n=0,a.map(f=>n+=e!=f),n]||(r[n]=new Set)).add(e),r=[])&&r.filter(s=>s).map(s=>[...s]).
Neil

@Neil 이것은 현재의 접근법과는 상당히 다릅니다. 어쩌면 새로운 답변으로 게시해야합니까?
Arnauld 2018 년

나는 o[n]배열에서 세트로 변경하는 것이 그렇게 다르다고 생각하지 않았지만 어쨌든 @RickHitchcock의 대답을 이미 골랐으므로 그다지 중요하지 않습니다.
Neil



2

클로저, 74 바이트

#(for[[_ g](sort-by(comp - key)(group-by val(frequencies %)))](map key g))

꽤 장황 해 보인다 : /


나를 이길 수 있습니다 (그리고 몇 바이트 씩 나를 이길 수 comp -있습니다. 다른 언어만큼 짧지는 않지만 Clojure에 "group-by"와 "frequencies"가 내장되어 있기 때문에 재미 있다고 생각했습니다.
MattPutnam

작업 설명을 읽을 때 50 또는 60 바이트를 원했지만 실제 구현은 약간 까다로 웠습니다.
NikoNyrh

2

펄 6 , 43 바이트

*.Bag.classify(-*.value).sort».value».key

그것을 테스트

넓히는:

*                   # WhateverCode lambda (this is the input)
                    # [1,1,1,2,2,3,3,4,5,6]

.Bag                # turn into a Bag
                    # (1=>3,5=>1,4=>1,3=>2,6=>1,2=>2).Bag

.classify(-*.value) # classify by how many times each was seen
                    # {-2=>[3=>2,2=>2],-3=>[1=>3],-1=>[5=>1,4=>1,6=>1]}

.sort\              # sort (this is why the above is negative)
                    # {-3=>[1=>3],-2=>[3=>2,2=>2],-1=>[5=>1,4=>1,6=>1]}

».value\            # throw out the classification
                    # ([1=>3],[3=>2,2=>2],[5=>1,4=>1,6=>1])

».key               # throw out the counts
                    # ([1],[3,2],[5,4,6])

와우, 난 항상 잊어 버려 Bag, 좋은 하나!
Magic Octopus Urn

2

배쉬 + GNU 유틸리티, 71 61

sort|uniq -c|sort -nr|awk '{printf$1-a?"\n%d":",%d",$2;a=$1}'

줄 바꿈으로 구분 된 목록으로 입력하십시오. 쉼표로 구분 된 값의 개행으로 구분 된 목록으로 출력합니다.

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


2

MATL , 9 바이트

9B#uw3XQP

입력 값은 ;분리 자로 사용되는 열 벡터 입니다.

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

설명

9B#u   % Call 'unique' function with first and fourth outputs: unique entries and
       % number of occurrences
w      % Swap
3XQ    % Call 'accumarray' with anonymous function @(x){sort(x).'}. The output is
       % a cell array with the elements of the input grouped by their frequency.
       % Cells are sorted by increasing frequency. Some cells may be empty, but
       % those won't be displayed
P      % Flip cell array, so that groups with higher frequency appear first.
       % Implicitly display

2

k, 22 바이트

{x@!x}{(>x)@=x@>x}#:'=

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

( AW의 k 는 추가 @하기 전에 추가가 필요한 것 #같지만 oK는 그렇지 않습니다.)

설명:

                     = /group identical numbers in a map/dict
                  #:'  /get number of times each number is repeated
                       /this is almost the answer, but without the inner lists
      {      x@>x}     /order "number of times" greatest to least
            =          /group them (to make the smaller groups)
       (>x)@           /get the actual numbers into place
{x@!x}                 /get values of the map/dict it's in

github.com/JohnEarnest/ok 다른 궁금한 점이 있으시면k 실제로 ok입니다. Ba-dum-tssss ...
마술 문어 Urn

2

Brachylog , 10 바이트

ọtᵒ¹tᵍhᵐ²|

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

설명

Example input: [2,1,1,3]

ọ            Occurences:            [[2,1],[1,2],[3,1]]
 tᵒ¹         Order desc. by tail:   [[1,2],[3,1],[2,1]]
    tᵍ       Group by tail:         [[[1,2]],[[3,1],[2,1]]]
      hᵐ²    Map twice head:        [[1],[3,2]]

         |   Else (Input = [])      Input = Output

2

Mathematica, 79 바이트

Table[#&@@@f[[i]],{i,Length[f=GatherBy[Sort[Tally@#,#1[[2]]>#2[[2]]&],Last]]}]&

입력

[{1, 1, 1, 4, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 5, 6, 5, 6, 5, 6, 5, 6, -56}]

산출

{{8, 6}, {5}, {1}, {7}, {-56, 9, 4}}


Gather으로 나는 Martin에게 언급했습니다! 나는 이것이 어떻게 이루어질 지 궁금했다. :).
Magic Octopus Urn

Sort[...,...&]그냥 SortBy[...,-Last@#&]입니다.
마틴 엔더

Length[f=...]. 그리고 First/@입니다 #&@@@.
마틴 엔더

고정, 고정 및 고정
J42161217 8:14의

2

R , 84 77 바이트

mb7744 덕분에 -7 바이트

unique(lapply(x<-sort(table(scan()),T),function(y)as.double(names(x[x==y]))))

stdin에서 읽습니다. 정수의 서브 벡터가있는 목록을 오름차순으로 반환합니다. int 대신 문자열을 반환 할 수 있다면 11 바이트를 제거 할 수 as.double있지만 (에 대한 호출을 제거 ) 그 정도입니다. R의 table기능은 입력의 각 구성원의 발생 횟수를 세면서 여기에서 과중하게 수행합니다. 그런 다음 개수 ( names)로 집계합니다 . 물론 이것은 문자열이므로 정수 / 더블로 강제 변환해야합니다.

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


"which"를 제거하고 논리적 인덱싱을 사용하여 7 바이트를 잃을 수 있습니다.
mb7744 1

@ mb7744 오 이런
주세페

1
나는 R로 또 다른 찌르기를했다. 람다 구문이 얼마나 오래 유감 스럽기 때문에 그것을 피하려고 노력했다. 대신에 중첩을 사용해야 lapply했지만 적어도 그 경우 짧은 변수를에 할당 할 수 있습니다 lapply. 함수에 변수를 할당 할 수없는 것 같습니다 function.
mb7744

2

자바 스크립트 (ES6), 100 98 96 93 바이트

@Neil 덕분에 2 바이트를 절약했습니다 (또한 내 코드에서 대소 문자 버그를 수정했습니다). @TomasLangkaas 덕분에 3 바이트를 더 절약했습니다.

a=>a.sort().map((_,n)=>a.filter((v,i)=>i-a.indexOf(v)==n&v!=a[i+1])).filter(a=>a+a).reverse()

테스트 사례

f=
a=>a.sort().map((_,n)=>a.filter((v,i)=>i-a.indexOf(v)==n&v!=a[i+1])).filter(a=>a+a).reverse()

console.log(JSON.stringify(f([1,2,3])))
console.log(JSON.stringify(f([1,1,1,2,2,3,3,4,5,6])))
console.log(JSON.stringify(f([1,1,1,4,5,6,6,6,7,7,8,8,8,8,8,8,8,9,5,6,5,6,5,6,5,6,-56])))
console.log(JSON.stringify(f([])))


테스트에 결함이 있지만 (0으로 작동하지는 않음) 변속하지 않고 필터링하고 반전하여 바이트를 저장할 수 있다고 생각합니다 a=>a.sort().map((_,n)=>a.filter((v,i)=>i-a.indexOf(v)==n&v!=a[i+1])).filter(a=>1/a[0]).reverse().
Neil

아, 나는 0을 테스트하는 것으로 알고 있어야합니다! 코드가 수정하고 더 짧아서 고맙습니다
Rick Hitchcock

로 변경 .filter(a=>1/a[0])하여 3 바이트를 더 절약하십시오 .filter(a=>''+a).
Tomas Langkaas 2016 년

감사합니다, @TomasLangkaas 감사합니다. (2 바이트를 절약합니다.)
Rick Hitchcock

내 나쁜 (카운팅에 문제가 있음)이지만 .filter(a=>a+a)여분의 바이트를 제공합니다.
Tomas Langkaas 2016 년

1

V , 60 , 54 바이트

Úòͨ¼¾©î±/± ±òHòø 
pkJjòú!
Ǩ^ƒ ©î±/o
Îf ld|;D
òV{Jk

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

16 진 덤프 :

00000000: daf2 cda8 bc81 bea9 eeb1 2fb1 20b1 f248  ........../. ..H
00000010: f2f8 200a 706b 4a6a f2fa 210a c7a8 5e83  .. .pkJj..!...^.
00000020: 20a9 81ee b12f 6f0a ce66 206c 647c 3b44   ..../o..f ld|;D
00000030: 0af2 567b 4a6b                           ..V{Jk

V를 좋아하는 한, 이것이 작업에 가능한 최악의 언어라고 확신합니다. 특히 목록을 지원하지 않으며 기본적으로 숫자를 지원하지 않는다는 점을 고려하십시오. 문자열 조작 만하면됩니다.


1

C #, 119 바이트

그것에 대한 빠른 찌르기 :

using System.Linq;
a=>a.GroupBy(x=>x)
    .GroupBy(x=>x.Count(),x=>x.Key)
    .OrderBy(x=>-x.Key)
    .Select(x=>x.ToArray())
    .ToArray()

2
+1 하지만 System.Func<int[],int[][]>F=후행을 제거 할 수 있습니다 ;. 그것은 이런 종류의 람다에 대한 바이트 수의 일부가 아닙니다.
Kevin Cruijssen

@ KevinCruijssen, 나는 몰랐다. 감사!
Hand-E-Food

1

R , 66 바이트

(l=lapply)(l(split(x<-table(scan()),factor(-x)),names),as.integer)

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

출력에서 정수가 문자열 형식 일 경우 @Giuseppe의 답변에서 언급 한 것처럼 48 바이트로 떨어질 수 있습니다 .


언 골프 드 :

input <- scan(); # read input
x <- table(input); # count how many times each integer appears, in a named vector
y <- split(x, factor(-x)) # split the count into lists in increasing order
z <- lapply(y, names) # access the the original values which are still
                      # attached via the names
lapply(z, as.integer) # convert the names back to integers

as.double1 바이트 씩 짧아지고 다음과 동일하게 작동해야합니다.as.integer
Giuseppe

글쎄, 그것은 정수를 반환할지 더블을 반환할지에 달려 있습니다. double이 괜찮다면 문자도 좋을 것이고 바이트를 절약 할 수 있습니다.
mb7744

1

PowerShell, 77, 70 바이트

($a=$args)|group{($a-eq$_).count}|sort n* -Des|%{,($_.group|sort -u)}

NB : 이러한 결과가 올바르게 그룹화되어 있는지 확인하려면 (각 배열의 내용 사이에 분리가 없기 때문에) | write-host위의 행 끝에 추가 할 수 있습니다 .

감사의 말

덕분에 :

  • TessellatingHeckler 는 좀 더 골치 아픈 방식으로 대규모 리팩토링 / 재 작성하여 7 바이트를 절약했습니다.

너무 이른

77 바이트

param($x)$x|group|sort count -desc|group count|%{,($_.group|%{$_.group[0]})}

감사합니다 ,()출력을 하나의 연속 배열로 표시했기 때문에 그룹화 를 포함해야했습니다 . 이것은 내 원래 시도보다 훨씬 골프입니다. 멋진 일!
JohnLBevan

0

그루비, 71 바이트

{a->a.groupBy{a.count(it)}.sort{-it.key}.values().collect{it.unique()}}

실제로 이것을 만든 후에 groupBy에 대해 배웠습니다. 나는 수집이 나의 유일한 선택이 아니라는 것을 몰랐다.


{
    a->                 // [1,2,1,2,3,3,3,6,5,4]
    a.groupBy{      
        a.count(it)     // [2:[1,2,1,2],3:[3,3,3],1:[6,5,4]]
    }.sort{             
        -it.key         // [3:[3,3,3],2:[1,2,1,2],1:[6,5,4]]
    }.values().collect{ // [[3,3,3],[1,2,1,2],[6,5,4]]
        it.unique()
    }                   // [[3],[1,2],[6,5,4]]
}

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