Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Comparar Strings

Amigos estou tentando comparar duas strings. Uma já no código com uma inserida pelo usuário.

var v1 = "x^2+2x+1";
var v2 = document.getElementById('eq').value;
// o id #eq é um input="text"
if(v1 == v2) {
    $("#resultado").text("Acertou");
} else  {
    $("#resultado").text("Errou");
}

Minhas dúvidas são:

1) Se o usuário digitar com espaços o resultado apresentado é false (Errou). 2) Se o usuário digitar em qualquer ordem dá false também. por exemplo, gostaria de validar se fosse digitado 2x+1+x^2 e qualquer combinação disso.

Como resolver isso? grato.

10 respostas

Você pode fazer um split das strings, transformando em array e verificando se eles possuem os mesmos caracteres.

Ou seja, cada string é um array

Assim a ordem não importará.

Mas se eu fizer um Split eu não irei "repartir" em partes? e depois como irei comparar? pode me mostrar um código? grato

É bem simples, segue o código.

var string1 = "teste";
var string2 = "stete";

// separando
var array1 = string1.split("");
var array2 = string2.split("");

// colocando em ordem os caracteres e remontando as strings
array1 = array1.sort().join('');
array2 = array2.sort().join('');

// verificando se sao iguais
console.log( array1 == array2 );

Izaias, exatamente o que o Adriano falou no primeiro post dele. Vamos considerar só os casos em que o usuário use somente sinais de +. Um exemplo de como isso ficaria é assim:

var v1 = "x^2+2x+1";
var v2 = document.getElementById('eq').value.replace(/ /g, ""); // removendo os espaços
var v1Elementos = v1.split("+");
var v2Elementos = v2.split("+");
var acertou = true;
if (v1Elementos.length != v2Elementos.length) {
    // se não tem o mesmo número de elementos, já errou
    acertou = false;
} else {
    for (i = 0; i < v2Elementos.length; i++) {
        // pra cada elemento em v2
        var elemento = v2Elementos[i];
        if (v1Elementos.indexOf(elemento) == -1) {
            // se o elemento não existe em v1, não acertou
            acertou = false;
        }
    }
}
if(acertou) {
    $("#resultado").text("Acertou");
} else  {
    $("#resultado").text("Errou");
}

o código que te mandei, retornará true.

pois é a mesma string com os caracteres embaralhados

Porém, está aberta a erros: as strings x^2+2x+1 e x^1+2x+2 serão comparadas como acerto também!

Sim, isso depende do objetivo.

Eu entendi que não haviam regras, apenas se as strings contém exatamente os mesmos caracteres, já que na pergunta era qualquer combinação disso.

Agora se o uso possui regras, como manter a estrutura de uma equação, a forma de escrever o código é diferente, mas a ideia de arrays é a mesma, você só precisa colocar as regras com o agrupamento desejado.

A idéia de utilizar o sort é bem legal =) e poderia simplificar o código:

var v1Ordenada = v1.split("+").sort().join("+");
var v2Ordenada = v2.split("+").sort().join("+");

var acertou = (v1Ordenada == v2Ordenada);
if (acertou) {
// ...

Deixei a variável acertou pra deixar claro o trecho alterado, mas poderia ser removida.

Então acho que me expressei errado. A string digitada pelo usuário mesmo sendo em ordem trocada tem que fazer o mesmo sentido que a equação inicial. x^2+2x + 1, deve conter a potência 2 no x e ser todos somando! O que eu estou fazendo é um programa que compara a equação já existente com a que o usuário poderá digitar e se o usuário digitar fora de ordem, porém com os mesmos elementos da equação isso retorna true.

solução!

Bom, quanto mais complexo o problema, menos podemos ajudar pois mais fechadas são as especificações, mas acho que as idéias que a gente passou aqui já começam a te ajudar, certo?

Para resolver 100% seu problema você provavelmente terá que utilizar expressões regulares em conjunto com percorrer arrays e etc.

Pra começar, posso te ajudar com isso aqui:

var v1 = "x^2+2x-1";
// var v2 = document.getElementById('eq').value;
// sobrescrevendo pra exemplificar: 
var v2 = "2X-1+X^2";
// var v2 = "-2x+x^2-1"; // esse tem que dar false
v1 = v1.toLowerCase()
    .replace(/ /g, "") //remove espaços
    .replace(/([+-])/g, "@$1") // troca + por @+ e - por @-
        // @ vai servir só pra dar split. pode ser trocado por outra coisa
    .replace(/^([^+-])/g, "+$1"); // adiciona um + no começo se não começar com nenhum sinal
console.log(v1);
// repete pro v2
v2 = v2.toLowerCase()
    .replace(/ /g, "")
    .replace(/([+-])/g, "@$1")
    .replace(/^([^+-])/g, "+$1");
console.log(v2);
v1 = v1.split("@").sort().join("");
v2 = v2.split("@").sort().join("");
console.log(v1 == v2);