Najdłuższa powtarzająca się sekwencja jednej cyfry

17

Wyzwanie:

Biorąc pod uwagę dodatnią liczbę całkowitą, wypisz najdłuższą jednocyfrową podsekwencję, która występuje co najmniej dwukrotnie, AND ma granice innej cyfry (lub początek / koniec liczby całkowitej).

Przykład:

Wejście: 7888885466662716666
Najdłuższa podsekwencja pojedynczej cyfry to 88888( 7[88888]5466662716666) o długości 5. Jednak ta podsekwencja występuje tylko raz w liczbie całkowitej.
Zamiast tego wynikiem dla danych wejściowych 7888885466662716666powinno być 6666( 78888854[6666]271[6666]), ponieważ występuje (przynajmniej) dwa razy.

Zasady konkursu:

  • Długość podsekwencji ma pierwszeństwo przed liczbą wystąpień. (Tj. Z wejściem 8888858888866656665666, wyprowadzamy 88888( [88888]5[88888]66656665666; długość 5 występuje dwukrotnie), a nie 666( 88888588888[666]5[666]5[666]; długość 3 występuje trzy razy).
  • Jeśli długość wielu podsekwencji jest równa, wyprowadzamy tę o największej liczbie wystąpień. Tj. Z wejściem 3331113331119111, wyprowadzamy 111( 333[111]333[111]9[111]; długość 3 występuje trzykrotnie), a nie 333( [333]111[333]1119111; długość 3 również występuje, ale występuje dwukrotnie)
  • Jeśli liczba wystąpień i długość wielu podsekwencji są równe, możesz wyprowadzić jeden z nich lub wszystkie (w dowolnej kolejności). To znaczy z wejściem 777333777333, możliwymi wyjściami są 777:; 333; [777, 333]; lub[333, 777] .
  • Podsekwencja musi mieć granice innych cyfr (lub początek / koniec liczby całkowitej). Tj. Z wejściem 122222233433wynikiem jest 33( 1222222[33]4[33]; długość 2 występuje dwukrotnie), a nie 222(1[222][222]33433 długość 3 występuje dwukrotnie, przy czym oba są nieprawidłowe).
    • Dotyczy to wszystkich liczb liczonych do licznika wystąpień. Tj. Z 811774177781382danymi wejściowymi wynik jest 8( [8]117741777[8]13[8]2; długość 1 występuje trzykrotnie) i nie 77( 811[77]41[77]781382/ 811[77]417[77]81382; długość 2 występuje dwukrotnie z jednym nieważnym) ani 1(( 8[1][1]774[1]7778[1]382długość 1 występuje cztery razy z dwoma nieważnym).
  • Możesz założyć, że dane wejściowe nie będą zawierać żadnych cyfr 0(będą pasować [1-9]+). (Ma to na celu uniknięcie konieczności radzenia sobie z przypadkami testowymi takimi jak te, 10002000które powinny być generowane 000, w przypadku których większość języków byłaby wypisywana0 domyślnie).
  • Możesz założyć, że dane wejściowe zawsze będą zawierać co najmniej jedno prawidłowe dane wyjściowe.
  • Oba wejścia / wyjścia są elastyczne. Może być listą / tablicą / strumieniem cyfr / bajtów / znaków lub ciągiem znaków zamiast pojedynczej liczby całkowitej.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

Input:  7888885466662716666 / [7,8,8,8,8,8,5,4,6,6,6,6,2,7,1,6,6,6,6]
Output: 6666                / [6,6,6,6]

Input:  3331113331119111 / [3,3,3,1,1,1,3,3,3,1,1,1,9,1,1,1]
Output: 111              / [1,1,1]

Input:            777333777333                   / [7,7,7,3,3,3,7,7,7,3,3,3]
Possible outputs: 777; 333; [777,333]; [333;777] / [7,7,7]; [3,3,3]; [[7,7,7],[3,3,3]]; [[3,3,3],[7,7,7]]

Input:  122222233433 / [1,2,2,2,2,2,2,3,3,4,3,3]
Output: 33           / [3,3]

Input:  811774177781382 / [8,1,1,7,7,4,1,7,7,7,8,1,3,8,2] 
Output: 8               / [8]

Input:  555153333551 / [5,5,5,1,5,3,3,3,3,5,5,1] 
Output: 1            / [1]

Input:            12321              / [1,2,3,2,1]
Possible outputs: 1; 2; [1,2]; [2,1] / [1]; [2]; [[1],[2]]; [[2],[1]]

Input:  944949949494999494 / [9,4,4,9,4,9,9,4,9,4,9,4,9,9,9,4,9,4]
Output: 4                  / [4]

Input:  8888858888866656665666 / [8,8,8,8,8,5,8,8,8,8,8,6,6,6,5,6,6,6,5,6,6,6]
Output: 88888                  / [8,8,8,8,8]

Input:  1112221112221111               / [1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1]
Output: 111; 222; [111,222]; [222,111] / [1,1,1]; [2,2,2]; [[1,1,1],[2,2,2]]; [[2,2,2],[1,1,1]]

Input:  911133111339339339339339 / [9,1,1,1,3,3,1,1,1,3,3,9,3,3,9,3,3,9,3,3,9,3,3,9]
Output: 111                      / [1,1,1]
Kevin Cruijssen
źródło
1
Sugerowana przypadek testowy: 8888858888866656665666. Jeśli poprawnie zinterpretowałem wyzwanie, zarówno Brachylog, jak i 05AB1E zawodzą.
Pan Xcoder,
@ Mr.Xcoder Dodano, dziękuję.
Kevin Cruijssen
@Arnauld Hmm, moim zdaniem i tak byłby jednym ze zwycięzców, ponieważ występuje tyle razy, ile jest 222ograniczony innymi liczbami całkowitymi. Chyba nie powinniśmy liczyć wystąpienia, które jest podciągiem 1111. Rzeczywiście jednak lepiej poczekać na OP.
Pan Xcoder,
2
@Arnauld Dla 1112221112221111nich są podciągi i ich zliczenia: 1111 (1), 111 (2), 222 (2). Skoro tylko wyprowadza sekwencje występujące co najmniej dwa razy, wyjście może być jednym z: 111, 222, [111,222], [222,111]. (Zobacz czwartą zasadę, aby uzyskać więcej informacji.) Zasadniczo 1111będzie się zawsze liczył jako 1111, a nie jako 1i 111lub 11i 11. Dodam swój przypadek testowy, ale wyjście jest jedno lub oba 111i 222.
Kevin Cruijssen

Odpowiedzi:

6

05AB1E , 14 bajtów

γТ1›ÏD€gZQÏ.M

Wypróbuj online!

Wyjaśnienie

γ                # group consecutive equal elements
 Т              # count the occurrence of each group among the list of groups
   1›Ï           # keep only groups with a count greater than 1
      D€gZQÏ     # keep only those with a length equal to the greatest length
            .M   # get the most common item
Emigna
źródło
@Riley: Niestety otrzyma to pierwszy element, który niekoniecznie jest najczęstszy.
Emigna
Ups .. Przegapiłem tę kulę.
Riley
5

Galaretka , 12 bajtów

Œgœ-Q$LÐṀÆṃ'

Wypróbuj online!

Poprzednia wersja - 14 bajtów

ŒgŒQ¬TịƲLÐṀÆṃ'

Wypróbuj online!

Jak to działa?

Œgœ-Q$LÐṀÆṃ' – Full program. Receives a list of digits as input.
Œg           – Group equal adjacent values.
  œ-Q$       – Multiset difference with itself deduplicate.
      LÐṀ    – Keep those that are maximal by length.
         Æṃ' – Mode. Returns the most common element(s).
-------------------------------------------------------------------------
ŒgŒQ¬TịƲLÐṀÆṃ' – Full program. Receives a list of digits as input.
Œg             – Group equal adjacent values.
  ŒQ           – Distinct sieve. Replace the first occurrences of each value by 1.
                 and the rest by 0. [1,2,3,2,3,2,5]ŒQ -> [1,1,1,0,0,0,1]       
    ¬T         – Negate and find the truthy indices.
      ịƲ       – Then index in the initial list of groups.
               – This discards the groups that only occur once.
        LÐṀ    – Find all those which are maximal by length.
           Æṃ' – And take the mode.
Pan Xcoder
źródło
5

JavaScript (ES6), 79 73 68 bajtów

Pobiera dane wejściowe jako ciąg. Zwraca liczbę całkowitą.

s=>[...s,r=q=0].map(o=d=>q=s^d?o[!o[q]|r[q.length]?q:r=q]=s=d:q+d)|r

Wypróbuj online!

Skomentował

s =>                      // s = input string, also used as the current digit
  [ ...s,                 // split s into a list of digit characters
    r =                   // r is the final result
    q =                   // q is the current digit sequence
    0                     // append a final dummy entry to force the processing of the last
  ]                       // sequence
  .map(o =                // o is an object used to keep track of encountered sequences
       d =>               // for each digit d in the array defined above:
    q =                   //   update q:
      s ^ d ?             //     if d is not equal to the current digit:
        o[                //       this statement will ultimately update o[q]
          !o[q] |         //         if q has not been previously seen
          r[q.length] ?   //         or the best result is longer than q:
            q             //           leave r unchanged
          :               //         else:
            r = q         //           set r to q
        ] = s = d         //       reset q to d, set the current digit to d
                          //       and mark q as encountered by setting o[q]
      :                   //     else:
        q + d             //       append d to q
  ) | r                   // end of map(); return r, coerced to an integer
Arnauld
źródło
Może mówię tu coś niepoprawnego, ale skoro ...skonwertuje dane wejściowe na listę cyfr, to czy nie jest krótsze, aby po prostu traktować je jako listę cyfr, a nie ciąg znaków? Pozwoliłem na elastyczne we / wy. (Ale
zakładam,
2
@KevinCruijssen Problem polega na tym, że potrzebuję dodatkowej iteracji, aby przetworzyć ostatnią sekwencję. Więc musiałbym to zrobić, [...s,0]nawet jeśli sjuż jest to lista.
Arnauld,
4

Siatkówka , 56 bajtów

L`(.)\1*
O`
L$m`^(.+)(¶\1)+$
$#2;$1
N`
.+;

N$`
$.&
-1G`

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

L`(.)\1*

Wymień wszystkie maksymalnie powtarzane podsekwencje cyfrowe.

O`

Posortuj listę w kolejności.

L$m`^(.+)(¶\1)+$
$#2;$1

Wyświetl wszystkie wielokrotne podsekwencje z ich „liczbą”.

N`

Sortuj w kolejności rosnącej.

.+;

Usuń liczby.

N$`
$.&

Sortuj rosnąco według długości. (Jeżeli długości są równe, zachowane jest poprzednie zamówienie ze względu na liczbę).

-1G`

Zachowaj ostatnią, tj. Najdłuższą wartość.

Neil
źródło
4

R , 102 bajty

function(i)rep(names(sort(-(x=(x=table(rle(i)))[rowSums(x>1)>0,,drop=F])[m<-max(rownames(x)),])[1]),m)

Wypróbuj online!

Ponieważ nie było jeszcze odpowiedzi R, postanowiłem spróbować, a więc ... to nie było łatwe. Naprawdę nie wiem, czy to dobre podejście, ale proszę bardzo.

Wejściowe i wyjściowe wektory znaków.

Kirill L.
źródło
Przy tym wyzwaniu prawie 100 bajtów jest całkiem dobre dla R.
ngm
4

Perl 6 , 58 56 bajtów

*.comb(/(.)$0*/).Bag.max({.value>1,+.key.comb,.{*}}).key

Wypróbuj online!

nwellnhof
źródło
3

Python 2 , 123 120 bajtów

import re
def f(s):r=re.findall(r'(\d)(\1*)',s);c=r.count;print max((len(a+b)*(c((a,b))>1),c((a,b)),a+b)for a,b in r)[2]

Wypróbuj online!

TFeld
źródło
3

PowerShell, 101 bajtów

($args|sls '(.)\1*'-a|%{$_.Matches}|group|?{$_.Count-1}|sort @{e={$_.Name.Length,$_.Count}})[-1].Name

Skomplikowany skrypt testowy:

$f = {

(
    $args|          # for each argument (stings)
    sls '(.)\1*'-a| # searches all
    %{$_.Matches}|  # regex matches
    group|          # group it (Note: Count of each group > 0 by design)
    ?{$_.Count-1}|  # passthru groups with Count not equal 1
    sort @{         # sort all groups by 2 values
        e={$_.Name.Length,$_.Count}
    }
)[-1].Name          # returns name of last group (group with max values)

}

@(
    ,('7888885466662716666', '6666')
    ,('3331113331119111', '111')
    ,('777333777333', '777','333')
    ,('122222233433', '33')
    ,('811774177781382', '8')
    ,('555153333551','1')
    ,('12321', '1','2')
    ,('944949949494999494','4')
    ,('8888858888866656665666','88888')
    ,('1112221112221111','111','222')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-in$e): $r"
}

Wynik:

True: 6666
True: 111
True: 777
True: 33
True: 8
True: 1
True: 1
True: 4
True: 88888
True: 111
mazzy
źródło
3

Python 2 , 114 113 bajtów

-1 bajt dzięki TFeld .

p='';r=[];C=r.count
for c in input():r+=['']*(c!=p);r[-1]+=c;p=c
print max((len(w),C(w),w)for w in r if~-C(w))[2]

Wypróbuj online!

ovs
źródło
3

Haskell, 72 bajty

import Data.Lists
g!x|y<-countElem x g=(y>1,1<$x,y)
(argmax=<<(!)).group

Jak to działa

(argmax=<<(!)).group       -- expands to: f i = argmax (group i !) (group i)
    group                  -- split the input list into subsequences of equal digits
                           -- e.g. "1112211" -> ["111","22","11"]

                           -- find the element of this list where the function !
                           -- returns the maximum value. First parameter to !
                           -- is the grouped input list, second parameter the
                           -- the element to look at 

g!x|
    y<-countElem x g       -- let y be the number of occurrences of x in g
  = (  ,   ,  )            -- return a triple of
     y>1                   -- a boolean y>1  (remember: True > False)  
        1<$x               -- length of x (to be exact: all elements in x
                           -- replaced by 1. This sorts the same way as the
                           -- length of x)
             y             -- y
                           -- a triples sorts lexicographical
nimi
źródło
Czy nie musisz używać list Haskell + jako języka, ponieważ Data.Lists nie jest częścią bazy?
ბიმო
@BWO: nie wiem. Zawsze używałem zwykłego „Haskell”, nawet gdy importowałem egzotyczną bibliotekę (np. GlossDo grafiki lub Matrix). Używam „Haskell + coś”, jeśli nie chcę uwzględniać liczby bajtów dla importów. Myślę, że mieliśmy ten temat na temat meta, ale nie mogę go już znaleźć. Jeśli dobrze pamiętam, nie mieliśmy ogólnej definicji „biblioteki standardowej”. Co powinno być odniesieniem dla Haskell? Raport Haskella, baza GHC, platforma Haskell, coś jeszcze?
nimi
IMO powinno być tak jak w C / JavaScript / .., że (jeśli ma to znaczenie) musimy użyć Haskell (GHC) lub Haskell (Hugs) itp., Ponieważ implementacja określa język PPCG. Tak więc dla odpowiedzi GHC , która obejmowałaby bazę i dla wszystkich pozostałych nie wiedziałbym: D
ბიმო
Czy masz może łącze TIO, które można przetestować? Czy Data.Listsbiblioteka nie jest dostępna w TIO lub innym internetowym kompilatorze Haskell?
Kevin Cruijssen
1
@KevinCruijssen: Data.Listsw TIO brakuje tak . Możesz to przetestować w tej wersji .
nimi
3

R , 85 bajtów

function(x,R=rle(x),a=ave(R$v,R,FUN=length))rep(R$v[o<-order(a<2,-R$l,-a)[1]],R$l[o])

Wypróbuj online!

  • Dane wejściowe: wektor oddzielonych cyfr całkowitych, npc(1,8,8...)

  • Dane wyjściowe: wektor oddzielonych cyfr całkowitych

Kod rozwinięty z wyjaśnieniem:

function(x){                # x is a vector of digits : e.g. c(1,1,8,8,1,1)

R = rle(x)                  # Get the sequences of consecutive repeating digits
                            # doing run length encoding on x, i.e. : R is a list
                            # with the digits (R$values) and the number of their
                            # consecutive occurrencies (R$lengths)
                            # N.B. you can use R$v for R$values and R$l for R$lenghts

a=ave(R$v,R,FUN=length)     # Group R$v by R$l AND R$v, count the occurrencies 
                            # for each group and "unroll" the value of each 
                            # group to the original R$v length.
                            # Here basically we count the occurrencies of the same 
                            # sequence.

o<-order(a<2,-R$l,-a)[1]    # Get the indexes used to order by a < 2 then by -R$l and
                            # finally by -a; store the first index in "o".
                            # Here basically we use order to select the first sequence 
                            # repeated at least twice, in case of ties the sequence 
                            # with the greatest length and in case of ties the most 
                            # repeated sequence.

rep(R$v[o],R$v[o])          # Using the index "o", we reconstruct the sequence repeating
                            # R$l[o] times R$v[o]
}

Alternatywna wersja akceptująca wektor liczb całkowitych lub znakowych:

R , 88 bajtów

function(x,R=rle(x),a=ave(R$v,R,FUN=length))rep(R$v[o<-tail(order(a>1,R$l,a),1)],R$l[o])

Wypróbuj online!

  • Wejście: wektor oddzielonych znaków lub cyfr, np. c("1","8","8"...)Lubc(1,8,8...)

  • Dane wyjściowe: wektor rozdzielonych znaków, jeśli wejście było wektorem znaków, wektor cyfr, jeśli wejście było wektorem cyfr

digEmAll
źródło
Czy możesz dodać wyjaśnienie? Nie rozumiem, jak to działa.
JayCe
@JayCe: gotowe! (Dodałem szczegóły, które dobrze znasz, tylko dla użytkowników spoza R;))
digEmAll
ty! To ma teraz sens.
JayCe,
2

Czerwony , 256 250 bajtów

func[s][p: func[b][sort parse b[collect[any keep[copy a skip thru any a]]]]first
last sort/compare collect[foreach d p p s[if 1 < k: length? to-block d[keep/only
reduce[form unique d k]]]]func[x y][(reduce[length? x/1 x/2])< reduce[length? y/1 y/2]]]

Wypróbuj online!

Naprawdę, naprawdę długie rozwiązanie tym razem ... (westchnienie)

Pobiera dane wejściowe jako ciąg.

Wyjaśnienie:

f: func [ s ] [
    p: func [ b ] [                        ; groups and sorts the adjacent repeating items
        sort parse b [ 
            collect [                      
                any keep[
                    copy a skip thru any a ; gather any item, optionally followed by itself  
                ]
            ]
        ]
    ]
    t: copy []
    foreach d p p s [                     ; p p s transforms the input string into a block of sorted blocks of repeating digits
        if 1 < k: length? to-block d [    ; filters only the blocks that occur more than once
            insert/only t reduce [ form unique d k ] ; stores the digits and the number of occurences
                                          ; "8888858888866656665666" -> [["5" 3] ["666" 3] ["88888" 2]]
        ]
    ]
    first last sort/compare t func [ x y ] ; takes the first element (the digits) of the last block of the sorted block of items
        [ (reduce [ length? x/1 x/2 ]) < reduce [ length? y/1 y/2 ] ] ; direct comparison of the blocks
]
Galen Iwanow
źródło
2

Java (JDK 10) , 213 bajtów

s->{int l=99,X[][]=new int[10][l],d,D=0,m=0,M=0;for(var x:s.split("(?<=(.))(?!\\1)"))X[x.charAt(0)-48][x.length()]++;for(;M<1&&l-->1;)for(d=0;d++<9;)if((m=X[d][l])>1&m>M){M=m;D=d;}for(;l-->0;)System.out.print(D);}

Wypróbuj online!

Wyjaśnienie (nieaktualne)

s->{                                    // Lambda for Consumer<String>
 int l=99,                              //  Length of token, max is 99.
     X[][]=new int[10][l],              //  Array containing the occurrences per token
     d,                                 //  digit value
     D=0,                               //  digit holder for best sequence candidate
     m=0,                               //  holder of the current candidate
     M=0;                               //  best candidate for the current length of token.
 for(var x:s.split("(?<=(.))(?!\\1)"))  //  Tokenize the string into digit-repeating sequences
  X[x.charAt(0)-48][x.length()]++;      //   Add one occurrence for the token
 for(;M<1&&l-->1;)                      //  While no value has been found and for each length, descending. Do not decrease length if a value has been found.
  for(d=0;d++<9;)                       //   for each digit
   if((m=X[d][l])>1&m>M){               //    if the current occurrence count is at least 2 and that count is the current greatest for the length
    M=m;D=d;                            //     mark it as the current best
   }                                    //
 for(;l-->0;)System.out.print(D);       //  Output the best-fitting subsequence.
}                                       // 

Kredyty

Olivier Grégoire
źródło
1
Obawiam się, że na twoim j*o>Mczeku jest niewielka wada . Jeśli dobrze rozumiem, potrzeba maks length * occurrence-count. Ale dla przypadku testowego takiego jak 1113311133933933933933na przykład 111byłoby (3 * 2 = 6), a 33byłoby (2 * 6 = 12). Wyprowadza więc to, że 33ma najwyższe wystąpienie, zamiast 111być najdłuższym co najmniej dwa razy. Ponadto, var r="";for(;O-->0;)r+=D;return r;można golfed do for(;O-->0;)System.out.print(D);Jawa 10, lub nawet krócej w Javie 11: return(D+"").repeat(O);.
Kevin Cruijssen
@KevinCruijssen Myślę, że to naprawiłem.
Olivier Grégoire
1
To rzeczywiście wygląda lepiej i fajny sposób na grę w golfa w tym samym czasie. Właśnie zapomniałeś zaktualizować wyjaśnienie. I możesz zagrać w golfa jeszcze 1 bajt, zmieniając int X[][]=new int[10][99],d,l=99,na int l=99,X[][]=new int[10][l],d,.
Kevin Cruijssen
1
@KevinCruijssen Thanks! Grałem też w jeszcze jeden bajt, pisząc d++<9zamiast++d<10 . Przepraszam za resztę: jestem dzisiaj dość zmęczony = _ =
Olivier Grégoire
2

Rubin , 68 67 bajtów

->a{(b=a.chunk &:+@).max_by{|x|[(c=b.count x)<2?0:x[1].size,c]}[1]}

Wypróbuj online!

Tablice wejściowe i wyjściowe znaków.

Podejście jest dość proste: identyfikujemy przebiegi kolejnych cyfr ( chunkużywając unarnej +jako funkcji tożsamości) i przyjmujemy maksimum - najpierw według wielkości przebiegu (resetuje się do zera, jeśli jego liczba wystąpień wynosi <2), a następnie samą liczbę .

Kirill L.
źródło
2

PCRE, 152 bajty

(\d)(?<!(?=\1)..)(?=(\1*)(?!\1).*(?!\1).\1\2(?!\1))(?!(?:(?=\2((\3?+)(\d)(\5*)))){1,592}?(?=\2\3.*(?!\5).\5\6(?!\5))(?:\1(?=\1*\4\5(\7?+\5)))*+(?!\1))\2

Zobacz to w akcji na: https://regex101.com/r/0U0dEp/1 (wystarczy spojrzeć na pierwsze dopasowanie w każdym przypadku testowym)

To jest dla zabawy, ponieważ regex nie jest prawdziwym językiem programowania sam w sobie, a rozwiązanie jest ograniczone: P

Ponieważ grupa o zerowej szerokości, taka jak (?:)+dopasowuje się tylko raz i nie powtarza się w nieskończoność, a ponieważ PCRE wewnętrznie tworzy kopie grup określone ilościowo z ograniczeniami, musiałem tam użyć magicznej liczby („{1,592}”), która oznacza, że ​​możemy przejrzeć do 592 ciągłych zestawów cyfr naprzód, aby znaleźć zestaw konkurencyjny, który może być dłuższy niż aktualnie kontrolowany. Więcej informacji na temat tej koncepcji tutaj .

jaytea
źródło
1

Perl 5 , 88 bajtów

my($m,%s);++$i%2*$s{$_}++&&($n=$s{$_}/9+length)>$m&&($a=$_,$m=$n)for pop=~/((.)\2*)/g;$a

Wypróbuj online!

Lekko niestrzeżony, z testami:

sub f {
  my($m,%s);
  my($i,$n,$a);           #not needed in golfed version
  ++$i % 2  *  $s{$_}++
  && ($n=$s{$_}/9+length) > $m
  && ($a=$_, $m=$n)
    for pop=~/((.)\2*)/g; #i.e. 7888885466662716666 => 7 88888 5 4 6666 2 7 1 6666
  $a
}
for(map[/\d+/g],split/\n/,join"",<DATA>){ #tests
  my($i,@e)=@$_;
  printf "%-6s   input %-24s   expected %-10s   got %s\n",
    (grep f($i) eq $_, @e) ? "Ok" : "Not ok", $i, join('|',@e), f($i);
}
__DATA__
Input:  7888885466662716666     Output: 6666
Input:  3331113331119111        Output: 111
Input:  777333777333            Output: 777|333
Input:  122222233433            Output: 33
Input:  811774177781382         Output: 8
Input:  555153333551            Output: 1
Input:  12321                   Output: 1|2
Input:  944949949494999494      Output: 4
Input:  8888858888866656665666  Output: 88888
Input:  1112221112221111        Output: 111|222
Kjetil S.
źródło
1

Wolfram Language (Mathematica) , 67 bajtów

#&@@@MaximalBy[Select[Tally@Split@#,Last@#>1&],{Length@#,#2}&@@#&]&

Czysta funkcja. Pobiera listę cyfr jako dane wejściowe i zwraca listę podsekwencji (w określonej kolejności) jako dane wyjściowe. Nie jestem pewien, czy klauzula „musi pojawić się co najmniej dwa razy” może być traktowana w bardziej przejrzysty sposób. Wypróbuj online!

LegionMammal978
źródło
1
Czy mógłbyś dodać do niego link TIO?
Kevin Cruijssen
Jeśli naprawdę nalegasz ...
LegionMammal978 18.09.18
1

Japt -h , 12 bajtów

Dane wejściowe i wyjściowe są łańcuchami.

ò¦ ñÊf@ÓZè¶X

Spróbuj

Kudłaty
źródło