Encontre a execução mais longa de dígitos consecutivos

15

Desafio simples: dada uma série de números inteiros positivos, encontre o número que contém entre seus dígitos o maior número de dígitos consecutivos. O truque? É permitido que os dígitos nas execuções contornem os valores possíveis ( 0123456789) e retrocedam. Portanto 2345, ambos 89012e 5432109são execuções válidas de dígitos consecutivos (mas não3456765 nem321090123 como o prazo deve ser sempre na mesma direção, embora 3456765pode ser considerado como duas corridas: 34567e 765). No caso de empate, devolva o primeiro.

Casos de teste:

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

Notas:

  • Haverá pelo menos um número na entrada.
  • Os números de entrada podem conter zeros à esquerda.
  • Entrada e saída podem estar em qualquer formato razoável . Assim, os números de entrada podem ser tomados como strings, listas de dígitos / caracteres ...
  • A saída pode conter espaços em branco à direita e / ou à esquerda e novas linhas, desde que o número seja impresso.
  • Isso é , portanto, pode ganhar o programa / função mais curto para cada idioma!
Charlie
fonte
Relacionado .
Charlie
Só para ter certeza, a lista em si não pode quebrar, certo? (Eu entendi errado o agrupamento de dígitos como agrupamento de lista), portanto, [7,8,1,6]tem uma execução máxima de, em [7,8]vez de [6,7,8], sim?
Jonathan Allan
1
@ JonathanAllan sim, a execução máxima é 78nesse caso.
Charlie

Respostas:

4

Gelatina , 18 bytes

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

Experimente online!

Toma e retorna como lista de dígitos, para preservar os zeros à esquerda.

Erik, o Outgolfer
fonte
Problema semelhante ao meu - tente esta fora para o tamanho (creio que retorna o resultado errado - Eu sugeri-lo como um caso de teste só para ter certeza).
Jonathan Allan
@ JonathanAllan Eu acho que essa é a saída certa? (há 3210, em primeiro número btw)
Erik o Outgolfer
Ah opa, isso , desculpe!
Jonathan Allan
@ JonathanAllan Oh, eu entendo o que você quer dizer ... provavelmente é por causa do Alá dentro.
Erik the Outgolfer
@JonathanAllan Fixed.
Erik the Outgolfer
3

JavaScript (ES6), 104 102 98 bytes

Recebe a entrada como uma lista de listas de dígitos. Retorna o melhor.

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

Casos de teste

Arnauld
fonte
3

Geléia ,  18 16  15 bytes

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

Um link monádico que obtém uma lista de listas de dígitos e retorna o mais à esquerda que contém uma execução máxima, conforme descrito.

Experimente online! ou consulte um conjunto de testes (com processamento para fazer com que a E / S pareça estar em questão).

Quão?

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
fonte
V€Se não tiver certeza disso, talvez seja necessário contar os zeros à esquerda.
Erik the Outgolfer
Isso não conta zeros à esquerda da entrada picar, no entanto vejo que pode levar listas de listas de dígitos ...
Jonathan Allan
Eu acho que você deveria suportar zeros à esquerda.
Erik the Outgolfer
Eu apoio zeros à esquerda
Jonathan Allan
1
Eu li isso como "Isso não conta ..."
Erik the Outgolfer
2

Python 2 , 118 bytes

Faz uma lista de listas de dígitos a; retorna uma de suas listas.

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

Experimente online!

Lynn
fonte
Falha na entrada [[9,0,9,0],[1,2,3]].
Zgarb 02/08/19
@ Zgarb Opa, você está certo. Voltar para uma versão antiga eu vou.
Lynn
1

Casca , 20 bytes

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

Pega e retorna uma lista de listas de dígitos. Experimente online!

Explicação

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

MATLAB, 130 bytes

Pegue a entrada na matriz, matriz das diferenças de coluna [X (2) -X (1), ..., X (n) -X (n-1)], verifique o valor mais frequente na matriz (1 ordem crescente - 1 caso contrário), obtenha o índice para o valor mais frequente ou -9 multiplicado pelo valor mais frequente (-9 ocorre em ordem crescente, 9 caso contrário), encontre os índices consecutivos (ou seja, cuja diferença seja igual a 1) e some-o por favor, porque é tarde. Saída o maior.

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)

Experimente online!

J Doe
fonte