En PHP es strrev()
, en Rails .reverse
, pero la mayoría de los lenguajes no tienen ninguna función inversa de cadena. Algunos tienen funciones inversas de matriz que se pueden usar en los caracteres. Estaba pensando que esto debe ser un gran descuido, pero luego se me ocurrió, ¿para qué usarías realmente la secuencia inversa?
La única vez que puedo pensar que lo he visto es en demostraciones y lecciones para convertir "Hello World!" en "! dlroW olleH".
Mi pregunta es; ¿Hay algún uso para invertir una cadena o es completamente inútil?
.
Apéndice
Hubo muchas más respuestas que había previsto y no todas fueron completamente académicas. Hubiera puesto dinero para que nadie pudiera dar un ejemplo legítimo. Tampoco pensé que aprendería algo nuevo, pero la sugerencia de expresiones regulares de Mark Canlas es genial y espero con ansias la oportunidad de que se pruebe. Gracias a todos.
fuente
a ^= b; b ^= a; a ^= b;
Respuestas:
Sexegers
A veces, los problemas que involucran expresiones regulares se pueden escribir más fácilmente invirtiendo la cadena de entrada y abordando el problema de una manera diferente.
Técnica cortesía del hombre que me enseñó Perl.
Sexeger en PerlMonks
fuente
Bueno, esta es una respuesta irónica.
"En el pasado" poseía una caja de Unix, y tenía un archivo de diccionario ordenado de palabras en inglés, utilizado para la corrección ortográfica.
Hice un nuevo archivo invirtiendo todas las palabras en el diccionario, clasificándolas y luego invirtiéndolas nuevamente. El resultado fue una lista de palabras ordenadas de derecha a izquierda.
Entonces, si buscó una palabra, al lado de esa palabra habría palabras con terminaciones similares. ¡Así que fue fácil hacer pequeños poemas!
Realmente puedes divertirte cuando ves qué rima con qué.
fuente
He sido codificador / desarrollador / administrador de sistemas durante ~ 10 años y no recuerdo haber necesitado nunca la inversión de cadenas en situaciones de la vida real.
El único caso de uso inmediato que se me ocurre es la conversión de base numérica: realizada ingenuamente, el procedimiento devuelve una cadena invertida. Sin embargo, con un poco de matemática, puede calcular por adelantado la cantidad de espacio necesario, por lo que puede comenzar a llenar el búfer desde el final.
fuente
memmove
a al inicio cuando haya terminado. Probablemente sea más barato que calcular log (n) / log (base) para calcular la cantidad de dígitos necesarios.fuente
0
an/2
y comparar el carácter en el extremo opuesto.while ( (*p == *q) && (p <= q) {p++; q--} return p > q;
en C y otros lenguajes de puntero.Entrevistas!
Invertir una cadena (en el lugar o no) es una pregunta de entrevista muy común para el conocimiento básico de programación. Sería difícil entrevistar un lenguaje que carezca de estas funciones integradas. El candidato realmente tendría que saber algo. 1
1: Esta es una respuesta irónica.
fuente
He visto situaciones en las que una aplicación de escritorio hablaba con dispositivos integrados y cambiaba constantemente la resistencia de orden de bytes, y los datos se movían como cadenas. Eso es todo para mí.
No hubiera usado cadenas para esa aplicación, pero así era .....
fuente
No es la mejor solución para ofuscar una dirección de correo electrónico, ya que cuando la agrega al portapapeles todavía se invierte. Y, si se hizo popular, pronto sería detectado por bots de raspado de correo electrónico.
Aún así, ha sido sugerido .
fuente
ASCII no es la mejor codificación para la información genética (puede empaquetar los tipos base ACGT como 2 bits). Empaquételos en una variedad de longlongs y obtendrá 32 "letras" genéticas por palabra. El ADN se puede cambiar, por lo que debe verificar un fragmento de ADN contra ambos hacia adelante son copias inversas de una secuencia de prueba. Por lo tanto, ser capaz de revertir una cadena empaquetada de cantidades de 2 bits puede ser muy útil para varios tipos de análisis genéticos.
Tuve como elemento en un punto de referencia para las agencias de espionaje, qué tan rápido puede revertir los bits durante mucho tiempo (en realidad, una gran variedad de long-longs). El método obvio de intercambio de 2 bits a la vez es mucho más lento que los métodos menos obvios. Estos están relacionados con algunos de los algoritmos limpios para la transposición de matriz en el lugar.
Tangurena: La operación a la que te refieres se llama conteo de población. Deseables similares para datos empaquetados en bits son el recuento cero inicial y final. Hay muchas cosas realmente buenas que uno puede hacer con datos empaquetados en bits. Una sola operación en una larga duración es un paralelo de datos de 64 vías, por lo que si sabe lo que está haciendo, puede obtener un rendimiento increíble para ciertos tipos de cómputos.
fuente
Cualquier cosa donde trabajar con la cadena invertida es más fácil.
Trabajar con enteros como cadenas es mucho más fácil si las cadenas se invierten. Construí algunas funciones de biblioteca para hacer matemáticas con enteros grandes y usé la inversión de cadenas para simplificar las funciones aritméticas.
Por supuesto, solo lo he usado para obtener respuestas sobre el Proyecto Euler, pero aún así, la premisa original se mantiene.
fuente
Tal vez soporte multilingüe de bajo costo, para idiomas que usan letras de derecha a izquierda (como el árabe), en lugar de izquierda a derecha. Por supuesto, debe tener cuidado con los caracteres de acento que modifican el carácter correcto ...
fuente
No sé, tal vez alguien tenga una necesidad ardiente de comprobar si hay palindrome ...
No creo que sea completamente inútil, ya que puede haber situaciones en las que uno deba poder invertir una cadena.
fuente
En el procesamiento y análisis del lenguaje natural, a veces es más fácil buscar una cadena desde el final hasta el principio. Una cadena inversa sería útil para la depuración, o como una forma alternativa de escribir el ciclo (invierta la cadena y luego repita desde el índice 0 a n-1).
Además, algunos idiomas se escriben de derecha a izquierda, por lo que se podría usar un inversor de cadena para eso si estuviera en un entorno que no reconociera de forma nativa los idiomas LTR / RTL.
Una cadena (en algunos idiomas) es un conjunto de caracteres, pero también podría ser cheques de pago o modificaciones de inventario. En un bucle que se mueve a través de estos, es posible que realice algunos cálculos que deberían ser los mismos independientemente del orden en que los procese. Una prueba de unidad perfectamente cromulenta sería verificar si los cálculos se aplican de la misma manera hacia adelante o hacia atrás. Esto puede ser trivialmente obvio para la adición, tal vez no para otras operaciones más opacas.
fuente
¿Para compiladores?
Es divertido, pero la mayoría de los símbolos en un idioma comenzarán con un patrón común. No estoy hablando de notación húngara aquí, pero si piensas en espacios de nombres / clases, muchos símbolos compartirán un prefijo común .
El problema es que, al hacer una búsqueda binaria, los prefijos comunes son lo peor con lo que puedes terminar, porque terminarás comparando esos prefijos una y otra vez.
Por otro lado, si observa las cuerdas hacia atrás, ¡verá mucha más entropía! ¡Y de repente una búsqueda binaria (sobre un Trie) se vuelve mucho más poderosa!
Siempre me molestó que los nombres destrozados de C ++ (por gcc) no se invirtieran para poner el espacio de nombres ÚLTIMO :)
fuente
Volteo los números de teléfono y ciertas cadenas de búsqueda de vez en cuando
fuente
La única vez que recuerdo haber visto la inversión de cadenas en uso fue una función que vi hace mucho tiempo que la usaba al analizar los nombres de archivo, para asegurar que el '.' se encontró en el nombre del archivo, de hecho, fue el último punto que separó el nombre del archivo de la extensión. es decir, analizando un nombre de archivo como
data.2010.12.08.dat
, invertirías la cadena, encontrarías el primer punto, restarías esa posición del final de la cadena original y tomarías la subcadena. No digo que esa sea la forma óptima de hacerlo, pero eso es lo que hizo. Puede haber sido en Powerbuilder, donde tales usos extraños de funciones eran comunes para solucionar varios problemas no obvios.fuente
La única aplicación de Worls real que vi usando Strrev fue almacenar las contraseñas de los usuarios 'ilegibles' en la base de datos ...
Pero puedo recordar que hay un patrón en C para usar el strrev, tal vez se me ocurra más tarde.
fuente