Trova la sequenza più lunga di cifre consecutive


15

Sfida semplice: data una serie di numeri interi positivi, trova il numero che contiene tra le sue cifre la sequenza più lunga di cifre consecutive. Il trucco? È consentito che le cifre nelle serie 0123456789scorrano intorno ai possibili valori ( ) e procedano all'indietro. Così sia 2345, 89012e 5432109sono percorsi validi di cifre consecutive (ma non 3456765321090123come la corsa deve essere sempre nella stessa direzione, anche se 3456765possono essere considerati come due piste: 34567e 765). In caso di vincoli, restituisci il primo.

Casi test:

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

Appunti:

  • Ci sarà almeno un numero nell'input.
  • I numeri di input possono contenere zero iniziali.
  • L'input e l'output possono essere in qualsiasi formato ragionevole . Quindi i numeri di input possono essere presi come stringhe, elenchi di cifre / caratteri ...
  • L'output può contenere spazi vuoti finali e / o iniziali e newline purché il numero sia stampato.
  • Questo è , quindi può vincere il programma / funzione più breve per ogni lingua!


Giusto per essere sicuri, l'elenco stesso non può essere completato, giusto? (Ho frainteso il wrapping delle cifre come wrapping di elenchi) quindi [7,8,1,6]ha una corsa massima [7,8]piuttosto che [6,7,8]sì?
Jonathan Allan,

1
@JonathanAllan sì, la corsa massima è 78in quel caso.
Charlie,

Risposte:


4

Gelatina , 18 byte

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

Provalo online!

Prende e ritorna come elenco di cifre in modo da preservare gli zeri iniziali.


Problema simile al mio - prova questo per dimensioni (credo che restituisca il risultato sbagliato - L'ho suggerito come test case solo per essere sicuri).
Jonathan Allan,

@JonathanAllan Penso che sia l'output giusto? (c'è 3210nel primo numero tra l'altro)
Erik the Outgolfer

Ah oops, questo , scusa!
Jonathan Allan,

@JonathanAllan Oh capisco cosa intendi ... è probabilmente a causa del fatto che Aci sono dentro.
Erik the Outgolfer,

@JonathanAllan Risolto.
Erik the Outgolfer,

3

JavaScript (ES6), 104 102 98 byte

Accetta input come un elenco di elenchi di cifre. Restituisce il migliore.

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

Casi test


3

Gelatina ,  18 16  15 byte

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

Un collegamento monadico che prende un elenco di elenchi di cifre e restituisce quello più a sinistra contenente una corsa massima come descritto.

Provalo online! oppure vedere una suite di test (con elaborazione per far sembrare l'I / O come nella domanda).

Come?

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)

V€non sono sicuro, potrebbe essere necessario contare gli zeri iniziali.
Erik the Outgolfer,

Ciò conta gli zeri iniziali dell'input della puntura, tuttavia vedo che possiamo prendere elenchi di elenchi di cifre ...
Jonathan Allan

Penso che dovresti supportare gli zero iniziali.
Erik the Outgolfer,

Sostengo i principali zeri
Jonathan Allan il

1
L'ho letto come "Quello non conta ..."
Erik the Outgolfer

2

Python 2 , 118 byte

Prende un elenco di elenchi di cifre a; restituisce uno dei suoi elenchi.

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

Provalo online!


Errore sull'input [[9,0,9,0],[1,2,3]].
Zgarb,

@Zgarb Oops, hai ragione. Torna a una versione precedente vado.
Lynn,

1

Buccia , 20 byte

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

Prende e restituisce un elenco di elenchi di cifre. Provalo online!

Spiegazione

←Ö¤<(→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.

1

MATLAB, 130 byte

Prendi input per array, array di differenze di colonna [X (2) -X (1), ..., X (n) -X (n-1)], controlla il valore più frequente nell'array (1 ordine crescente - 1 altrimenti), ottieni l'indice per il valore più frequente o -9 moltiplicato per il valore più frequente (-9 si verifica in ordine crescente, 9 altrimenti), trova gli indici consecutivi (ovvero la cui differenza è uguale a 1) e somma per favore, perché è tardi. Uscita il più grande.

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)

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.