2012-06-07 28 views
5

Tengo un bot javascript chat donde una persona puede escribir en un cuadro de entrada cualquier pregunta que le guste y espero obtener una respuesta precisa. Puedo hacer esto pero sé que me estoy equivocando porque no sé en qué posición aparecerá el número en la oración. Si una persona escribe exactamente:Cadena de búsqueda para los números

cuál es la raíz cuadrada de 5 esto funciona bien.

Si escribe cosas como esta, no es así.

Cuál es la raíz cuadrada de la 5

la raíz cuadrada de 5 es lo

Cómo sabe cuál es la raíz cuadrada de 5 es

etc

necesito estar capaz de determinar dónde aparece el número en la oración y luego hacer el cálculo desde allí. Tenga en cuenta que la línea siguiente es parte de un chatbot de trabajo más grande. En la línea de abajo, estoy tratando de poder responder cualquier pregunta de raíz cuadrada, independientemente de dónde aparezca el número en la oración. También sé que hay muchas trampas con un cuadro de entrada abierto donde una persona puede escribir cualquier cosa como errores ortográficos, etc. Esto es sólo para entretenimiento, no un proyecto científico serio. :)

if(
    (word[0]=="what's") && 
    (word[1]=="the") && 
    (word[2]=="square") && 
    (word[3]=="root") && 
    (word [4]=="of") && 
    (input.search(/\d{1,10}/)!=-1) && 
    (num_of_words==6) 
){   
    var root= word[5]; 
    if(root<0){ 
     document.result.result.value = "The square root of a negative number is not possible."; 
    }else{ 
     word[5] = Math.sqrt(root); 
     word[5] = Math.round(word[5]*100)/100 
     document.result.result.value = "The square root of "+ root +" is "+ word[5] +"."; 
    } 
    return true; 
} 

Para que quede claro, el bot está escrito usando "If statemments" por algún motivo. Si la entrada en este caso no incluye las palabras "qué" y "raíz cuadrada" y "algún número", la línea no se activa y el bot la responde más abajo con un tipo genérico "No sé" de respuesta". Así que espero que cualquier respuesta se ajuste al formato que estoy usando. Sé amable, soy nuevo aquí. Me gusta hacer bots pero no soy muy programador. Gracias.

+0

Wow. Seguramente lleva tu entretenimiento a niveles altos. :) –

Respuesta

2

Puede hacerlo utilizando una expresión regular.

"What is the sqrt of 5?".match(/\d+/g); 
["5"] 

La salida es una matriz que contiene todos los números que se encuentran en la cadena. Si tiene más de uno, como "¿Es la raíz cuadrada de 100 10?" entonces será

"Is the square root of 100 10?".match(/\d+/g); 
["100", "10"] 

para que pueda elegir qué número desea utilizar en su secuencia de comandos.

+0

'" ¿El significado de la vida es 42? "' -> '6.48' –

+0

Ese código solo le dará el número, como la pregunta original. Parece que 'mister movie' ya tiene una forma de manejar la _manera_ de pregunta formulada. – sachleen

+0

Creo que este punto podría no estar claro. La "Declaración de Si" elimina toda la información innecesaria. Si la información no está presente, entonces la declaración nunca se desencadena. Entonces sé que va a haber un número en la declaración if. Esperaba algo como var root = cualquiera que sea ese número. Luego realice un cálculo simple en ese número, como sum = Math.sqrt (root); Al mirar la publicación original, sé que la palabra [5] es el número. Sin embargo, si se escribe diferente, el número puede ser palabra [3] palabra [4], etc. ¿Hay alguna forma de buscar la entrada? Encuentra dónde cae el número y la calculadora en consecuencia. –

1

Deberá usar expresiones regulares, si no sabe cuáles son debería buscarlas, ya que tomaría demasiado tiempo explicarlas en esta respuesta. Aquí hay un sitio web útil para expresiones regulares en JavaScript https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions.

Suponiendo que conozca expresiones regulares, primero debe buscar números y almacenar todos los números que encuentra, si no se encuentran números, imprima un mensaje de error. Como nota adicional, puede considerar qué buscar constantes matemáticas como pi o e. Esto debería funcionar

nums = someString./\d+|pi|e/gi 

La siguiente parte va a ser duro, pero que reducirlo a es concepto de la base, es necesario buscar palabras clave como 'raíz cuadrada', 'tiempos', o 'más' . Deberías hacer esto palabra por palabra yendo de izquierda a derecha.Por ejemplo, si un usuario introduce

What is 5 plus 3 minus 8? 

debe detectar el signo más antes de que el negativo, mientras que si se introduce este

What is 5 minus 3 plus 8? 

Debe detectar el signo menos antes de la ventaja.

Para las operaciones que usan dos números, necesita tomar los dos primeros números que encontró y realizar la operación y reemplazar los dos números con el resultado. Intento utilizar la notación polaca inversa si no entiendes lo que intento hacer, la busco si no sé qué es.

Espero que haya entendido bien su pregunta y haya proporcionado alguna ayuda para llegar a una solución, porque lo que ha preguntado es muy difícil, pero parece divertido. Buena suerte. También como advertencia, no estoy considerando el orden de las operaciones en mi respuesta.

+0

[Considere evitar w3schools.] (Http://w3fools.com) – Pointy

+0

@Pointy Gracias, no me di cuenta de que w3schools podría ser dañino, lo cambié a un sitio MDN como lo sugiere w3fools. –

Cuestiones relacionadas