Ceci est inspiré par un problème réel que j'ai eu. Je suis curieux de voir s'il existe un moyen intelligent d'y parvenir.
Vous disposez de deux tableaux non triés, A et B, contenant chacun un nombre arbitraire de flottants. A et B n'ont pas nécessairement les mêmes longueurs. Écrivez une fonction qui prend les éléments de A séquentiellement et trouve la valeur la plus proche dans le tableau B. Le résultat doit être contenu dans un nouveau tableau.
Condition de victoire
Le code le plus court gagne (comme d'habitude).
Réponses:
APL, 13
17(21 octets en UTF-8)
Si vous voulez un vrai lambda (A comme argument de gauche et B comme droit):
Comment ça marche:
{...}¨A
invoque la fonction lambda{...}
avec chaque valeur A (au lieu d'invoquer avec A comme tableau), rassemblant les résultats dans un tableau de même forme|⍵-B
calcule les valeurs absolues de différence entre l'argument ⍵ et tout dans B (- est la soustraction, | est abs).↑⍋
prend l'index du plus petit élément (⍋ trie le tableau renvoyant les indices, ↑ récupère le premier élément)B[...]
ne fait que récupérer les éléments par index (s).La solution est assez simple, bien qu'elle utilise une fonction merveilleuse de la fonction de tri d'APL renvoyant le vecteur de permutation (les indices des éléments triés dans le tableau d'origine) plutôt que le tableau trié lui-même.
la source
Mathematica - 17
Comment ça marche? Oui, j'avoue qu'il y a un peu de tricherie ici parce que Mathematica a la fonctionnalité la plus proche intégrée. Le reste est simple et concerne l'organisation du résultat dans un tableau 1D. Il a l'air moche uniquement en raison de l'effort supplémentaire pour le raccourcir.
la source
C # -
1039787 octetsJe ne suis pas sûr d'avoir bien compris cette question mais voici ma solution quand même.
J'ai utilisé des listes au lieu de tableaux, car cela me permet d'écrire du code plus court.Un tableau d'entiers est plus court qu'une liste d'entiers.
Contribution:
Méthode:
Sortie:
Si ma réponse n'est pas correcte, veuillez laisser un commentaire en dessous.
EDIT: Comme l'a souligné @grax, la question concerne maintenant les flotteurs. Par conséquent, j'aimerais également inclure sa réponse.
95 octets (réponse de Grax)
la source
item
lei
et vous protégerez 6 personnages supplémentaires;)float[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
R, 41 caractères
Explication:
outer(A,B,`-`)
calcule pour chaque élément x de A la différencex-B
et produit le résultat sous forme de matrice (de dimension longueur (A) x longueur (B)).which.min
sélectionne l'index du nombre minimal.apply(x, 1, f)
applique la fonctionf
sur chaque ligne de la matricex
. Retournedonc
apply(abs(outer(A,B,`-`)),1,which.min)
les indices de la différence absolue minimale entre chaque élément de A et les éléments du vecteur B.Usage:
la source
CJam - 14
Le code principal est sur la deuxième ligne, le reste est pour utiliser l'entrée standard et la jolie sortie.
Essayez-le sur http://cjam.aditsu.net/
Explication:
q~
lit et évalue l'entréef{...}
exécute le bloc pour chaque élément du premier tableau et l'objet suivant (qui est le deuxième tableau), la collecte des résultats dans un tableau{...}$
trie le deuxième tableau en utilisant le bloc pour calculer une clé pour chaque élément1$
copie le courant l'élément du premier tableau-z
soustrait puis prend la valeur absolue0=
prend la première valeur du tableau trié (celui avec la clé minimale)\;
rejette l'élément du premier tableaup
imprime la représentation sous forme de chaîne du résultatExemples (inspirés d'autres réponses):
Entrée:
[10.1 11.2 12.3 13.4 9.5] [10 12 14]
Sortie:
[10 12 12 14 10]
Entrée:
[0 25 10 38] [3 22 15 49 2]
Sortie:
[2 22 15 49]
la source
Javascript (E6) 54
56 59Minimisez la distance. Utilisez carré au lieu d'abs pour économiser les caractères.
Modifier l' algèbre ...
Modifier corriger l'affectation inutile (un reste d'un test sans la définition de la fonction)
Était
F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])
Tester
Résultat:
[10, 12, 12, 14, 10]
la source
D=
n'est pas nécessaire, carmap
renvoie un nouveau tableau. Fonction de tri alternative (même longueur):(x,y)=>(x-=a)*x-(y-=a)*y
Python 3.x - 55 caractères
a
etb
sont les tableaux d'entrée, et le tableau souhaité est le résultat de l'expression.la source
Haskell, 55
Au début, j'ai pensé à utiliser
minimumBy
etcomparing
, mais comme ceux-ci ne sont pas dans Prelude, il a fallu une tonne de personnages pour les qualifier. J'ai également volé l'idée de la quadrature à d'autres réponses pour raser un personnage.la source
PowerShell - 44
Exemple
Avec
$a
et$b
réglé sur:La sortie est
la source
$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
Rubis, 40
Identique à la réponse Python, mais la quadrature est un peu plus tordue que toute autre façon à laquelle je pourrais penser pour prendre une valeur absolue.
la source
Pyth -
1211 octetsRemarque: Pyth est beaucoup plus jeune que ce défi, donc cette réponse n'est pas éligible pour gagner.
Méthode simple, utilise la
o
fonction d'ordre pour obtenir une distance minimale et l'm
affiche sur la listea
.Essayez-le en ligne ici .
la source
TI-BASIC, 24
Ne se rapproche pas d'APL, mais utilise des fonctions moins puissantes - cela n'utilise aucune fonction "trié par" ou "index du moins". L'inconvénient de TI-BASIC ici est son manque de ces fonctions et tableaux multidimensionnels.
Non golfé:
La fonction min (a deux comportements: lorsqu'elle est utilisée avec des nombres réels ou des listes, elle donne la plus petite valeur; cependant, lorsqu'elle est utilisée avec des nombres ou des listes complexes, elle donne la valeur avec la plus petite valeur absolue. L'ajout
0i
ou la multiplication pari^2
provoque l'interpréteur à utilisez le deuxième comportement, doncmin(1,-2)
renvoie-2
alors quemin(1+0i,-2+0i)
renvoie1
.la source
Fortran 90: 88
Cela nécessite qu'il soit
contain
édité dans un programme complet:Les accolades carrées déclarent un tableau tandis que
(...,i=)
représente unedo
boucle implicite ; Je retourne ensuite la valeur deb
quel élémenta(i)-b
est minimisé.la source
Matlab: 48
Suppose que
A
etB
sont des matrices 1D dans l'espace de travail, le résultat final estC
dans l'espace de travail. Cela fonctionnerait probablement aussi dans Octave. L'indexation conditionnelle rend cela assez trivial.la source
C 144
163D'accord ... Je pense que ce petit code a besoin d'explications.
Au début, j'ai essayé de faire le travail avec deux niveaux de boucle pour trouver la différence min et régler la valeur actuelle sur min de la valeur de B. C'est très basique.
La même chose peut être atteinte avec qsort et une fonction de comparaison. Je le fais trier B par différence au lieu des éléments de B. Trop de fonctions pour un si petit algorithme. La fonction q a donc deux fonctions. Au début, c'est l'algorithme lui-même, ensuite (quand qsort l'appelle) un comparateur. Pour la communication entre les deux états, j'ai dû déclarer des globaux.
m signifie que ce soit dans un état de comparaison ou le principal .
exemple:
la source
GolfScript, 49 octets
Remarque: il s'agit d'une solution partielle. Je travaille pour en faire une solution complète
Oui. GolfScript prend en charge la virgule flottante. Essayez-le ici . Exemple:
Sortie:
la source
C # 262
Le programme détecte les différences min et enregistre la valeur la plus proche de la baie B. Je vais travailler sur le golf sous peu.
Programme complet avec code de test
la source
C #: 120
Linq est génial:
la source