Le défi:
Créez une fonction qui trouve le plus long palindrome à l'intérieur d'une chaîne.
Remarque: il s'agit d'une question à la traîne de code . S'il vous plaît ne prenez pas la question et / ou les réponses au sérieux. Plus d'informations ici .
code-trolling
Joe Z.
la source
la source
code-trolling
est mon nouveau tag préféré.Réponses:
Aller
La solution suivante dans Go utilise les pouvoirs cachés de la simultanéité, des fermetures et de la récursivité pour trouver le plus long palindrome à l'intérieur d'une chaîne donnée:
De plus, il repose entièrement sur les primitives de langage et les types intégrés (pas de bibliothèque standard), c'est ainsi que vous reconnaissez un logiciel de vraie qualité.
Vous voudrez peut-être modifier légèrement la taille de votre thread, de votre mémoire et de votre pile pour les chaînes d'entrée plus volumineuses - c'est parce que cette solution est si rapide que votre système d'exploitation deviendra jaloux.
Edit - Perks:
plus de 16000goroutines 2049186 générés pour l'entrée"345345ABCDEabcde edcbaDEABC12312123"
la source
Python
Exemple d'utilisation:
Remarque: cela peut ne fonctionner que pour certaines chaînes.
la source
De toute évidence, la vérification des Palindromes est difficile.
La solution est donc assez simple: générez un ensemble de tous les palindromes possibles aussi grands que la chaîne que vous testez et voyez si votre chaîne en contient.
C #
(J'aurais peut-être besoin de vérifier l'exactitude de mon code, mais sinon, c'est un moyen extrêmement horriblement inefficace de rechercher des Palindromes)
la source
Perl
Est-ce que tout a demandé. C'est en fait mieux, car il prend en compte toutes les sous- séquences possibles . Quel est le piège? Il fonctionne en temps exponentiel, ainsi chaque caractère supplémentaire dans la chaîne double le temps d'exécution. Donnez-lui plus de 20 caractères et cela prendra toute la journée.
Entrée:
iybutrvubiuynug
. Sortie:ibutubi
.Entrée:
abcdefghijklmnopqrstuvwxyzzyxwvutsrqponmlkjihgfedcba
. Sortie: n'arrivera pasla source
Votre problème est facilement résolu par les expressions régulières, comme dans l'image ci-dessous (mais j'ai décidé d'utiliser Java au lieu de cela). Cela se produit car regex est toujours le meilleur outil qui puisse être utilisé pour tout ce qui implique d'extraire ou d'analyser du texte.
Ce code est mauvais parce que:
la source
Python
Cela prend la chaîne et la réorganise sur le palindrome le plus long possible.
Par exemple:
Entrée: Bonjour
Ouput: lol
la source
interprétation bioinformatique
Très cool question mec!
Les palindromes en langage normal ne sont pas clairement définis, par exemple si des espaces sont autorisés ou non. Donc, il n'est pas clair si ceux-ci devraient être autorisés ou non comme palindromes:
Quoi qu'il en soit, je pense que vous vous référez à la signification scientifique plus précise du palindrome: pour qu'une séquence nucléotidique soit considérée comme un palindrome, son brin complémentaire doit lire la même chose dans la direction opposée. Les brins allant de 5 'à 3' et son brin complémentaire de 3 'à 5' doivent être complémentaires (voir ici ).
Des recherches sont en cours pour la reconnaissance de séquence palindrome et je pense que vous devriez vraiment lire au moins ceci . Pour résoudre votre problème, vous pouvez copier leur approche! Le professeur envoie même le code source si vous le lui demandez.
Eh bien, passons maintenant au problème actuel. Supposons que vous ayez une séquence de nucléotides donnée sous forme de chaîne de caractères. La meilleure façon de trouver des palindromes dans une telle séquence consiste à utiliser des algorithmes standard. Je pense que votre meilleur pari utilise probablement cet outil en ligne: http://www.alagu-molbio.net/palin.html
Étant donné que vous devez fournir une fonction qui effectue la tâche, vous devez réfléchir à la manière d'obtenir votre chaîne dans cette application? Eh bien, le plaisir commence. Je pense que vous pourriez utiliser le sélénium pour cela. Puisque je ne veux pas faire tes devoirs, je te donne juste l’idée de base. En Java, le monde commence comme ceci:
Si vous êtes intéressé par les langues palindromes, vous pouvez utiliser la même technique avec d’autres services Web tels que http://www.jimsabo.com/palindrome.html ou http://calculator.tutorvista.com/math/492/palindrome-checker. .html
techniques de contrôle de code
omettez les sources vraiment utiles telles que http://rosettacode.org/wiki/Palindrome_detection
bla intéressant mais inutile de la bioinformatique
délibérément mal comprendre cela comme tâche de bioinformatique
triche - pour résoudre le problème, un service Web est utilisé
la source
Python
La chaîne "le plus long palindrome" est extraite de la docstring dans
longest_palindrome
.La
reversed()
fonction renvoie un itérateur,reversed(substring) == substring
elle ne sera donc jamais vraie etlongest_palindrome
ne sera jamais écrasée.Par conséquent, la fonction trouvera littéralement "le plus long palindrome" dans une chaîne.
la source
Javascript
Oh, c'est facile;). Voilà
:)
la source
Ruby - La force brute (optimisée et monkeymized!)
Je trouve que le meilleur moyen de le faire est d'utiliser l'algorithme bien connu de Monkey, vous pouvez probablement le trouver dans BOOST. Ils ont toujours eu le moyen de vous faire parler ...
Ceci est extrêmement inefficace, mais plutôt mignon et semblable à un rubis si vous renommez tous leurs noms d'origine: MaxMonkeys = len; MonkeyTalk = résultat, MonkeySpeed = strlen; singeA: a; monkeyB: b; getMonkeys: getMaxPalindrome.
Cela n’a aucune valeur pour le PO et le risque de décider d’interfacer réellement avec C, et nous savons tous comment cela se termine ...
la source
Python 2.7
Je refuse d'utiliser les fonctions standard, car elles sont inefficaces. Tout le monde sait que la meilleure façon de rechercher une longueur est d'avoir une table à référencer. Je crée donc une table de tous les palindromes possibles et je les trie à l'aide d'un bogosort pythonique, mais pour améliorer l'efficacité, je supprime d'abord les doublons. . À ce stade, je calcule tous les éléments qui sont des palindromes et les trie par longueurs. Vous pouvez alors simplement prendre la dernière longueur de la liste, qui a une recherche O (n) en itérant la liste.
Code:
Remarque
Pas vraiment adapté aux chaînes de plus de 4 caractères. Est-ce que "Abba" va bien, mais je suis allé acheter du café et un déjeuner cuisiné avant qu'il ne soit abcba
Problèmes:
Nom de variable insensé (et incohérent aussi)
Choix de l'algorithme ludique (Calculez toutes les permutations possibles de chaque sous-chaîne de la chaîne donnée, vérifiez si elles sont des palindromes, triez-les par longueur et recherchez la dernière valeur)
contient en fait la solution au problème
Un algorithme de tri stupide (bogosort) et une méthode nutjob pour assurer le tri de la liste.
De plus, il y a une erreur d'indentation dans la vérification des doublons qui ne fait rien du tout, c'est juste une perte de temps.
la source
C
La recherche de palindromes est une opération difficile de PNP *, elle doit donc être effectuée avec un code hautement optimisé. Voici cinq astuces d’optimisation qui vous aideront à trouver la solution plus rapidement.
if this else that
forme. (Au fur et à mesure que vous avancez dans votre carrière, vous devriez maîtriser la prédiction de branche si vous voulez être un vrai ninja de code.) Ce code évite leif
problème de branchement en utilisantfor
plutôt des instructions qui vous donnent 3 instructions pour le prix d'un.Mais ne lésinez pas sur les noms de variables, la lisibilité est importante.
* Palindrome-Pas Palindrome
Outre les traces évidentes dans le commentaire, il existe plusieurs autres problèmes. L'algorithme de recherche est une implémentation valide de Boyer-Moore-Horspool, mais il ne stocke jamais les longueurs de chaîne, mais appelle strlen quelque chose comme N * M fois, ce qui le rend beaucoup plus lent qu'une simple recherche. "La recherche de la chaîne la plus longue en premier" est vraie, mais après cela, la recherche ne se fait pas par ordre de longueur, donc une sortie anticipée donnerait une mauvaise réponse, si elle était implémentée. Mais ce n'est pas, alors il recherche tous les N! possibilités quand même. Et presque tous les noms de paramètres (needle / haystack; src / dest) sont inversés par rapport à leurs significations standard.
la source
C'est ce que j'ai jusqu'à présent dans VB6:
Mais je ne pense pas que cela fonctionne et je pense pouvoir l'améliorer.
la source
Voici une solution Java pour vous:
la source
AutoHotkey
La fonction renvoie également des espaces car ils font partie d'une séquence palindrome d'une chaîne. Donc, ce qui précède revient
<space>abcdedcba<space>
.la source
Polyglotte
C'est à la traîne parce qu'il demande "de trouver le plus long palindrome d'une chaîne", c'est donc de trouver le plus long palindrome dans "une chaîne"
la source
Je n'ai jamais su que les cordes pourraient contenir des palindromes, pouvez-vous me montrer où vous avez appris cela? Et si vous avez besoin du plus long palindrome, visitez ce site: http://www.norvig.com/pal2txt.html
la source
Parcourez chaque caractère de la chaîne. Puis vérifiez les caractères avant et après ce caractère. Ensuite, les personnages deux avant et deux après ce personnage. Répétez jusqu'à ce que vous obteniez des personnages qui ne sont pas identiques. Cela vous permettra d'identifier la longueur de chaque palindrome dans le mot. Cependant, cette méthode ne fonctionnera que pour les palindromes de longueur impaire. Pour vérifier la présence de palindromes de longueur égale, vérifiez le caractère aux positions i et i-1, puis i + 1 et i-2, puis i + 2 et i-3, etc. J'espère que cela vous aidera!
la source
La réponse évidente est de comparer la chaîne avec son propre inverse et de calculer la séquence commune la plus longue.
Le programme Perl suivant fait justement cela. Vous devrez peut-être télécharger le module Acme :: DonMartin, il n’est généralement pas installé par défaut.
la source
Lua / Python
Lua est un langage très rapide (ce dont vous avez besoin, car il y a beaucoup de sous-chaînes à vérifier!), Mais Python est meilleur avec la gestion des chaînes. Alors pourquoi ne pas utiliser les deux?
Parce que j'ai entendu dire que c'est bien d'avoir des variables locales, j'en ai une. De plus, j'ai séparé les appels de fonction de leurs arguments, car trop d'arguments rendent les expressions encombrées et illisibles.
En outre, je pense que cela fonctionnera avec toutes les chaînes que vous voulez essayer. Il n'y aura probablement aucun problème avec des entrées étranges.
(BTW, vous ne croirez pas combien de temps cela m'a pris pour que cela fonctionne.)
la source
Python one-liner:
la source
Python - 126 Caractères
Voici mon coup à ça:
Cela fonctionne à la fois dans Python 2.x et 3.x, je crois. La variable k contient la réponse.
EDIT: J'ai oublié de dire, la variable p devrait tenir la chaîne pour vérifier les palindromes.
Ceci est une implémentation légitime, donc cela fonctionnera pour n'importe quelle chaîne.
la source
Java
Évidemment si
aString
s’agit d’un palindrome,aString
c’est le plus long palindrome de l’intérieuraString
. Vous pouvez dire que cela fonctionne par la déclaration d'assertion. Ne pensez pas trop à la première ligne de code exécutable. Ce n'est que standard standard Java.la source
Langue Game Maker
la source
Fortran
Les chaînes sont trop difficiles à travailler en Fortran, j'ai donc choisi
iachar
de les convertir en entiers:Cela ne fonctionne pas exactement. Étant donné la chaîne
aabbaac
, le plus long estaa
indiqué, mais étant donné la chaîneacasdabbbaabb
, le plus long estabbba
. Assez proche.la source
bbaabb
est plus long dans le second.Vous ne pouvez pas rivaliser sur le marché actuel en ne faisant que ce qui est demandé. Ce code trouvera également le palindrome le plus court et est insensible à la casse:
la source
Lua
la source
L'implémentation Python la plus efficace qui surpasse tous les autres efforts:
Remarques:
Cela trouvera toujours "le plus long palindrome"
C'est sensible à la casse.
Avec quelques modifications, il peut également être fait pour trouver d'autres chaînes. Cependant, vous devrez créer une classe, ajouter une méthode appropriée, puis la sous-classer pour chaque chaîne à trouver.
Cette fonction pourrait être améliorée en portant sur FORTRAN 77 ou en codant en dur dans le code machine Intel 8008.
la source
Ceci est ma première réponse à la traîne de code. Ce n'est pas un troll particulièrement brutal, cela m'est apparu comme une façon idiote de répondre à la question.
Les trolls sont:
la source
Python 3
Programme très efficace. Il recherche les palindromes longs avec le centre dans des positions séquentielles (sur char et entre) et sélectionne le plus long.
la source