배열에서 가장 작은 그룹


14

소개

다음 배열을 관찰하십시오.

[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]

그룹은 서로 옆에 같은 숫자로 구성되어 있습니다. 위의 배열에는 5 개의 서로 다른 그룹이 있습니다.

[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]

 1, 1, 1 
          2, 2
                1, 1, 1, 1
                            2, 2, 2
                                     1, 1, 1

이들 중 가장 작은 그룹이 [2, 2]있으므로 출력 [2, 2]합니다.

다른 예를 보자.

[3, 3, 3, 4, 4, 4, 4, 5, 5, 4, 4, 3, 3, 4, 4]

 3, 3, 3
          4, 4, 4, 4
                      5, 5
                            4, 4
                                  3, 3
                                        4, 4

길이가 같은 여러 그룹이 있음을 알 수 있습니다. 가장 작은 그룹은 다음과 같습니다.

[3, 3], [4, 4], [4, 4] and [5, 5].

따라서 우리는 [3, 3], [4, 4], [4, 4], [5, 5]합리적인 형식으로 출력 합니다. 이들을 임의의 순서로 출력 할 수 있습니다.

작업

양의 정수로만 구성된 배열이 주어지면 배열에서 가장 작은 그룹을 출력하십시오. 배열에 최소 1 개의 정수가 포함되어 있다고 가정 할 수 있습니다.

테스트 사례

Input: [1, 1, 2, 2, 3, 3, 4]
Output: [4]

Input: [1]
Output: [1]

Input: [1, 1, 10, 10, 10, 100, 100]
Output: [1, 1], [100, 100]

이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!



입력이 문자열이 될 수 있습니까?
downrep_nation

@downrep_nation 흠, 그럼 어떻게 하시겠습니까? 여러 자리 정수로 할 수 있다면 괜찮습니다.
Adnan

int는 크기에 의해 매우 제한되며 문자열은 아닙니다. 그래서 im 묻는 이유
downrep_nation

@downrep_nation 좋아, 마지막 테스트 케이스에 어떻게 입력을 제공하고 싶니? 11101010100100입력에 맞지 않는 것 같습니다 : p.
Adnan

답변:


5

피스, 14 12 11

mM_MmhbrQ8

테스트 스위트

Jakube 덕분에 2 바이트! isaacg 덕분에 1 바이트!

불행히도 실행 길이 디코딩은 우리가 원하는 것을 수행하지는 않지만 사소한 해결 방법으로 작동하지만 수동 구현보다 약간 길어집니다.

mr]d9.mhbrQ8

이것을 알게 된 Jakube에게 감사드립니다.


Btw, rld는 작동하지만 다음과 같은 쌍의 목록을 제공해야합니다.mr]d9.mhbrQ8
Jakube

실행 길이 디코딩에 대한 추가 정보 : 실행 길이 디코딩에는 개별 쌍이 아닌 실행 길이 인코딩이 반환하는 것과 같은 쌍 목록이 필요합니다.
isaacg

.bmYN==mM_M
isaacg

@isaacg 아, 그 말이 맞아, 나는 그것을 충분히 생각하지 않았다고 생각합니다. 또한 그지도 트릭은 깔끔합니다. 감사합니다!
FryAmTheEggman

8

Mathematica, 24 바이트

MinimalBy[Length]@*Split

이것은 목록에 적용 할 수있는 두 가지 기능으로 구성되어 있습니다. Split연속 된 숫자 그룹을 모두 취하고 MinimalBy[Length]길이가 최소 인 그룹을 선택합니다.


젠장, 방금 Mathematica를 해고해서 이것을 테스트 해
Martin Ender 16:01에

이제 이것을 너무 사소하게 만들지 않았는지 궁금합니다.
Adnan

4

하스켈, 38 바이트

import Data.Lists
argmins length.group

사용 예 : argmins length.group $ [3,3,3,4,4,4,4,5,5,4,4,3,3,4,4]-> [[4,4],[3,3],[4,4],[5,5]].

동일한 요소 그룹을 만들고 최소 길이의 요소를 찾으십시오.


설명서는 어디에 있습니까 Data.Lists?
Lynn

@Lynn : Data.Lists . 이 페이지에서 다시 내 보낸 모듈에 대한 링크도 참조하십시오. argmins예를 들어 Data.List.Extras.Agrmax 입니다.
nimi

3

파이썬 2, 120 바이트

import re
r=[x.group().split()for x in re.finditer(r'(\d+ )\1*',input())]
print[x for x in r if len(x)==min(map(len,r))]

후행 공백이있는 공백으로 구분 된 정수 문자열로 입력을 받아서 문자열 목록의 목록을 출력합니다. 전략은 정규식을 사용하여 그룹을 찾고 (\d+ )\1*(후행 공백이있는 하나 이상의 공백으로 구분 된 정수와 일치) 공백에서 정수 목록으로 분할 한 다음 길이가 최소 그룹 길이와 같은 그룹을 인쇄하는 것입니다.

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


2

C #, 204 바이트

void f(string o){var r=Regex.Matches(o,@"([0-9])\1{0,}").Cast<Match>().OrderBy(x=>x.Groups[0].Value.Length);foreach(var s in r){foreach(var z in r)if(s.Length>z.Length)return;Console.WriteLine(s.Value);}}

모든 골프 esolang이 같은 방식으로 입력을 얻지 만 배열 입력을 요청한 것을 고려할 때 문자열을 사용하는 것이 공정한지 모르겠습니다.

thats how it looks

언 골프 :

    public static void f(string inp)
    {

        var r = Regex.Matches(inp, @"([0-9])\1{0,}").Cast<Match>().OrderBy(x => x.Groups[0].Value.Length);

        foreach (Match s in r)
        {
            foreach (Match z in r)
                if (s.Length > z.Length)
                    return;

        Console.WriteLine(s.Value);
        }


    }

일치 배열에 대해 가장 작은 일치 항목을 얻는 방법이 필요합니다. 대부분의 바이트가 낭비되어 감사합니다. LINQ 및 람다에 들어 가려고합니다.


기술적으로 문자열은 배열입니다.
Leaky Nun

1

파이썬 2.x, 303 바이트

x=input()
r=[q[2]for q in filter(lambda l:(len(l[2])>0)&((l[0]<1)or(x[l[0]-1]!=x[l[0]]))&((l[1]>len(x)-1)or(x[l[1]]!=x[l[1]-1]))&(len(filter(lambda k:k==l[2][0],l[2]))==len(l[2])),[(a,b,x[a:b])for a in range(0,len(x))for b in range(0,len(x)+1)])]
print filter(lambda k:len(k)==min([len(s)for s in r]),r)

추악한. 암호. 이제까지.

입력 : 형식의 배열 r'\[(\d,)*(\d,?)?\]'
즉, 숫자로 구성된 파이썬 배열

출력 : 입력 배열에 표시되는 순서대로 배열 배열 (가장 작은 그룹)

추가 우연한 특징 (내가 만들지 않았던 특징) :

  • 입력은 빈 배열 일 수 있습니다. 출력은 빈 배열이됩니다.
  • 변경 min으로 max, 상기 큰 그룹의 배열을 반환한다.
  • 방금 수행하면 print r모든 그룹이 순서대로 인쇄됩니다.

1

MATL, 15 바이트

Y'tX<tb=bw)wTX"

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

입력은과 같은 벡터 [1 2 3 4]이고 출력은 각 열이 가장 작은 그룹 중 하나 인 행렬입니다. 예 :

1 100
1 100

세 번째 테스트 사례

설명:

Y'    %// Run length encoding, gives 2 vectors of group-lengths and values
t     %// Duplicate group lengths
X<    %// Minimum group length
tb    %// Duplicate and get vector of group lengths to the top
=     %// Find which group lengths are equal to the minimum
bw)   %// And get the values of those groups
wTX"  %// Repeats the matrix of minimum-length-group values by the minimum group length

1

젤리, 22 17 16 바이트

I0;œṗ¹L=¥ÐfL€Ṃ$$

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

I0;œṗ¹L=¥ÐfL€Ṃ$$     Main link. List: z = [a,b,c,...]

I                    Compute [b-a, c-b, d-c, ...]
 0;                  Concatenate 0 in front: [0, b-a, c-b, d-c, ...]
   œṗ                Split z where the corresponding item in the above array is not zero.
      L=¥Ðf          Filter sublists whose length equal:
           L€Ṃ$      the minimum length throughout the list.

     ¹         $     (grammar stuffs)

1

자바 스크립트 (ES6), 106

a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))

테스트

f=a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))

console.log=x=>O.textContent+=x+'\n'

;[[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]
, [3, 3, 3, 4, 4, 4, 4, 5, 5, 4, 4, 3, 3, 4, 4]
, [1, 1, 2, 2, 3, 3, 4]
, [1]
, [1, 1, 10, 10, 10, 100, 100]]
.forEach(t=>console.log(t+' -> '+f(t).join` `))
<pre id=O></pre>


않습니다 h.map(length)작동하지?
Leaky Nun

@KennyLau 아니오, 작동하기 length위해서는 문자열의 메소드가 아니라 인수로 문자열을 가진 함수 여야합니다.
edc65

1
@ edc65 사실, String의 속성입니다. 방법이 아닙니다.
찰스

1

자바 스크립트 (ES6), 113 바이트

a=>a.map(n=>n==c[0]?c.push(n):b.push(c=[n]),c=b=[])&&b.sort((a,b)=>a[l]-b[l],l='length').filter(e=>e[l]==b[0][l])

1

망막, 91 85 80 79 77 76 75 74 바이트

M!`\b(\d+)(,\1\b)*
(,()|.)+
$#2:$&
O#`.+
s`^(.*\b(.+:).*)¶(?!\2).+
$1
.+:
<empty-line>

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

설명

입력은 1,1,10,10,10,100,100입니다.

첫 번째 줄은 같은 용어로 그룹을 일치시킵니다.

M!`\b(\d+)(,\1\b)*

입력은 다음과 같습니다.

1,1
10,10,10
100,100

다음 두 줄은 쉼표 수를 줄 앞에 추가합니다.

(,()|.)+
$#2:$&

입력은 다음과 같습니다.

1:1,1
2:10,10,10
1:100,100

그런 다음이 줄을 기준으로 정렬하여 첫 번째 숫자를 색인으로 찾습니다.

O#`.+

입력은 다음과 같습니다.

1:1,1
1:100,100
2:10,10,10

그런 다음이 두 줄은 길이가 다른 곳을 찾아서 모든 것을 제거합니다.

s`^(.*\b(.+:).*)¶(?!\2).+
$1

입력은 다음과 같습니다.

1:1,1
1:100,100

그런 다음 숫자는 다음 두 줄로 제거됩니다.

.+:
<empty-line>

입력이되는 곳 :

1,1
100,100

@Adnan 감사합니다.
Leaky Nun

1

APL, 25 자

{z/⍨(⊢=⌊/)≢¨z←(1,2≠/⍵)⊂⍵}

영어로:

  • 숫자가 앞의 숫자와 다른 인수 split을 z에 넣습니다.
  • 각 부분 배열의 길이를 계산
  • 부울을 생성하는 각 길이와 최소값을 비교하십시오 ...
  • ... z를 줄이는 데 사용됩니다

갈다. 갈다. 갈다! ⍵⊂⍨1,2≠/⍵
Zacharý

1

J , 31 바이트

[:(#~[:(=<./)#@>)]<;.1~1,2~:/\]

입력은 값의 배열입니다. 출력은 박스형 배열의 배열입니다.

용법

   f =: [:(#~[:(=<./)#@>)]<;.1~1,2~:/\]
   f 1 1 2 2 3 3 4
┌─┐
│4│
└─┘
   f 3 3 3 4 4 4 4 5 5 4 4 3 3 4 4
┌───┬───┬───┬───┐
│5 5│4 4│3 3│4 4│
└───┴───┴───┴───┘

설명

[:(#~[:(=<./)#@>)]<;.1~1,2~:/\]  Input: s
                              ]  Identity function, get s
                         2       The constant 2
                             \   Operate on each overlapping sublist of size 2
                          ~:/      Check if each pair is unequal, 1 if true else 0
                       1,        Prepend a 1 to that list
                 ]               Identity function, get s
                  <;.1~          Using the list above, chop s at each true index
[:(             )                Operate on the sublists
             #@>                 Get the length of each sublist
     [:(    )                    Operate on the length of each sublist
         <./                     Get the minimum length
        =                        Mark each index as 1 if equal to the min length else 0
   #~                            Copy only the sublists with min length and return

1

클로저, 65 바이트

#(let[G(group-by count(partition-by + %))](G(apply min(keys G))))

함수 는 5 +그대로 identity기능으로 사용합니다 (+ 5). 나머지는 분명해야합니다 G. 해시 맵은 함수로 사용되며 키가 주어지면 해당 값을 반환합니다.


1

Brachylog , 6 바이트

ḅlᵒlᵍh

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

입력 변수를 통해 입력하고 출력 변수를 통해 출력합니다.

ḅ         The list of runs of consecutive equal elements of
          the input
 lᵒ       sorted by length
   lᵍ     and grouped by length
          has the output variable
     h    as its first element.

달리 않지만 , 그룹은 비 연속적인 동일 요소의는 lᵒ최단 길이를 갖는 그룹을 찾는 것이 여전히 필요하며, 그 작업의 출력에서 그룹의 순서 때문에 , 각 그룹의 첫 번째 요소의 위치에 의해 결정되므로, 그것은 의사 전치사에 의해ᵍhᵐ 일종의 중복 제거 기능 을 할 수 있습니다 .


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