Pour cette tâche, votre code doit prendre deux tableaux triés d'entiers X et Y en entrée. Il doit calculer la somme des distances absolues entre chaque entier dans X et son nombre le plus proche dans Y.
Exemples:
X = (1 5,9)
Y = (3,4,7)
La distance est de 2 + 1 + 2.
X = (1,2,3)
Y = (0,8)
La distance est de 1 + 2 + 3.
Votre code peut être saisi de la manière qui vous convient.
La principale restriction est que votre code doit s'exécuter en temps linéaire dans la somme de la longueur des deux tableaux. . (Vous pouvez supposer que l'ajout de deux entiers prend un temps constant.)
1 + 2 + 3
dérivé deX = (1,2,3)
etY = (0,8)
?1
,2
et3
enY
est -0
. Ainsi , les différences sont1-0
,2-0
,3-0
.Réponses:
Haskell ,
7064 octetsEssayez-le en ligne!
Explication
Nous définissons
(%)
d'abord la différence absolue entre deux nombres. Ensuite, nous définissons(#)
comme la fonction intéressante. Dans la première ligne, nous correspondons lorsque les deux listes ne sont pas vides:Sur notre premier cas , d'ici nous engageons
d
àe:_
avece:_<-d
. Cela garantit qu'ild
n'est pas vide et définit son premier élément sure
.Ensuite , si le deuxième élément de ( ) est plus proche que la première ( ) au premier élément de X ( ), nous revenons supprimons le premier élément de Y et d' appeler à nouveau avec le même X .Oui X Oui X
e
c
a
x#d
Si nous correspondons au modèle mais ne remplissons pas la condition que nous faisons:
Ce qui supprime le premier élément de et en ajoute la différence absolue du premier élément de X au résultat restant.X X
Enfin, si nous ne correspondons pas au modèle, nous retournons . Le fait de ne pas correspondre au motif signifie que X doit être vide car Y ne peut pas être vide.0 X Oui
Cet algorithme a la notation d'ordre .O ( | X| + | Oui| )
Haskell , 34 octets
Voici comment je le ferais en temps :O ( | X| × | Oui| )
Essayez-le en ligne!
la source
Python 2 ,
124120 octetsEssayez-le en ligne!
4 octets enregistrés en passant au programme par rapport à la fonction.
Il est possible de respecter la contrainte de complexité temporelle car les deux listes sont triées. Notez que chaque fois dans la boucle, soit
i
est incrémenté soitj
incrémenté. Ainsi, la boucle est exécutée la plupart dulen(X)+len(Y)
temps.la source
C (gcc), 82 octets
Cela prend l'entrée comme deux tableaux entiers et leurs longueurs (puisque C n'a aucun moyen d'obtenir leur longueur autrement). Il peut être démontré que cela s'exécute
O(a+b)
car soita
oub
est décrémenté à chaque itération de la boucle, qui se termine lorsquea
atteint0
(etb
ne peut pas être décrémenté ci-dessous0
).Essayez-le en ligne!
Quelques notes:
Au lieu d'indexer dans les tableaux, l'incrémentation des pointeurs et le déréférencement économisent directement suffisamment d'octets pour que cela en vaille la peine (
*x
vsx[a]
ety[1]
vsy[b+1]
).La
--b&&
condition vérifie deb>1
manière détournée - sib
c'est le cas1
, elle sera évaluée à zéro. Puisque cela modifieb
, nous n'avons pas besoin de le changer dans la première branche du ternaire (qui avancey
), mais nous devons le changer de nouveau dans la seconde (qui avancex
).Aucune
return
déclaration n'est nécessaire, car la magie noire. (Je pense que c'est parce que la dernière instruction à évaluer sera toujours l'n+=...
expression, qui utilise le même registre que celui utilisé pour les valeurs de retour.)la source
Rubis, 88 octets
Essayez-le en ligne!
De plus, pour le plaisir, une fonction anonyme plus courte qui ne répond pas tout à fait aux restrictions de complexité:
la source
[5, 6], [0, 1, 5]
.JavaScript (Node.js) , 80 octets
x
,y
sont transmis par référence, qui ne copient pas le contenu1/v
est faux six[i]
est hors de portée, véridique sinont
->d>y[j+1]-v
->v+v>y[j]+y[j+1]
est faux tant que les conditions suivantes sont remplies. Et ces moyensy[j]
est le nombre le plus proche dev
chezy
v
est inférieur à(y[j]+y[j+1])/2
, ouy[j+1]
est hors de portée, ce qui se convertiraitNaN
et se comparerait àNaN
rendementfalse
>
signe pour économiser 1 octet de plust
est toujours une valeur booléenne, et*
convertissez-la en0
/1
avant de calculerEssayez-le en ligne!
la source
Mathematica, 40 octets
Si vous devez créer un programme complet, avec des entrées:
Voici le timing pour jusqu'à 1 000 000 de points (échantillonnés tous les 10 000) pour
y
:Proche du linéaire.
la source