La tarea en este desafío es colocar elementos de una matriz en contenedores de tiempo. La entrada será una matriz no decreciente de enteros positivos que representan el tiempo de los eventos, y un entero que representa el tamaño de cada bin. Comencemos con un ejemplo. Llamamos a la matriz de entrada A
y a la matriz de salida O
.
`A = [1,1,1,2,7,10]` and `bin_size = 2`.
`O = [4,0,0,1,1]`.
¿Por qué ? Con a bin_size = 2
, tendremos los siguientes intervalos: (0,2], (2,4], (4,6], (6,8], (8,10]
donde cuatro elementos (1,1,1,2)
están dentro del primer intervalo (0,2]
, ninguno en el segundo y tercer intervalo, uno 7
en el intervalo (6,8]
y uno 10
en el intervalo (8,10]
.
Su código debe considerar cada intervalo de longitud a bin_size
partir de 0
y contar cuántos números A
hay en cada uno. Siempre debe incluir el extremo derecho de un intervalo en un contenedor para que en el ejemplo anterior 2
se incluya en el recuento de 4
. Su código debe ejecutarse en tiempo lineal en la suma de las longitudes de la entrada y la salida.
Más ejemplos:
`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]`.
Puede suponer que la entrada y la salida se pueden dar en cualquier formato que considere conveniente. Puede usar cualquier idioma y biblioteca que desee.
0
permitidas las salidas con trailing s? ¿Entonces regresar en[2,0,1,1,1,0]
lugar de[2,0,1,1,1]
?bin_size
? Parece que la mayoría de las respuestas sí, pero si es así, sería bueno agregar un caso de prueba para este escenario para evitar confusiones.Respuestas:
R , 48 bytes
Pruébalo en línea!
Una vez más,
table
y haciendocut
unfactor
truco para el binning. Emite un nombrevector
dondenames
están los intervalos, en notación de intervalo, por ejemplo(0,5]
.EDITAR: vuelva a la versión anterior que funciona cuando
s
no se dividen
.fuente
format you [most likely do not] find convenient
sin latable
parte.cut
divide el vector en factores con niveles dados por los intervalos ytable
cuenta las ocurrencias de cada valor único en su entrada.0:ceiling(max(n)/s)*s
conseq(0,max(n)+s-1,s)
. Funciona al menos para las dos muestras en la pregunta.1:max(n/s+1)*s-s
es otra mejora ya que los dos son equivalentesOctava , 36 bytes
Pruébalo en línea!
Cazando huevos de Pascua y haciendo una hoguera. Agregaré una explicación cuando tenga tiempo.
fuente
Perl 5
-a
-i
,3228 bytesDar cuenta después de la opción -i. Dé a cada elemento de entrada en una línea separada en STDIN
Pruébalo en línea!
fuente
Python 2 , 62 bytes
Pruébalo en línea!
fuente
I[-1]/s+1
deberían estarlo~-I[-1]/s+1
.05AB1E , 18 bytes
Pruébalo en línea!
fuente
A.count
max (A) , por lo que el tiempo de ejecución no es lineal en len (A) + len (O) . ¿Es correcto o me equivoqué?O(max(A)*max(A))
... así que es cuadrático en el máximo de A ... OP especificó que tenía que ser lineal en términos de ... ¿qué exactamente?APL + WIN, 23 bytes
Solicita la entrada de pantalla de contenedores y luego el vector de enteros:
Explicación:
fuente
C ++ (gcc) ,
9083 bytesPruébalo en línea!
fuente
Java 8, 75 bytes
Puerto de la respuesta Python 2 de @ DeadPossum , ¡así que asegúrese de votar su respuesta!
Explicación:
Pruébalo en línea.
fuente
Rubí , 60 bytes.
Pruébalo en línea!
fuente
JavaScript (ES6), 60 bytes / O (len (a) + max (a) / n)
Guardado 5 bytes gracias a @Neil
Toma entrada en la sintaxis de curry
(a)(n)
.Pruébalo en línea!
O solo 43 bytes / O (len (a)) si se permiten elementos vacíos.
fuente
[...o].map(n=>n|0)
obtiene la primera salida de la segunda solución en menos bytes.Haskell ,
637570 bytesVaya, este más corto no es lineal sino cuadrático;
Pruébalo en línea!
fuente
Pyth,
2322 bytesPruébalo aquí
fuente
Ruby ,
5350 bytesEditar: -3 bytes por iamnotmaynard.
Pruébalo en línea!
fuente
a.max
no es un múltiplo deb
(por ejemplo,f[[1,1,1,2,7,10],3]
=>[4, 0, 1]
pero debería dar[4, 0, 2]
). Había intentado el mismo enfoque.[4, 0, 1, 1]
)Este rompecabezas es esencialmente un tipo de conteo. No sabemos la longitud de salida sin pasar primero por la entrada.
C (clang) , 53 bytes
Pruébalo en línea!
Esta solución toma los siguientes parámetros: longitud de la
A
matriz de entradal
del almacenamiento Ab
bin_sizeO
para Salida. Debe tener una longitud suficientey devuelve la salida en O.
Esta solución tiene una desventaja: no devuelve la longitud de la matriz de salida O, por lo que la persona que llama no sabe cuánto imprimir.
La siguiente versión supera esa desventaja:
C (clang) , 79 bytes
Pruébalo en línea!
Toma un parámetro adicional
m
y devuelve la longitud deO
este. Me costó 26 bytes.fuente
C (gcc) ,
102908986 bytesPruébalo en línea!
¡Gracias a Kevin Cruijssen por recortar 12 bytes y a ceilingcat por otros 4 bytes!
fuente
int
y cambiando==1
a>0
.O(n)
tiempo, por lo que no puede tener ningún anidarse para-bucles .. (C ++ Su respuesta parece bien, aunque por lo que he + 1-ed que uno :)..)O(n)
los elementos de entrada. Incluso si el bucle interno solo se repitiera 2 veces, ya está arribaO(n)
. O estoy mal entendido algo .. tengo que admitirO
-los tiempos no son realmente mi experiencia ..