Najdłuższe równe podsekwencje

18

Definicje

  • Podsekwencja może nie być ciągła, np. [1, 1, 1]Jest podsekwencja [1, 2, 1, 2, 1].
  • Równa podsekwencja to podsekwencja, w której każdy element jest równy.
  • Najdłuższe równe podsekwencje mogą nie być unikalne, np. [1, 1]I [2, 2]oba są najdłuższymi równymi podsekwencjami [2, 1, 1, 2].

Wejście

Niepusta lista dodatnich liczb całkowitych w jednym z poniższych formatów:

  • jako natywna implementacja tablicy dodatnich liczb całkowitych w twoim języku
  • jako ciąg liczb całkowitych oddzielonych znakiem nowej linii dziesiętnej
  • jako ciąg liczb całkowitych oddzielonych znakiem nowej linii w jedności
  • wszelkie inne rozsądne formaty

Wynik

Wszystkie najdłuższe równe podsekwencje w dowolnej kolejności w jednym z poniższych formatów:

  • jako zagnieżdżona tablica 2D w Twoim języku (jeśli dane wejściowe to tablica)
  • jako spłaszczony układ z równymi elementami przylegającymi do siebie
  • każdy inny rozsądny format

Punktacja

Chociaż szukamy czegoś długiego, użyty kod powinien być możliwie jak najkrótszy pod względem liczby bajtów, ponieważ jest to

Przypadki testowe

Wejścia:

[1, 2, 3]
[1, 2, 2, 1]
[1, 2, 3, 2, 1]
[1, 2, 1, 2, 3, 4, 1]

Wyjścia:

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

Pamiętaj, że dla powyższych wyników każde zamówienie jest ważne.

Poprawna jest również spłaszczona tablica, o ile równe elementy są ciągłe.

Leaky Nun
źródło
4
Łatwiej byłoby mówić o „najczęstszych elementach” IMO: podsekwencje są używane, gdy kolejność jest ważna, ale tutaj każda permutacja wejścia ma ten sam zestaw dozwolonych poprawnych wyjść.
ShreevatsaR
@ShreevatsaR Przepraszamy, zredagowałem pytanie.
Leaky Nun
Czy płaska lista działa dla danych wyjściowych? Np 1 2 3, 1 1 2 2, 1 1 2 2, 1 1 1?
Conor O'Brien
@ ConorO'Brien mówiąc tak by unieważnić większość odpowiedzi tutaj ...
Dziurawy Nun
@LeakyNun Jak w, czy jest to akceptowalna alternatywa?
Conor O'Brien

Odpowiedzi:

8

Galaretka , 5 bajtów

ĠLÐṀị

Wypróbuj online!

Jak to działa

ĠLÐṀị  Main link. Argument: A (array)

Ġ      Group; partition the indices of A by their corresponding values.
 LÐṀ   Select all index arrays with maximal length.
    ị  Unindex; retrieve the items of A at the specified indices.
Dennis
źródło
Myślałem, że Jelly nie ma maksymalnego szybkiego ...
Leaky Nun
Technicznie jest to maksymalnie szybki, ale tak, robi.
Dennis
5

Brachylog , 7 bajtów

⊇ᶠ=ˢlᵍh

Wypróbuj online!

Wyjaśnienie

⊇ᶠ=ˢlᵍh
⊇ᶠ        Find all subsequences
  =ˢ      Keeping only those for which all elements are equal
    lᵍ    Group by length
      h   Take the first group

naturalny porządek generuje najpierw najdłuższe podsekwencje, więc te kończą się w pierwszej grupie.


źródło
1
O hej, kolejny Brachylogist.
Leaky Nun
1
Jakoś ty i ja musieliśmy tęsknić za sobą wielokrotnie na czacie Brachylog; Używam go od miesięcy i byłem zaskoczony, gdy dowiedziałem się, że najwyraźniej był też ktoś inny niż Fatalize.
5

Pyth, 5 bajtów

S.M/Q

Zestaw testowy

Wyjaśnienie:

Jest to domyślnie S.M/QZQ. .Mjest funkcją maksymalną, więc .M/QZQwybiera wszystkie elementy, których wartość /QZ, policz liczbę wystąpień elementu na wejściu, jest maksymalna. Snastępnie sortuje listę, aby identyczne elementy były ciągłe.

isaacg
źródło
3

bash, 66 bajtów

sort|uniq -c|sort -rn|awk 'NR==1{a=$1}$1==a{for(i=a;i--;)print$2}'

Wygląda na to, że powinno być o wiele krótsze, ale nie wiem, jak to zrobić.

sort                  # sort the input
|uniq -c              # group runs of identical lines and prefix with count
|sort -rn             # sort by count, with largest at top
|awk '                # pipe to awk...
  NR==1{a=$1}         # on the first line, set the variable "a" to field 1
  $1==a{              # on any line, if first field is a (max count)...
    for(i=a;i--;)     # a times...
    print$2           # print the second field
  }
'

Wypróbuj online!

Dzięki Leaky Nun za 3 bajty!

Klamka
źródło
Zastanów się nad zaktualizowaniem swojego wyjaśnienia
Dziurawa zakonnica
3

Python 2 , 68 63 bajtów

lambda x:sorted(n for n in x if x.count(n)/max(map(x.count,x)))

Wypróbuj online!

Dennis
źródło
Chciałbym zobaczyć odpowiedź w Pythonie 3: p
Nieszczelna zakonnica
1
Porting ten jest banalna: po prostu zastąpić printz return.
Dennis
Och, myślałem, że Python 3 nie ma map.
Leaky Nun
Jest nieco inny w 3 (zwraca generator i obcina dłuższe iterowalne, jeśli są więcej niż dwa argumenty), ale tam jest.
Dennis
Myślałem, że Python ma do tego wbudowany
Beta Decay
2

Mathematica, 42 31 25 bajtów

Dzięki @GregMartin za 5 bajtów i @MartinEnder za kolejny bajt!

MaximalBy[Length]@*Gather

Wyjaśnienie

MaximalBy[Length]@*Gather  (*                       {1, 2, 3, 2, 1}       *)
                   Gather  (* Gather same numbers:  {{1, 1}, {2, 2}, {3}} *)
                 @*        (* Function composition                        *)
MaximalBy[Length]          (* Find longest:         {{1, 1}, {2, 2}}      *)
JungHwan Min
źródło
1
Możesz zapisać 5 bajtów za pomocą Gather@#~MaximalBy~Length&.
Greg Martin
2
@GregMartin, a następnie MaximalBy[Length]@*Gather.
Martin Ender
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
2

Ułożone , 55 52 43 bajty

sorted rle toarr:[1#]map MAX@K[1#K=]YES rld

Wypróbuj online!

Działa poprzez kodowanie długości przebiegu wejściowego, sortowanie według wystąpień, utrzymywanie wystąpień, dla których liczba wystąpień jest maksymalna, oraz dekodowanie długości przebiegu. Dane wyjściowe za pośrednictwem płaskiej listy, co jest możliwe do zaakceptowania przez wyzwanie.

Conor O'Brien
źródło
2

Właściwie 23 bajty

;╗⌠;╜ck⌡M;♂NM╗⌠N╜=⌡░♂FS

Wypróbuj online lub uruchom wszystkie przypadki testowe !

Dzięki Leaky Nun za wskazanie jednobajtowego ulepszenia, które naprawdę powinno być dla mnie oczywiste

-3 bajty z zrelaksowanego formatu wyjściowego

Wyjaśnienie:

;╗⌠;╜ck⌡M;♂NM╗⌠N╜=⌡░♂FS
;╗                        save a copy of the input to register 0
  ⌠;╜ck⌡M                 for each value in the input list:
   ;                        make a copy on the stack
    ╜c                      count the occurrences in the input list (from register 0)
      k                     make a list: [value, count]
         ;♂N             make a copy, take last value of each list in the 2D list
            M╗           store the maximum count in register 0
              ⌠N╜=⌡░     filter the other copy of the list of [value, count] lists:
               N╜=         take items where the count equals the maximum count
                    ♂FS  take first items (values) and sort them
Mego
źródło
1

Python 2, 138 bajtów

lambda l:[[x[0]]*x[1] for x in next(__import__('itertools').groupby(__import__('collections').Counter(l).most_common(),lambda x:x[1]))[1]]
Francisco Couzo
źródło
itertoolsnigdy nie jest najkrótszy: p
Dziurawa zakonnica
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
1

MATL , 10 bajtów

3#XMg1bX"&

Wypróbuj online!

Wyjaśnienie

Podobne do mojej odpowiedzi Octave. Rozważ dane wejściowe [10, 20, 30, 20, 10]jako przykład.

3#XM   % Three-output version of mode function. Gives the first mode, the
       % number of repetitions, and a cell array with all modes
       % STACK: 10, 2, {10; 20}
g      % Convert from cell array to matrix
       % STACK: 10, 2, [10; 20]
1      % Push 1
       % STACK: 10, 2, [10; 20], 1
b      % Bubble up in the stack
       % STACK: 10, [10; 20], 1, 2
X"     % Repeat those number of times vertically and horizontally
       % STACK: 10, [10, 10; 20, 20]
&      % Specify that implicit display will show only the top of the stack.
       % Since this is singleton cell array that contains a matrix, that 
       % matrix is directly displayed
Luis Mendo
źródło
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
@LeakyNun Dzięki za poinformowanie mnie
Luis Mendo
To moja odpowiedzialność.
Leaky Nun
1

Oktawa , 47 bajtów

[~,b,c]=mode(input(0));disp([repmat(c,1,b){:}])

Wypróbuj online!

Wyjaśnienie

Drugie i trzecie wyjście mode(uzyskane jako [~,b,c]=mode(...)) podaje odpowiednio liczbę powtórzeń ( b) i tablicę komórek kolumny ( c) najbardziej powtarzających się elementów w input ( input(0)). Tablica komórek cjest następnie powtarzana w poziomie brazy ( repmat(c,1,b)), konwertowana na listę oddzieloną przecinkami ( {:}) i łączona poziomo ( [...]) w celu uzyskania matrycy numerycznej, która jest wyświetlana ( disp(...)).

Luis Mendo
źródło
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
1

05AB1E , 8 5 bajtów

Wyświetla listę płaską w kolejności

.M¹Ã{

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Adnan
źródło
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
@LeakyNun Dzięki za powiadomienie :)
Adnan
1

CJam , 22 bajty

{$e`z~\__:e>f=.*\]ze~}

Jest to anonimowy blok (funkcja), który pobiera dane wejściowe z góry stosu i zastępuje je danymi wyjściowymi. Dane wyjściowe to spłaszczona tablica z ciągłymi elementami.

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe [10 20 30 20 10 ]jako przykład.

{      e# Begin block
       e#   STACK: [10 20 30 20 10]
  $    e#   Sort
       e#   STACK: [10 10 20 20 30]
  e`   e#   Run-length encoding
       e#   STACK: [[2 10] [2 20] [1 30]]
  z    e#   Zip
       e#   STACK: [[2 2 1] [10 20 30]]
  ~    e#   Dump array contents onto the stack
       e#   STACK: [2 2 1] [10 20 30]
  \    e#   Swap
       e#   STACK: [10 20 30] [2 2 1]
  __   e#   Duplicate twice
       e#   STACK: [10 20 30] [2 2 1] [2 2 1] [2 2 1]
  :e>  e#   Fold maximum over array. Gives the maximum of the array
       e#   STACK: [10 20 30] [2 2 1] [2 2 1] 2
  f=   e#   Map "is equal" with number (2) over the array ([2 2 1])
       e#   STACK: [10 20 30] [2 2 1] [1 1 0]
  .*   e#   Vectorized multiplication
       e#   STACK: [10 20 30] [2 2 0]
  \    e#   Swap
       e#   STACK: [2 2 0] [10 20 30]
  ]    e#   Pack into array
       e#   STACK: [[2 2 0] [10 20 30]]
  z    e#   Zip
       e#   STACK: [[2 10] [2 20] [0 30]]
  e~   e#   Run-length decoding
       e#   STACK: [10 10 20 20]
}      e# End block
Luis Mendo
źródło
1

Perl 5, 58 bajtów

sub{sort grep$x{$_}>$m,grep{$/=$x{$_}++;$m=$/if$m<$/;1}@_}
Chris
źródło
0

APL (Dyalog) , 22 bajty

Wymaga ⎕ML←3ustawienia domyślnego w wielu systemach.

Program: s/⍨(⌈/=⊢)≢¨s←⊂⍨(⍋⊃¨⊂)⎕

 uzyskać dane liczbowe (ocenione)

() Milcząca funkcja
 indeksów rosnących pozycji,
⊃¨ każdy wybiera z
 całej tablicy

⊂⍨ partycjonowanie przez cięcie przy jego wzrostach

s← przechowywać jako s

≢¨ suma każdego

() Milcząca funkcja
⌈/ maksimum (suma)
= równa
 się argumentowi (wartościom)

s/⍨ filtr s z tą

Funkcjonować: {s/⍨(⌈/=⊢)≢¨s←⊂⍨⍵[⍋⍵]}

{} Anonimowa funkcja, w której występuje argument

⍵[⍋⍵] sort (indeks z indeksami rosnących pozycji)

⊂⍨ partycjonowanie przez cięcie przy jego wzrostach

s← przechowywać jako s

≢¨ suma każdego

() Milcząca funkcja
⌈/ maksimum (suma)
= równa
 się argumentowi (wartościom)

s/⍨ Filtr s z tym Wypróbuj online!

Adám
źródło
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
0

PHP, 69 bajtów

<?print_r(preg_grep("#".max($r=array_count_values($_GET))."#",$r));

Wersja online

Format wyjściowy

klucz = wartość, wartość = liczba

Array
(
    [1] => 2
    [2] => 2
)

PHP, 96 bajtów

<?foreach($_GET as$v)$r[$m[]=count($l=preg_grep("#^{$v}$#",$_GET))][$v]=$l;print_r($r[max($m)]);

Wersja online

Format wyjściowy

Klucz 1D = wartość

Klawisz 2D = pozycja w tablicy wejściowej dla każdej wartości

Array
(
    [1] => Array
        (
            [0] => 1
            [4] => 1
        )

    [2] => Array
        (
            [1] => 2
            [3] => 2
        )

)

PHP, 97 bajtów

<?foreach($_GET as$v)$r[count($l=preg_grep("#^{$v}$#",$_GET))][$v]=$l;ksort($r);print_r(end($r));
Jörg Hülsermann
źródło
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
0

JavaScript (ES6), 84 83 bajtów

Zwraca posortowaną spłaszczoną tablicę.

a=>a.sort().filter((_,i)=>b[i]==Math.min(...b),b=a.map(i=>a.filter(j=>i-j).length))

Przypadki testowe

Arnauld
źródło
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
@LeakyNun Dzięki za powiadomienie.
Arnauld
0

CJam, 24 bajty

{$e`_$W=0=\{0=1$=},e~\;}

Chciałem to zrobić w 05ab1e, ale zrezygnowałem: P

To jest blok. Dane wejściowe i wyjściowe są tablicami na stosie.

Wypróbuj online!

Wyjaśnienie:

{                      e# Stack:                | [1 2 3 2 1]
 $                     e# Sort:                 | [1 1 2 2 3]
  e`                   e# RLE encode:           | [[2 1] [2 2] [1 3]]
    _$W=               e# Copy elements:        | [[2 1] [2 2] [1 3]] [2 1]
       0=              e# First element:        | [[2 1] [2 2] [1 3]] 2
         \             e# Swap:                 | 2 [[2 1] [2 2] [1 3]]
          {0=1$=},     e# Filter where x[0]==2: | 2 [[2 1] [2 2]]
                  e~   e# RLE decode:           | 2 [1 1 2 2]
                    \; e# Delete back:          | [1 1 2 2]
                      }
Esolanging Fruit
źródło
Działa to tylko wtedy, gdy najmniejsza liczba całkowita należy do najbardziej powszechnych elementów. Będziesz potrzebował $W=zamiast pierwszego 0=.
Martin Ender
Dodałem kolejną możliwą do zaakceptowania alternatywę, która może pomóc w grze w niektóre bajty.
Leaky Nun
0

Clojure, 65 bajtów

#(let[P partition-by C count](last(P C(sort-by C(P +(sort %))))))

Nie golfowany:

(def f #(->> %
             (sort-by      identity)   ; sort so that identical values are one after another, same as sort
             (partition-by identity)   ; partition by identity (duh!)
             (sort-by      count)      ; sort by item count
             (partition-by count)      ; partition by item count
             last))                    ; get the last partition
NikoNyrh
źródło
0

C #, 145 bajtów

l=>{var t=Enumerable.Range(0,l.Max()+1).Select(i=>l.Count(a=>a==i));return t.Select((a,i)=>Enumerable.Repeat(i,a)).Where(d=>d.Count()==t.Max());}

To musi być również możliwe lepiej, jednak trochę utknąłem.

Wyjaśnienie

l =>                                                   //Takes the list
{                                                      //...
    var t = Enumerable.Range(0, l.Max() + 1)           //Makes a range till the count, so that the items together with their indices are double defined (i.e. the items are 0,1,2,3... and the indices are the same)
                      .Select(i =>                     //Takes the items
                          l.Count(a => a == i));       //And replaces them with the count of themselves in the list (so the item has the index with its old value and the count as it's actual value)
    return t.Select((a, i) =>                          //Then it takes this list and selects the items together with the indices
        Enumerable.Repeat(i, a))                       //Repeats them as often as they appeared in the list
                  .Where(d => d.Count() == t.Max());   //And just keeps those which appear the maximum amount of times
};                                                     //...

Prawdopodobnie zupełnie inne podejście byłoby znacznie krótsze, więc wyzwanie C # jest nadal otwarte :)

MetaColon
źródło