A tarefa neste desafio é colocar elementos de uma matriz em intervalos de tempo. A entrada será uma matriz não decrescente de números inteiros positivos que representam a hora dos eventos e um número inteiro que representa o tamanho de cada posição. Vamos começar com um exemplo. Chamamos a matriz de entrada A
e a matriz de saída O
.
`A = [1,1,1,2,7,10]` and `bin_size = 2`.
`O = [4,0,0,1,1]`.
Por que ? Com a bin_size = 2
, teremos os seguintes intervalos:, (0,2], (2,4], (4,6], (6,8], (8,10]
onde quatro itens (1,1,1,2)
estão dentro do primeiro intervalo (0,2]
, nenhum no segundo e terceiro intervalos, um 7
no intervalo (6,8]
e outro 10
no intervalo (8,10]
.
Seu código deve considerar cada intervalo de comprimento a bin_size
partir de 0
e contar quantos números A
existem em cada um. Você sempre deve incluir a extremidade direita de um intervalo em uma posição para que o exemplo acima 2
seja incluído na contagem de 4
. Seu código deve ser executado em tempo linear na soma dos comprimentos da entrada e da saída.
Mais exemplos:
`A = [1,2,7,12,15]` and `bin_size = 5`.
`O = [2, 1, 2]`.
`A = [1,2,7,12,15]` and `bin_size = 3`.
`O = [2,0,1,1,1]`.
Você pode assumir que entrada e saída podem ser fornecidas em qualquer formato que achar conveniente. Você pode usar qualquer idioma e biblioteca que desejar.
0
permitidas saídas com s à direita ? Então, retornando em[2,0,1,1,1,0]
vez de[2,0,1,1,1]
?bin_size
, devemos realmente lidar com isso? Parece que a maioria das respostas sim, mas se sim, seria bom adicionar um caso de teste para esse cenário para evitar confusão.Respostas:
R , 48 bytes
Experimente online!
Mais uma vez,
table
ecut
tentandofactor
fazer o truque para o armazenamento. Emite um nomevector
ondenames
estão os intervalos, em notação de intervalo, por exemplo(0,5]
,.EDIT: reverta para a versão anterior que funciona quando
s
não é divididan
.fonte
format you [most likely do not] find convenient
sem atable
parte.cut
divide o vetor em fatores com níveis dados pelos intervalos etable
conta as ocorrências de cada valor único em sua entrada.0:ceiling(max(n)/s)*s
comseq(0,max(n)+s-1,s)
. Funciona pelo menos para as duas amostras da pergunta.1:max(n/s+1)*s-s
é outra melhoria desde os dois são equivalentesOitava , 36 bytes
Experimente online!
Caçando ovos de Páscoa e fazendo uma fogueira. Vou adicionar uma explicação quando tiver tempo.
fonte
Perl 5
-a
-i
,3228 bytesDê contagem após a opção -i. Dê a cada elemento de entrada em uma linha separada em STDIN
Experimente online!
fonte
Python 2 , 62 bytes
Experimente online!
fonte
I[-1]/s+1
deve ser~-I[-1]/s+1
.05AB1E , 18 bytes
Experimente online!
fonte
A.count
max (A) , portanto, o tempo de execução não é linear em len (A) + len (O) . Isso está correto ou eu entendi algo errado?O(max(A)*max(A))
... então é quadrática no máximo de A ... OP especificado que tinha que ser linear em termos de ... o que exatamente?APL + WIN, 23 bytes
Solicita a entrada na tela de caixas e o vetor de números inteiros:
Explicação:
fonte
C ++ (gcc) ,
9083 bytesExperimente online!
fonte
Java 8, 75 bytes
Porto da resposta Python 2 do @ DeadPossum , portanto, certifique-se de aprovar a resposta dele!
Explicação:
Experimente online.
fonte
Ruby , 60 bytes
Experimente online!
fonte
JavaScript (ES6), 60 bytes / O (len (a) + máximo (a) / n)
Guardado 5 bytes graças a @Neil
Recebe entrada na sintaxe de currying
(a)(n)
.Experimente online!
Ou apenas 43 bytes / O (len (a)) se elementos vazios forem permitidos.
fonte
[...o].map(n=>n|0)
obtém a primeira saída da segunda solução em menos bytes.Haskell ,
637570 bytesOpa, esse menor não é linear, mas quadrático;
Experimente online!
fonte
Pitão,
2322 bytesExperimente aqui
fonte
Ruby ,
5350 bytesEdit: -3 bytes por iamnotmaynard.
Experimente online!
fonte
a.max
não é múltiplo deb
(por exemplo,f[[1,1,1,2,7,10],3]
=>[4, 0, 1]
mas deve fornecer[4, 0, 2]
). Eu tentei a mesma abordagem.[4, 0, 1, 1]
)Este quebra-cabeça é essencialmente um tipo de contagem. Não sabemos o tamanho da saída sem passar pela entrada primeiro.
C (clang) , 53 bytes
Experimente online!
Esta solução utiliza os seguintes parâmetros: comprimento da
A
matriz de entradal
de Um armazenamentob
bin_sizeO
para Saída. Deve ter comprimento suficientee retornar a saída em O.
Esta solução tem uma desvantagem: ela não retorna o comprimento da matriz de saída O e, portanto, o chamador não sabe quanto imprimir.
A versão seguinte supera essa desvantagem:
C (clang) , 79 bytes
Experimente online!
Ele pega um parâmetro adicional
m
e retorna o comprimentoO
dele. Custou-me 26 bytes.fonte
C (gcc) ,
102908986 bytesExperimente online!
Agradecemos a Kevin Cruijssen por cortar 12 bytes, e o tetocat por mais 4 bytes!
fonte
int
e mudando==1
para>0
.O(n)
tempo, então você não pode ter qualquer aninhados para loops .. (Seu C ++ resposta parece bem, embora Então eu + 1-ed que um :)..)O(n)
passando pelos itens de entrada. Mesmo que o loop interno faça loop apenas duas vezes, ele já está acimaO(n)
. Ou eu estou mal-entendido alguma coisa .. Eu devo admitirO
-times não são realmente minha experiência ..