1votos

Distancia euclídea en C#

por josejuan hace 6 años

Una versión "free point" de la función solicitada pero en C# :D

Reto especialmente sencillo consistente en realizar una función que calcule la distancia euclídea entre dos puntos dados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System; 
using System.Linq; 
 
 
 
// Alias para no volverse loco, no harían falta si en C# 
// se pudiera "aplicar" y "currificar" con inferencia de 
// tipos: 
 
using E2R = System.Func<System.Collections.Generic.IEnumerable<System.Double>, System.Collections.Generic.IEnumerable<System.Double>, System.Double>; 
using E2R3E = System.Func<System.Collections.Generic.IEnumerable<System.Double>, System.Collections.Generic.IEnumerable<System.Double>, System.Func<System.Double, System.Double, System.Double>, System.Collections.Generic.IEnumerable<System.Double>>; 
using E2R3R = System.Func<System.Collections.Generic.IEnumerable<System.Double>, System.Collections.Generic.IEnumerable<System.Double>, System.Func<System.Double, System.Double, System.Double>, System.Double>; 
using ER = System.Func<System.Collections.Generic.IEnumerable<System.Double>, System.Double>; 
using R = System.Double; 
using R2 = System.Func<System.Double, System.Double>; 
using R3 = System.Func<System.Double, System.Double, System.Double>; 
 
 
 
 
namespace freePointCSharp { 
 
    class Program { 
 
 
 
        // Aquí la composición de funciones, en 
        // un lenguaje como Haskell, estas composiciones 
        // se infieren automáticamente: 
        static R2 ap(R2 f, R2 g) { 
            return a => f(g(a)); 
        static R3 ap(R2 f, R3 g) { 
            return (a, b) => f(g(a, b)); 
        static E2R ap(R2 f, E2R g) { 
            return (a, b) => f(g(a, b)); 
        static E2R3R ap(ER f, E2R3E g) { 
            return (a, b, c) => f(g(a, b, c)); 
        static R2 cu(R3 f, R b) { 
            return a => f(a, b); 
        static E2R cu(E2R3R f, R3 c) { 
            return (a, b) => f(a, b, c); 
 
 
 
        static void Main(string [] args) { 
 
 
            // En C#, un operador no es una función en el sentido de 
            // poderse pasar (directamente) como argumento: 
            R3 subtract = (x, y) => x - y; 
 
 
 
 
            // Free point! 
            var distanciaEuclidea = ap(Math.Sqrt, cu(ap(Enumerable.Sum, Enumerable.Zip), ap(cu(Math.Pow, 2), subtract))); 
 
 
 
 
            // Un ejemplo de uso: 
            var c1 = new Double [] { 1, 2, 3, 4 }; 
            var c2 = new Double [] { 4, 3, 2, 1 }; 
            Console.WriteLine("{0}", distanciaEuclidea(c1, c2)); 
 
 
 
 
 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.