El reto:
Realice una función que encuentre el palíndromo más largo dentro de una cadena.
Nota: Esta es una pregunta de arrastre de código . No tome en serio la pregunta y / o las respuestas. Más información aquí .
code-trolling
Joe Z.
fuente
fuente
code-trolling
es mi nueva etiqueta favorita.Respuestas:
Ir
La siguiente solución en Go emplea los poderes ocultos de concurrencia, cierre y recursividad para encontrar el palíndromo más largo dentro de una cadena dada:
Además, se basa completamente en primitivas de lenguaje y tipos incorporados, sin biblioteca estándar, así es como se reconoce el software de verdadera calidad.
Es posible que desee aumentar un poco sus límites de hilo, memoria y pila para cadenas de entrada más grandes; esto se debe a que esta solución es tan rápida que su sistema operativo se pondrá celoso.
Editar - Beneficios:
más de 160002049186 goroutines generadas para la entrada"345345ABCDEabcde edcbaDEABC12312123"
fuente
Pitón
Ejemplo de uso:
Nota: esto solo puede funcionar para ciertas cadenas.
fuente
Claramente, verificar Palindromes es difícil.
Entonces, la solución es bastante simple: genere un conjunto de cada Palindrome posible tan grande como la cadena que está probando, y vea si su cadena lo contiene.
DO#
(Es posible que deba verificar la corrección de mi código, pero de lo contrario es una forma maravillosamente horrible e ineficiente de buscar Palindromes)
fuente
Perl
¿Todo lo pedido? En realidad es mejor, porque tiene en cuenta todas las subsecuencias posibles . ¿Cuál es el truco? Funciona en tiempo exponencial, por lo que cada carácter adicional en la cadena duplica el tiempo de ejecución. Dale más de 20 caracteres, y te llevará todo el día.
Entrada:
iybutrvubiuynug
. Salida:ibutubi
.Entrada:
abcdefghijklmnopqrstuvwxyzzyxwvutsrqponmlkjihgfedcba
. Salida: no sucederáfuente
Su problema se resuelve fácilmente con expresiones regulares, al igual que en la imagen a continuación (pero decidí usar java en su lugar). Esto sucede porque regex es siempre la mejor herramienta que se puede usar para cualquier cosa que implique extraer o analizar texto.
Este código es malo porque:
fuente
Pitón
Esto toma la cadena y la reorganiza en el palíndromo más largo posible disponible.
Por ejemplo:
Entrada: hola
Ouput: lol
fuente
interpretación bioinformática
Muy buena pregunta amigo!
Los palíndromos en lenguaje normal no se especifican del todo con claridad, por ejemplo, si se permiten espacios o no. Por lo tanto, no está claro si deberían permitirse como palíndromos o no:
De todos modos, creo que te estás refiriendo al significado científico mejor especificado del palíndromo: para que una secuencia de nucleótidos se considere palíndromo, su cadena complementaria debe leer lo mismo en la dirección opuesta. Tanto las cadenas como la cadena que va de 5 'a 3' y su cadena complementaria de 3 'a 5' deben ser complementarias (ver aquí ).
Se han realizado algunas investigaciones para el reconocimiento de secuencia de palíndromo y creo que realmente debería leer al menos esto . Para resolver su problema, ¡puede simplemente copiar su enfoque! El profesor incluso envía el código fuente si le preguntas.
Bueno, ahora al problema en cuestión. Suponga que tiene una secuencia de nucleótidos dada como una cadena de caracteres. La mejor manera de encontrar palíndromos en tal secuencia es mediante el uso de algoritmos estándar. Creo que su mejor opción es usar esta herramienta en línea: http://www.alagu-molbio.net/palin.html
Dado que debe proporcionar una función que realice la tarea, debe pensar en cómo introducir su cadena en esta aplicación. Bueno, ahí comienza la diversión. Creo que podrías usar selenio para eso. Como no quiero hacer tu tarea, solo te doy la idea básica. En Java tu mundo comienza así:
En caso de que esté interesado en los palíndromos del lenguaje, puede usar la misma técnica con otros servicios web como http://www.jimsabo.com/palindrome.html o http://calculator.tutorvista.com/math/492/palindrome-checker .html
técnicas de arrastre de código
omita las fuentes verdaderamente útiles como http://rosettacode.org/wiki/Palindrome_detection
bla interesante pero poco útil sobre bioinformática
malinterpretando deliberadamente esto como tarea bioinformática
trampa - para resolver el problema se utiliza un servicio web
fuente
Pitón
La cadena "el palíndromo más largo" se extrae de la cadena de documentos
longest_palindrome
.La
reversed()
función devuelve un iterador, porreversed(substring) == substring
lo que nunca será verdadero ylongest_palindrome
nunca se sobrescribirá.Por lo tanto, la función literalmente encontrará "el palíndromo más largo" dentro de una cadena.
fuente
Javascript
Oh, eso es fácil;). Aqui tienes:
:)
fuente
Ruby - The (Optimized and Monkeymized!) Brute Force
Creo que la mejor manera de hacerlo es a través del conocido Algoritmo de mono, probablemente lo pueda encontrar en BOOST. Siempre tuvieron formas de hacerte hablar ...
Esto es extremadamente ineficiente, pero bastante lindo y parecido al rubí si cambia el nombre de todo a sus nombres originales: MaxMonkeys = len; MonkeyTalk = resultado, MonkeySpeed = strlen; monoA: a; monoB: b; getMonkeys: getMaxPalindrome.
Esto no tiene ningún valor para el OP y corre el riesgo de que decida interactuar realmente con C, y todos sabemos cómo termina eso ...
fuente
Python 2.7
Me niego a usar las funciones estándar, ya que son ineficientes. Todo el mundo sabe que la mejor manera de buscar una longitud es tener una tabla de referencia, por lo que creo una tabla de todos los palíndromos posibles y los clasifico usando un bogosort pitónico, pero para mejorar la eficiencia, elimino los duplicados primero . En ese momento, calculo todos los elementos que son palíndromos y los clasifico por longitudes. Luego puede simplemente tomar la última longitud de la lista, que tiene una búsqueda O (n) iterando la lista.
Código:
Nota
No es realmente adecuado para cadenas de más de 4 caracteres. "Abba" bien, pero fui y compré café y preparé el almuerzo antes de que abcba
Cuestiones:
Nombramiento de variables insano (y también inconsistente)
Elección de algoritmo absurdo (Calcule todas las permutaciones posibles de cada subcadena de la cadena dada, verifique si son palíndromos, ordénelas por longitud y busque el último valor)
En realidad contiene la solución al problema
Estúpido algoritmo de clasificación (bogosort) y un método loco para asegurar que la lista esté ordenada.
Además, hay un error de sangría en la comprobación duplicada que en realidad no hace nada, es solo una pérdida de tiempo.
fuente
do
Encontrar palindromes es una operación difícil de PNP *, por lo que debe hacerse con un código altamente optimizado. Aquí hay cinco trucos de optimización que ayudarán a encontrar la solución más rápido.
if this else that
forma. (A medida que avance en su carrera, debe dominar la predicción de sucursal si desea ser un verdadero ninja de código). Este código evita elif
problema de ramificación mediante el uso defor
declaraciones, que le da 3 instrucciones por el precio de una.Pero no escatime en nombres de variables, la legibilidad es importante.
* Palindrome-No Palindrome
Además de la observación curiosa en el comentario, hay varios otros problemas. El algoritmo de búsqueda es una implementación válida de Boyer-Moore-Horspool, pero nunca almacena las longitudes de cadena, sino que llama a strlen algo así como N * M veces, lo que lo hace mucho más lento que una simple búsqueda. "Buscar primero la cadena más larga" es cierto, pero después de eso no busca por orden de longitud, por lo que una salida temprana daría una respuesta incorrecta, si se implementara. Pero no lo es, así que busca toda la N! posibilidades de todos modos. Y casi todos los nombres de parámetros (aguja / pajar; src / dest) se invierten de sus significados estándar.
fuente
Esto es lo que tengo hasta ahora en VB6:
Pero no creo que funcione, y creo que puedo mejorarlo.
fuente
Aquí hay una solución Java para usted:
fuente
AutoHotkey
La función también devuelve espacios, ya que son parte de una secuencia de palíndromo en cadena. Entonces lo anterior vuelve
<space>abcdedcba<space>
.fuente
Polígloto
Esto es curricán porque pide "encontrar el palíndromo más largo en una cuerda", por lo que está encontrando el palíndromo más largo en "una cuerda"
fuente
Nunca supe que las cuerdas podían contener palíndromos, ¿puedes mostrarme dónde aprendiste esto? Y si necesita el palíndromo más largo, visite este sitio: http://www.norvig.com/pal2txt.html
fuente
Iterar a través de cada carácter de la cadena. Luego verifique los caracteres antes y después de ese carácter. Luego los personajes dos antes y dos después de ese personaje. Sigue repitiendo hasta llegar a personajes que no son iguales. Esto le permitirá identificar la longitud de cada palíndromo en la palabra. Sin embargo, este método solo funcionará para palíndromos de longitud impar. Para verificar palíndromos de longitud uniforme, verifique el carácter en la posición i e i-1, luego i + 1 e i-2, luego i + 2 e i-3, etc. ¡Espero que esto ayude!
fuente
La respuesta obvia es comparar la cadena con su propio inverso y calcular la secuencia común más larga.
El siguiente programa Perl hace exactamente eso. Es posible que deba descargar el módulo Acme :: DonMartin, por lo general no se instala de manera predeterminada.
fuente
Lua / Python
Lua es un lenguaje muy rápido (¡lo que necesita, porque hay muchas subcadenas para verificar!), Pero Python es mejor con el manejo de cadenas. Entonces, ¿por qué no usar ambos?
Como he oído que es bueno tener variables locales, tengo una. Además, he separado las llamadas a funciones de sus argumentos, porque demasiados argumentos hacen que las expresiones estén desordenadas e ilegibles.
Además, creo que esto funcionará con cualquier cadena que desee probar, probablemente no habrá ningún problema con entradas extrañas de ningún tipo.
(Por cierto, no vas a creer cuánto tiempo me llevó hacer que funcione).
fuente
Python one-liner:
fuente
Python - 126 caracteres
Aquí está mi intento en esto:
Esto funciona en Python 2.xy 3.x, creo. La variable k contiene la respuesta.
EDITAR: Olvidé decir que la variable p debería contener la cadena para verificar si hay palíndromos.
Esta es una implementación legítima, por lo que funcionará para cualquier cadena.
fuente
Java
Obviamente, si
aString
es en sí mismo un palíndromo, entoncesaString
es el palíndromo más largo en su interioraString
. Se puede decir que funciona mediante la declaración de aserción. No pienses demasiado en la primera línea de código ejecutable. Eso es solo repetitivo estándar de Java.fuente
Game Maker Language
fuente
Fortran
Las cadenas son demasiado difíciles de trabajar en Fortran, así que opté por usarlas
iachar
para convertirlas a números enteros:No funciona exactamente. Dada la cadena
aabbaac
, dice que la más larga esaa
, pero dada la cadenaacasdabbbaabb
, dice que la más larga esabbba
. Suficientemente cerca.fuente
bbaabb
es más largo en el segundo.No puede competir en el mercado actual simplemente haciendo lo que se le pide. Este código también encontrará el palíndromo más corto y no distingue entre mayúsculas y minúsculas:
fuente
Lua
fuente
La implementación de Python más eficiente que supera todos los demás esfuerzos:
Notas:
Esto siempre encontrará "el palíndromo más largo"
Es sensible a mayúsculas y minúsculas.
Con algunas modificaciones también se puede hacer para encontrar otras cadenas. Sin embargo, deberá crear una clase, agregar un método apropiado y luego subclasificarlo para cada cadena que se encuentre.
Esta función podría mejorarse transfiriendo a FORTRAN 77 o codificando al código de máquina Intel 8008.
fuente
Esta es mi primera respuesta de trolling de código. No es un troll particularmente brutal, simplemente me pareció una forma tonta de responder la pregunta.
Los trolls son:
fuente
Python 3
Programa muy eficiente. Busca palíndromos largos con centro en posiciones secuenciales (en caracteres y entre ellos) y selecciona el más largo
fuente