Para esta tarea, su código debe tomar dos matrices ordenadas de enteros X e Y como entrada. Debe calcular la suma de las distancias absolutas entre cada número entero en X y su número más cercano en Y.
Ejemplos:
X = (1 5,9)
Y = (3,4,7)
La distancia es 2 + 1 + 2.
X = (1,2,3)
Y = (0,8)
La distancia es 1 + 2 + 3.
Su código puede recibir información de cualquier manera que sea conveniente.
La restricción principal es que su código debe ejecutarse en tiempo lineal en la suma de la longitud de las dos matrices. . (Puede suponer que agregar dos enteros lleva tiempo constante).
1 + 2 + 3
deriva deX = (1,2,3)
yY = (0,8)
?1
,2
y3
enY
IS0
. Por lo tanto, las diferencias son1-0
,2-0
,3-0
.Respuestas:
Haskell ,
7064 bytesPruébalo en línea!
Explicación
Primero definimos
(%)
como la diferencia absoluta entre dos números. Luego definimos(#)
ser la función interesante. En la primera línea, coincidimos cuando ambas listas no están vacías:En nuestro primer caso de aquí nos atamos
d
ae:_
cone:_<-d
. Esto asegura qued
no esté vacío y establece su primer elementoe
.Entonces, si el segundo elemento de ( ) está más cerca que la primera ( ) al primer elemento de X ( ), volvemos retirar el primer elemento de Y y llamar de nuevo con la misma X .Y X Y X
e
c
a
x#d
Si hacemos coincidir el patrón pero no pasamos la condición que hacemos:
Lo cual elimina el primer elemento de y agrega la diferencia absoluta del primer elemento de X al resultado restante.X X
Finalmente, si no coincidimos con el patrón, devolvemos . No coincidir con el patrón significa que X debe estar vacío porque Y no puede estar vacío.0 0 X Y
Este algoritmo tiene notación de orden .O ( | XEl | + | YEl | )
Haskell , 34 bytes
Así es como lo haría en tiempo :O ( | XEl | × | YEl | )
Pruébalo en línea!
fuente
Python 2 ,
124120 bytesPruébalo en línea!
Se guardaron 4 bytes moviéndose al programa versus la función.
Es posible cumplir con la restricción de complejidad de tiempo porque ambas listas están ordenadas. Tenga en cuenta que cada vez alrededor del ciclo,
i
se incrementa oj
se incrementa. Por lo tanto, el bucle se ejecuta en la mayoría de loslen(X)+len(Y)
casos.fuente
C (gcc), 82 bytes
Esto toma la entrada como dos matrices enteras y sus longitudes (ya que C no tiene forma de obtener su longitud de otra manera). Se puede mostrar que se ejecuta
O(a+b)
porquea
ob
se disminuye en cada iteración del bucle, que termina cuandoa
llega0
(yb
no se puede disminuir a continuación0
).Pruébalo en línea!
Algunas notas:
En lugar de indexar en las matrices, el incremento de los punteros y la eliminación de referencias directamente ahorra suficientes bytes para que valga la pena (
*x
vsx[a]
yy[1]
vsy[b+1]
).La
--b&&
condición se verifica deb>1
forma indirecta; sib
es así1
, se evaluará a cero. Como esto se modificab
, no necesitamos cambiarlo en la primera rama del ternario (que avanzay
), pero sí necesitamos volver a cambiarlo en la segunda (que avanzax
).No
return
se necesita ninguna declaración, porque la magia negra. (Creo que se debe a que la última declaración que se evaluará siempre será lan+=...
expresión, que usa el mismo registro que el utilizado para los valores de retorno).fuente
Ruby, 88 bytes
Pruébalo en línea!
Además, por diversión, una función anónima más corta que no cumple con las restricciones de complejidad:
fuente
[5, 6], [0, 1, 5]
.JavaScript (Node.js) , 80 bytes
x
,y
se pasan por referencia, que no copian el contenido1/v
es falso six[i]
está fuera de rango, de lo contrario es ciertot
->d>y[j+1]-v
->v+v>y[j]+y[j+1]
es falso siempre que se cumplan las siguientes condiciones. Y lo que significay[j]
es el número más cercano av
eny
v
es menor(y[j]+y[j+1])/2
oy[j+1]
está fuera de rango, lo que convertiríaNaN
y compararía con elNaN
rendimientofalse
>
signo para guardar 1 byte mást
siempre es un valor booleano y*
conviértalo a0
/1
antes de calcularPruébalo en línea!
fuente
Mathematica, 40 bytes
Si debe crear un programa completo, con entradas:
Aquí está el tiempo para hasta 1,000,000 de puntos (muestreados cada 10,000) para
y
:Cercano a lineal.
fuente