a%b=abs$a-b
x@(a:b)#y@(c:d)|e:_<-d,a%c>a%e=x#d|1>0=a%c+b#y
_#_=0
Prué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:
x@(a:b)#(c:d:e)
En nuestro primer caso de aquí nos atamos da e:_con e:_<-d. Esto asegura que dno esté vacío y establece su primer elemento e.
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 .YecXax#dYX
Si hacemos coincidir el patrón pero no pasamos la condición que hacemos:
a%c+b#y
Lo cual elimina el primer elemento de y agrega la diferencia absoluta del primer elemento de X al resultado restante.XX
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 0XY
Este algoritmo tiene notación de orden .O ( | XEl | + | YEl | )
Así es como lo haría en tiempo :O ( | XEl | × | YEl | )
x#y=sum[minimum$abs.(z-)<$>y|z<-x]
Pruébalo en línea!
Ad Hoc Garf Hunter
fuente
1 + 2 + 3deriva deX = (1,2,3)yY = (0,8)?1,2y3enYIS0. Por lo tanto, las diferencias son1-0,2-0,3-0.