Najmniejsze grupy w tablicy

14

Wprowadzenie

Zobaczmy następującą tablicę:

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

Grupa składa się z tych samych cyfr obok siebie. W powyższej tablicy istnieje 5 różnych grup:

[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

Najmniejsza grupa z nich to [2, 2], więc wyprowadzamy [2, 2].

Weźmy inny przykład:

[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

Widać, że istnieje wiele grup o tej samej długości. Najmniejsze grupy to:

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

Więc po prostu wysyłamy dane [3, 3], [4, 4], [4, 4], [5, 5]w dowolnym rozsądnym formacie. Możesz wydrukować je w dowolnej kolejności.

Zadanie

Biorąc pod uwagę tablicę składającą się tylko z dodatnich liczb całkowitych, wypisz najmniejszą grupę (grupy) z tablicy. Możesz założyć, że tablica będzie zawierać co najmniej 1 liczbę całkowitą.

Przypadki testowe

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]

To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

Adnan
źródło
Związane .
Leaky Nun
czy dane wejściowe mogą być ciągiem znaków?
downrep_nation
@downrep_nation Hmm, jak więc chciałbyś to zrobić? Jeśli możesz to zrobić za pomocą liczb całkowitych wielocyfrowych, to jest w porządku.
Adnan
ints są bardzo ograniczone przez rozmiar, a łańcuchy nie są. dlatego pytam
downrep_nation
@downrep_nation Dobra, więc jak chcesz podać dane wejściowe dla ostatniego przypadku testowego? 11101010100100nie wydaje się poprawny dla danych wejściowych: p.
Adnan

Odpowiedzi:

5

Pyth 14 12 11

mM_MmhbrQ8

Pakiet testowy

2 bajty dzięki Jakube! I 1 bajt dzięki isaacg!

Niestety, dekodowanie długości przebiegu nie robi dokładnie tego, co chcemy, ale będzie działać z niewielkim obejściem, ale to sprawia, że ​​jest nieco dłuższy niż ręczne wdrożenie:

mr]d9.mhbrQ8

Podziękowania dla Jakube za to.

FryAmTheEggman
źródło
Btw, rld działa, ale musisz podać listę par:mr]d9.mhbrQ8
Jakube
Więcej informacji na temat dekodowania długości przebiegu: Dekodowanie długości przebiegu wymaga listy par, na przykład tego, jakie kodowanie długości przebiegu zwraca, a nie pojedynczej pary.
isaacg
.bmYN==mM_M
isaacg
@isaacg Ach, właśnie to ma sens, myślę, że nie zastanawiałem się wystarczająco. Również ta sztuczka z mapą jest fajna, dzięki!
FryAmTheEggman
8

Mathematica, 24 bajty

MinimalBy[Length]@*Split

Jest to kompozycja dwóch funkcji, które można zastosować do listy. Splitpobiera wszystkie grupy kolejnych liczb i MinimalBy[Length]wybiera te o minimalnej długości.

LegionMammal978
źródło
Cholera, właśnie wystrzeliłem Mathematicę, żeby przetestować to ... +1 :)
Martin Ender
Teraz zastanawiam się, czy nie uczyniłem tego zbyt trywialnym: /.
Adnan
4

Haskell, 38 bajtów

import Data.Lists
argmins length.group

Przykład użycia: 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]].

Zbuduj grupy równych elementów i znajdź te o minimalnej długości.

nimi
źródło
Gdzie jest dokumentacja Data.Lists?
Lynn
@Lynn: Data.Lists . Zobacz także łącza do ponownie wyeksportowanych modułów na tej stronie. argminsna przykład pochodzi z Data.List.Extras.Agrmax .
nimi
3

Python 2, 120 bajtów

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))]

Pobiera dane wejściowe jako ciąg liczb całkowitych oddzielonych spacją ze spacją końcową i wyświetla listę list ciągów znaków. Strategia polega na znajdowaniu grup za pomocą wyrażenia regularnego (\d+ )\1*(które pasuje do jednej lub więcej liczb całkowitych oddzielonych spacją, ze spacją końcową), a następnie dzieleniu ich na spacje na listy liczb całkowitych i drukowaniu tych grup, których długość jest równa minimalnej długości grupy.

Wypróbuj online

Mego
źródło
2

C #, 204 bajty

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);}}

Nie wiem, czy użycie łańcucha jest uczciwe, biorąc pod uwagę, że wszystkie esolangi gry w golfa otrzymują takie same dane, ale poprosił o tablicę.

tak to wygląda

bez golfa:

    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);
        }


    }

Potrzebuję sposobu, aby uzyskać najmniejsze dopasowania dla tablicy dopasowań, większość moich bajtów jest tam marnowana, pomoc w zrozumieniu. Próbuję wejść w LINQ i lambda.

downrep_nation
źródło
Technicznie ciąg jest tablicą.
Leaky Nun
1

Python 2.x, 303 bajty

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)

Najbrzydszy. Kod. Zawsze.

Dane wejściowe: tablica w formacie r'\[(\d,)*(\d,?)?\]'
Innymi słowy, tablica liczb w pythonie

Dane wyjściowe: tablica tablic (najmniejsze grupy) w kolejności, w jakiej występują w tablicy wejściowej

Dodatkowe przypadkowe cechy (funkcje, których nie zamierzałem tworzyć):

  • Dane wejściowe mogą być pustą tablicą; wynikiem będzie pusta tablica.
  • Zmieniając minna max, zwróci tablicę największych grup.
  • Jeśli to zrobisz print r, wydrukuje wszystkie grupy w kolejności.
HyperNeutrino
źródło
1

MATL, 15 bajtów

Y'tX<tb=bw)wTX"

Wypróbuj online

Dane wejściowe to wektor, [1 2 3 4]a dane wyjściowe to macierz, w której każda kolumna jest jedną z najmniejszych grup, np .:

1 100
1 100

dla trzeciego przypadku testowego.

Wyjaśnienie:

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
David
źródło
1

Galaretka, 22 17 16 bajtów

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

Wypróbuj online!

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)
Leaky Nun
źródło
1

JavaScript (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))]))

Test

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>

edc65
źródło
Nie h.map(length)działa?
Leaky Nun
@KennyLau nie, aby zadziałała lengthpowinna być funkcja z ciągiem jako argumentem, a nie metoda ciągu
edc65
1
@ edc65 Właściwie właściwość String. Nie metoda
Nie, że Charles
1

JavaScript (ES6), 113 bajtów

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])
Neil
źródło
1

Retina, 91 85 80 79 77 76 75 74 bajtów

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

Wypróbuj online!

Wyjaśnienie

Dane wejściowe to 1,1,10,10,10,100,100 .

Pierwszy wiersz pasuje do grup o takich samych warunkach:

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

Dane wejściowe stają się:

1,1
10,10,10
100,100

Następujące dwa wiersze poprzedzają liczbę przecinków w wierszu:

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

Dane wejściowe stają się:

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

Następnie są sortowane według tej linii, która szuka pierwszej liczby jako indeksu:

O#`.+

Dane wejściowe stają się:

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

Następnie te dwie linie znajdują miejsce, w którym długość jest inna, i usuwają wszystko dalej:

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

Dane wejściowe stają się:

1:1,1
1:100,100

Następnie liczby są usuwane przez te dwie linie:

.+:
<empty-line>

Gdzie dane wejściowe stają się:

1,1
100,100
Leaky Nun
źródło
@Adnan Dzięki, naprawiono.
Leaky Nun
1

APL, 25 znaków

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

Po angielsku:

  • wstaw z argumentem split, gdzie liczba jest inna niż poprzednia;
  • obliczyć długość każdej podtablicy
  • porównaj minimum z każdą długością produkującą wartość logiczną ...
  • ... który jest używany do zmniejszenia Z
lstefano
źródło
Łagodzić. Łagodzić. Łagodzić! ⍵⊂⍨1,2≠/⍵
Zacharý
1

J , 31 bajtów

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

Dane wejściowe to tablica wartości. Dane wyjściowe to tablica tablic pudełkowych.

Stosowanie

   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│
└───┴───┴───┴───┘

Wyjaśnienie

[:(#~[:(=<./)#@>)]<;.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
mile
źródło
1

Clojure, 65 bajtów

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

Zastosowania +jako identityfunkcję jak (+ 5)to 5 :) Reszta powinna być oczywista, Gjest hash-map wykorzystywane jako funkcja i otrzymać klucz powraca odpowiednią wartość.

NikoNyrh
źródło
1

Brachylog , 6 bajtów

ḅlᵒlᵍh

Wypróbuj online!

Wejście przez zmienną wejściową i wyjście przez zmienną wyjściową.

ḅ         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.

Chociaż, w przeciwieństwie , grupy niesąsiadującymi jednakowych elementów, lᵒw dalszym ciągu należy znaleźć grupę o najkrótszej długości i działa, ponieważ kolejność grup na wyjściu z ustala położenie pierwszego elementu każdej grupy, tak który ᵍhᵐmógłby działać jako swego rodzaju deduplikacja przez pseudometapredicate.

Niepowiązany ciąg
źródło
1

Perl 5 -MList::Util=pairkeys,min -a , 69 bajtów

map$r{y/ //}.="[ $_]",pairkeys"@F "=~/((\d+ )\2*)/g;say$r{min keys%r}

Wypróbuj online!

Xcali
źródło