Problema
A similaridade de cosseno compara a direção de dois vetores e ignora o tamanho deles. A busca semântica a usa para encontrar textos com embeddings parecidos:
cos(a, b) = (a · b) / (|a| × |b|), onde |a| = √(a₁² + a₂² + … + aₙ²)
O resultado é 1 para a mesma direção, 0 para vetores perpendiculares e -1 para direções opostas. Se algum dos vetores for todo de zeros, retorne 0.
Implemente cosine_similarity(a, b).
Entrada
a, b: Duas listas de números com o mesmo tamanho.
Saída
Retorne a similaridade de cosseno como número decimal.
Restrições
1 ≤ tamanho ≤ 1.000
-1.000 ≤ cada valor ≤ 1.000
Exemplos
Entrada:
a = [1.0, 0.0]
b = [0.0, 1.0]
Saída esperada:
expected = 0.0
Entrada:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};
Saída esperada:
double expected = 0.0;
Entrada:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};
Saída esperada:
double expected = 0.0;
Explicação
O produto escalar é 0, então os vetores são perpendiculares e a similaridade é 0.
Entrada:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]
Saída esperada:
expected = 1.0
Entrada:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};
Saída esperada:
double expected = 1.0;
Entrada:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};
Saída esperada:
double expected = 1.0;
Explicação
b é a vezes 2: mesma direção, então a similaridade é 1 mesmo com tamanhos diferentes.
Referências
Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.