Encontre as execuções dentro de uma matriz
Uma execução é definida como três ou mais números que aumentam a partir da anterior com uma etapa constante. Por exemplo [1,2,3] seria uma corrida com a etapa 1, [1,3,5,7] seria uma corrida com a etapa 2 e [1,2,4,5] não é uma corrida.
Podemos expressar essas execuções pela notação "i a j por s", onde i é o primeiro número da execução, j é o último número da execução e s é a etapa. No entanto, as execuções da etapa 1 serão expressas "i a j".
Então, usando as matrizes anteriores, obtemos:
[1,2,3] -> "1 a 3"
[1,3,5,7] -> "1 a 7 por 2"
[1,2,4,5] -> "1 2 4 5"
Nesse desafio, é sua tarefa fazer isso para matrizes que podem ter várias execuções.
Exemplo de código Python com recursão:
def arr_comp_rec(a, start_index):
# Early exit and recursion end point
if start_index == len(a)-1:
return str(a[-1])
elif start_index == len(a):
return ''
# Keep track of first delta to compare while searching
first_delta = a[start_index+1] - a[start_index]
last = True
for i in range(start_index, len(a)-1):
delta = a[i+1] - a[i]
if delta != first_delta:
last = False
break
# If it ran through the for loop, we need to make sure it gets the last value
if last: i += 1
if i - start_index > 1:
# There is more than 2 numbers between the indexes
if first_delta == 1:
# We don't need by if step = 1
return "{}to{} ".format(a[start_index], a[i]) + arr_comp_rec(a, i+1)
else:
return "{}to{}by{} ".format(a[start_index], a[i], first_delta) + arr_comp_rec(a, i+1)
else:
# There is only one number we can return
return "{} ".format(a[start_index]) + arr_comp_rec(a, i)
Entrada
Matriz de entradas positivas classificadas (sem duplicatas)
Resultado
Cadeia de execuções separada por um espaço ou uma matriz de cadeias de execuções
Não precisa ser ganancioso em uma direção específica
Pode ter espaço em branco à direita
Casos de teste
In: [1000, 1002, 1004, 1006, 1008, 1010]
Out: "1000to1010by2"
In: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
Out: "1to3 5 8 13 21 34 55 89 144 233"
In: [10, 20, 30, 40, 60]
Out: "10to40by10 60"
In: [5, 6, 8, 11, 15, 16, 17]
Out: "5 6 8 11 15to17"
In: [1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 30, 45, 50, 60, 70, 80, 90, 91, 93]
Out: "1to7 9to15by2 30 45 50to90by10 91 93"
Este é o código-golfe, pelo que o menor número de bytes vence.
fonte
[4, 5, 6, 7, 9, 11, 13, 15]
não ser4to6 7to15by2
?)Respostas:
Geléia ,
4240 bytes-2 graças a Kevin Cruijssen (filtrar dois
ḟ2
, em vez de substituir dois por zeros2,0y
)Um programa completo imprimindo o resultado.
(Como um link monádico, seria gerada uma lista contendo uma mistura de números inteiros e caracteres)
Experimente online!
(Ineficiente demais para o maior caso de teste ser concluído em 60s, removi-o
[1,2,3,4]
.)Quão?
fonte
2,0ySƲÞ
pode ser jogadoḟ2SƊÞ
para -2 bytes.P
, em vez de uma somaS
e precisaria dos zeros.Rápido, 246 bytes
Experimente online!
fonte
K (ngn / k) , 102 bytes
Experimente online!
fonte
JavaScript (ES6), 129 bytes
Retorna uma matriz de strings.
Experimente online!
Quão?
Passo 1
Primeiro, anexamos a cada número um sufixo que consiste em um líder
'-'
seguido pela diferença com o próximo número, exceto a última entrada que permanece inalterada. Essa nova matriz é coagida a uma sequência.Exemplo:
Passo 2
Identificamos todas as execuções na sequência resultante e as substituímos pela notação apropriada.
Exemplo:
Etapa 3
Finalmente, dividimos a string nos sufixos restantes, incluindo as vírgulas finais.
Exemplo:
fonte
Ruby ,
125118 bytesExperimente online!
Explicação
O Ruby Enumerable possui um
chunk
método útil que faz exatamente o que precisamos aqui - agrupa itens por execuções consecutivas do mesmo valor de retorno do bloco, no nosso caso - a diferença entre o valor atual (x
) e o anterior (y
).A ressalva é que essa estratégia não capturará o primeiro elemento da corrida, por exemplo, aqui apenas os dois últimos elementos são agrupados:
Portanto, durante o mapeamento para as seqüências de caracteres formatadas corretamente, quando encontramos uma nova execução em potencial (parte com> 1 item), devemos rastrear se o item anterior era único (
i=1
) ou já usado em outra execução (i=0
). Se houver um item único não utilizado, ele se tornará o ponto de partida da execução e reduzirá o limite do tamanho do bloco de 3 para 2.fonte
R ,
180175 bytesExperimente online!
Conceitualmente, esta é uma porta da minha resposta Ruby , embora obviamente seja um pouco diferente tecnicamente.
5 bytes salvos pelo JayCe.
fonte
rle
mas era muito preguiçoso ... você pode economizar 1 byte fazendosum(1|x)
no lugar delength(x)
: TIOcat
para 175 bytes: TIOR ,
238217 bytesObrigado @digEmAll por -19 bytes.
Experimente online!
fonte
F
vez den
como já foi inicializado0
, o que deve economizar alguns bytes, eu acho.split
,diff
erle
. Infelizmente, a busca gananciosa por corridas significa muita brincadeira.'by'[D>1]
é um bom truque.JavaScript (Node.js) ,
177173 bytesExperimente online!
fonte
Limpo ,
208... 185 bytesExperimente online!
fonte
Geléia , 41 bytes
Experimente online!
Programa completo.
fonte
Python 2 ,
170166 bytesExperimente online!
fonte
Python 2 ,
138136 bytes-2 bytes graças a Erik, o Outgolfer .
Experimente online!
fonte
gvm (commit 2612106 ) bytecode, 108 bytes
Espera o tamanho da matriz em uma linha e, em seguida, os membros em uma linha.
Hexdump:
Execuções de teste:
Montado manualmente a partir disso:
fonte
05AB1E (herdado) ,
4950 bytesMuito tempo, mas já estou feliz que esteja funcionando. Este desafio é muito mais difícil do que parece imo .. Sem dúvida pode ser ainda mais jogado.
Σ€g2KO>}¤
é um porto da resposta2,0ySƲÞṪ
de @JonathanAllan Jelly (obrigado!).Experimente online.(NOTA: Tempo limite excedido para os grandes casos de teste.)
+1 byte como correção de bug, porque
0
é sempre colocado em uma posição à direita na classificação.Explicação:
fonte
Perl 5 , 154 bytes
Mesmo com espaços, novas linhas, # comentários e
sub by
:Experimente online!
... para passar nos testes do OP.
fonte
Retina 0.8.2 , 77 bytes
Experimente online! O link inclui casos de teste. Explicação:
Converta para unário.
Calcular diferenças consecutivas.
Converter é executado em
to...by
sintaxe.Remova as diferenças não convertidas e
by1
.Converta para decimal.
fonte