Esto está inspirado en un problema del mundo real que tuve. Tengo curiosidad por ver si hay alguna manera inteligente de hacer esto.
Se le dan dos matrices sin clasificar, A y B, cada una con un número arbitrario de flotantes. A y B no necesariamente tienen las mismas longitudes. Escriba una función que tome los elementos de A secuencialmente y encuentre el valor más cercano en la matriz B. El resultado debe estar contenido en una nueva matriz.
Condición de victoria
El código más corto gana (como de costumbre).
Respuestas:
APL, 13
17(21 bytes en UTF-8)
Si quieres una verdadera lambda (A como argumento izquierdo y B como derecho):
Cómo funciona:
{...}¨A
invoca la función lambda{...}
con cada valor A (en lugar de invocar con A como matriz), reuniendo los resultados en una matriz de la misma forma|⍵-B
calcula valores absolutos de diferencia entre el argumento ⍵ y todo en B (- es resta, | es abs).↑⍋
toma el índice del elemento mínimo (⍋ ordena la matriz que devuelve índices, ↑ obtiene el primer elemento)B[...]
solo busca elementos por índice (es).La solución es bastante sencilla, aunque utiliza una característica maravillosa de la función de clasificación de APL que devuelve el vector de permutación (índices del elemento ordenado en la matriz original) en lugar de la matriz ordenada en sí.
fuente
Mathematica - 17
¿Como funciona? Sí, admito que hay un poco de trampa aquí porque Mathematica tiene la funcionalidad más cercana incorporada. El resto es sencillo y se ocupa de organizar el resultado en una matriz 1D. Se ve feo solo por el esfuerzo extra de hacerlo corto.
fuente
C# -
1039787 BytesNo estoy muy seguro de haber entendido esta pregunta correctamente, pero de todos modos esta es mi solución.
Usé Listas en lugar de matrices, porque me permite escribir código más corto.Una matriz de enteros es más corta que una lista de enteros.
Entrada:
Método:
Salida:
Si mi respuesta no es correcta, deje un comentario debajo.
EDITAR: Como señaló @grax, la pregunta ahora es sobre flotadores. Por lo tanto, me gustaría incluir su respuesta también.
95 bytes (respuesta de Grax)
fuente
item
dei
y usted será seguro 6 caracteres adicionales;)float[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
R, 41 caracteres
Explicación:
outer(A,B,`-`)
calcula para cada elemento x de A la diferenciax-B
y genera el resultado como una matriz (de dimensión longitud (A) x longitud (B)).which.min
selecciona el índice del número mínimo.apply(x, 1, f)
aplica la funciónf
en cada fila de la matrizx
.Entonces
apply(abs(outer(A,B,`-`)),1,which.min)
devuelve los índices de la diferencia absoluta mínima entre cada elemento de A y los elementos del vector B.Uso:
fuente
CJam - 14
El código principal está en la segunda línea, el resto es para usar la entrada estándar y la salida bonita.
Pruébalo en http://cjam.aditsu.net/
Explicación:
q~
lee y evalúa la entrada,f{...}
ejecuta el bloque para cada elemento de la primera matriz y el siguiente objeto (que es la segunda matriz), recogiendo los resultados en una matriz{...}$
clasifica la segunda matriz usando el bloque para calcular una clave para cada elemento que1$
copia el actual el elemento de la primera matriz-z
resta y luego toma el valor absoluto0=
toma el primer valor de la matriz ordenada (el que tiene la clave mínima)\;
descarta el elemento de la primera matrizp
imprime la representación de cadena del resultadoEjemplos (inspirados en otras respuestas):
Entrada:
[10.1 11.2 12.3 13.4 9.5] [10 12 14]
Salida:
[10 12 12 14 10]
Entrada:
[0 25 10 38] [3 22 15 49 2]
Salida:
[2 22 15 49]
fuente
Javascript (E6) 54
56 59Minimiza la distancia. Usando cuadrado en lugar de abdominales solo para guardar caracteres.
Editar álgebra ...
Editar asignación inútil fija (el resto de una prueba sin la definición de la función)
Fue
F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])
Prueba
Resultado:
[10, 12, 12, 14, 10]
fuente
D=
no es necesario, ya quemap
devuelve una nueva matriz. Alternativa función (misma longitud) para ordenar:(x,y)=>(x-=a)*x-(y-=a)*y
Python 3.x - 55 caracteres
a
yb
son las matrices de entrada, y la matriz deseada es el resultado de la expresión.fuente
Haskell, 55
Al principio, pensé en usar
minimumBy
ycomparing
, pero como no están en Prelude, se necesitaron muchos personajes para calificarlos. También robó la idea de cuadratura de algunas otras respuestas para afeitar a un personaje.fuente
PowerShell - 44
Ejemplo
Con
$a
y$b
configurado en:La salida es
fuente
$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
Rubí, 40
Igual que la respuesta de Python, pero la cuadratura es un poco más tersa que cualquier otra forma en que se me ocurra tomar un valor absoluto.
fuente
Pyth -
1211 bytesNota: Pyth es mucho más joven que este desafío, por lo que esta respuesta no es elegible para ganar.
Método simple, utiliza la
o
función de orden para obtener una distancia mínima y lam
aplica sobre la listaa
.Pruébelo en línea aquí .
fuente
TI-BASIC, 24
No se acerca a APL, pero utiliza funciones menos potentes; esto no utiliza la función "ordenado por" o "índice de menor importancia". La desventaja de TI-BASIC aquí es su falta de esas funciones y matrices multidimensionales.
Sin golf:
La función min (tiene dos comportamientos: cuando se usa con números o listas reales, da el valor más pequeño; sin embargo, cuando se usa con números o listas complejas, da el valor con el valor absoluto más pequeño. Agregar
0i
o multiplicar pori^2
hace que el intérprete usa el segundo comportamiento, entoncesmin(1,-2)
retorna-2
mientras quemin(1+0i,-2+0i)
regresa1
.fuente
Fortran 90: 88
Esto requiere que se
contain
edite dentro de un programa completo:Los corchetes declaran una matriz mientras
(...,i=)
representa undo
bucle implícito ; Luego devuelvo el valor deb
para qué elementoa(i)-b
se minimiza.fuente
Matlab: 48
Asume que
A
yB
son matrices 1D en el espacio de trabajo, el resultado final estáC
en el espacio de trabajo. Esto probablemente también funcionaría en Octave. La indexación condicional hace que esto sea bastante trivial.fuente
C 144
163De acuerdo ... creo que este pequeño código necesita explicación.
Al principio intenté hacer el trabajo con dos niveles de bucle for para encontrar la diferencia mínima y establecer el valor actual en min del valor de B. Eso es muy básico.
Se puede alcanzar lo mismo con qsort y una función de comparación. Hago que clasifique B por la diferencia en lugar de los elementos de B. Demasiadas funciones para un algoritmo tan pequeño. Entonces, la función q ahora tiene dos propósitos. Al principio, es el algoritmo mismo, en segundo lugar (cuando qsort lo llama) un comparador. Para la comunicación entre los dos estados, tuve que declarar globales.
m significa si está en estado de comparación o el principal .
ejemplo:
fuente
GolfScript, 49 bytes
Nota: esta es una solución parcial. Estoy trabajando para que sea una solución completa
Sí. GolfScript admite punto flotante. Pruébalo aquí . Ejemplo:
Salida:
fuente
C # 262
El programa encuentra diferencias mínimas y guarda el valor más cercano de Array B. Trabajaré en el golf en breve.
Programa completo con código de prueba
fuente
C #: 120
Linq es asombroso:
fuente