Znajdź najdłuższy ciąg kolejnych cyfr

15

Proste wyzwanie: biorąc pod uwagę serię liczb całkowitych dodatnich, znajdź liczbę zawierającą wśród jej cyfr najdłuższy ciąg kolejnych cyfr. Sztuczka? Cyfry w biegach mogą owijać się wokół możliwych wartości ( 0123456789) i biegać wstecz. Więc oba 2345, 89012i 5432109są ważne przebiegi kolejnych cyfr (ale nie 3456765ani 321090123jak bieg musi być zawsze w tym samym kierunku, choć 3456765można uznać za dwóch tras: 34567a 765). W przypadku remisów zwróć pierwszy.

Przypadki testowe:

Input:  [3274569283, 387652323, 23987654323648, 2345687913624]
Output: 23987654323648 
        (The run is 98765432; run length: 8)

Input:  [123012363672023, 098761766325432, 15890123456765]
Output: 15890123456765
        (The run is 8901234567; run length: 10)

Input:  [43, 19, 456]
Output: 456

Input:  [5, 9, 0]
Output: 5

Input:  [71232107, 7012347]
Output: 7012347

Input:  [1234, 32109876]
Output: 32109876

Input:  [9090, 123]
Output: 123

Uwagi:

  • Na wejściu będzie co najmniej jedna liczba.
  • Liczby wejściowe mogą zawierać początkowe zera.
  • Dane wejściowe i wyjściowe mogą być w dowolnym rozsądnym formacie . Więc liczby wejściowe można traktować jako ciągi znaków, listy cyfr / znaków ...
  • Dane wyjściowe mogą zawierać końcowe i / lub wiodące białe znaki oraz znaki nowej linii, o ile drukowana jest liczba.
  • To jest , więc wygrywa najkrótszy program / funkcja dla każdego języka!
Charlie
źródło
Związane .
Charlie,
Dla pewności sama lista nie może się zawinąć, prawda? (Źle zrozumiałem zawijanie cyfr jako zawijanie list), więc [7,8,1,6]ma maksymalny przebieg [7,8]raczej niż [6,7,8], tak?
Jonathan Allan
1
@JonathanAllan tak, 78w takim przypadku maksymalny przebieg jest w tym przypadku.
Charlie,

Odpowiedzi:

4

Galaretka , 18 bajtów

I9,-;N¤yŒgỊS€ṀµÐṀḢ

Wypróbuj online!

Pobiera i zwraca jako listę cyfr, aby zachować wiodące zera.

Erik the Outgolfer
źródło
Podobny problem do mojego - wypróbuj to dla wielkości (uważam, że zwraca zły wynik - zasugerowałem to jako przypadek testowy).
Jonathan Allan
@JonathanAllan Myślę, że to właściwy wynik? (jest 3210pierwszy numer btw)
Erik the Outgolfer
Ach oops, to , przepraszam!
Jonathan Allan
@JonathanAllan Oh Rozumiem, co masz na myśli ... to prawdopodobnie z powodu tego, co Atam jest.
Erik the Outgolfer
@JonathanAllan Naprawiono.
Erik the Outgolfer
3

JavaScript (ES6), 104 102 98 bajtów

Pobiera dane wejściowe jako listę list cyfr. Zwraca najlepszy.

a=>a.map(s=>s.map(n=>(i=(d=(x-(x=n)+11)%10)&&d-2?0:d-p?(p=d,1):i+1)>j&&(r=s,j=i),p=x=-10),j=-1)&&r

Przypadki testowe

Arnauld
źródło
3

Galaretka ,  18 16  15 bajtów

I%⁵Œg%8ċ€1ṀµÐṀḢ

Łącze monadyczne pobierające listę cyfr i zwracające skrajnie lewą, zawierającą maksymalny przebieg, zgodnie z opisem.

Wypróbuj online! lub zobacz pakiet testowy (z przetwarzaniem, aby we / wy wyglądało tak, jak w pytaniu).

W jaki sposób?

I%⁵Œg%8ċ€1ṀµÐṀḢ - Link: list of lists of integers (digits) from [0-9]
           µÐṀ  - keep elements for which the link to the left is maximal:
I               -   incremental differences (i.e. [a2-a1, a3-a2, ...])
  ⁵             -   literal 10
 %              -   modulo by (i.e. [(a2-a1)%10, (a3-a2)%10, ...])
                -     this equates deltas of -9 and -1 with 1 and 9 respectively
   Œg           -   group runs of equal elements
     %8         -   modulo by 8; vectorised (9s become 1s, others unaffected)
       ċ€1      -   count number of 1s in €ach group
          Ṁ     -   maximum
              Ḣ - head (get the first one of those that were maximal)
Jonathan Allan
źródło
V€nie jestem pewien, być może będziesz musiał liczyć początkowe zera.
Erik the Outgolfer
To liczy początkowe zera żądła, ale widzę, że możemy wziąć listy cyfr ...
Jonathan Allan
Myślę, że powinieneś obsługiwać wiodące zera.
Erik the Outgolfer
Popieram wiodące zera
Jonathan Allan
1
Przeczytałem to jako „To się nie liczy ...”
Erik the Outgolfer
2

Python 2 , 118 bajtów

Pobiera listę cyfr a; zwraca jedną ze swoich list.

lambda a:max(a,key=lambda l:len(max(re.findall('1+|9*',`[(x-y)%10for x,y in zip(l,l[1:])]`[1::3]),key=len)))
import re

Wypróbuj online!

Lynn
źródło
Nie działa na wejściu [[9,0,9,0],[1,2,3]].
Zgarb
@Zgarb Ups, masz rację. Wracam do starej wersji. Idę.
Lynn
1

Łuska , 20 bajtów

←Ö¤<(→Of€1†%8gẊo%10-

Pobiera i zwraca listę list cyfr. Wypróbuj online!

Wyjaśnienie

←Ö¤<(→Of€1†%8gẊo%10-  Implicit input.
←                     Return first element of
 Ö                    the input sorted in a stable manner
   <                  in descending order
  ¤ (                 with respect to the following function:
                       Argument is list of digits, say [5,2,1,0,9,1,0].
                   -   Differences
               o%10    mod 10
              Ẋ        of all adjacent pairs: [7,9,9,9,2,1]
             g         Group adjacent equal elements: [[7],[9,9,9],[2],[1]]
          †%8          Vectorized mod 8: [[7],[1,1,1],[2],[1]]
       f€1             Keep those runs where 1 occurs: [[1,1,1],[1]]
      O                Sort in ascending order: [[1],[1,1,1]]
     →                 Take last element (gives [] on empty list): [1,1,1]
                       This is a list of 1s with length one less than
                       the longest run of consecutive digits.
Zgarb
źródło
1

MATLAB, 130 bajtów

Weź dane do tablicy, tablicę różnic kolumn [X (2) -X (1), ..., X (n) -X (n-1)], sprawdź najczęstszą wartość w tablicy (1 rosnąco - 1 w przeciwnym razie), uzyskaj indeks dla wartości najczęstszej lub -9 pomnożonej przez najczęstszą wartość (-9 występuje w porządku rosnącym, 9 w przeciwnym razie), znajdź kolejne wskaźniki (tj. Których różnica jest równa 1) i zsumuj ją proszę, bo jest późno. Wydaj największy.

a=input('')
t=[]
for i=1:numel(a)
b=diff(num2str(a(i))-'0')
c=mode(b)
t=[t sum(diff(find(b==c|b==-9*c))==1)]
end
[t,I]=max(t),a(I)

Wypróbuj online!

J Doe
źródło