Die Herausforderung:
Erstellen Sie eine Funktion, die das längste Palindrom in einer Zeichenfolge findet.
Hinweis: Dies ist eine Code-Trolling- Frage. Bitte nehmen Sie die Frage und / oder die Antworten nicht ernst. Mehr Infos hier .
code-trolling
Joe Z.
quelle
quelle
code-trolling
ist mein neuer Lieblingstag.Antworten:
Gehen
Die folgende Lösung in Go nutzt die verborgenen Kräfte von Parallelität, Closures und Rekursivität, um das längste Palindrom in einer bestimmten Zeichenfolge zu finden:
Darüber hinaus stützt es sich ausschließlich auf Sprachprimitive und integrierte Typen - keine Standardbibliothek - so erkennen Sie echte Qualitätssoftware.
Möglicherweise möchten Sie Ihre Thread-, Speicher- und Stack-Größenbeschränkungen für größere Eingabezeichenfolgen ein wenig erhöhen. Dies liegt daran, dass diese Lösung so schnell ist, dass Ihr Betriebssystem darauf eifersüchtig wird.
Bearbeiten - Vergünstigungen:
über 160002049186 Goroutinen, die für die Eingabe erzeugt wurden, wegen Speichermangel getötet"345345ABCDEabcde edcbaDEABC12312123"
quelle
Python
Anwendungsbeispiel:
Hinweis: Dies funktioniert möglicherweise nur für bestimmte Zeichenfolgen.
quelle
Es ist offensichtlich schwierig, nach Palindromen zu suchen.
Die Lösung ist also ziemlich einfach: Erstellen Sie einen Satz von jedem möglichen Palindrome, der so groß ist wie die Zeichenfolge, die Sie testen, und prüfen Sie, ob Ihre Zeichenfolge diese enthält.
C #
(Möglicherweise muss ich meinen Code auf Korrektheit prüfen, aber ansonsten ist es eine wunderbar schrecklich ineffiziente Methode, nach Palindromen zu suchen.)
quelle
Perl
Hat alles nachgefragt. Es ist eigentlich besser, weil es jede mögliche Folge berücksichtigt . Was ist der Haken? Es arbeitet in exponentieller Zeit, so dass jedes zusätzliche Zeichen in der Zeichenfolge die Laufzeit verdoppelt. Gib es mehr als 20 Zeichen, und es wird den ganzen Tag dauern.
Input:
iybutrvubiuynug
. Ausgabe:ibutubi
.Input:
abcdefghijklmnopqrstuvwxyzzyxwvutsrqponmlkjihgfedcba
. Ausgabe: wird nicht passierenquelle
Ihr Problem wird einfach durch reguläre Ausdrücke gelöst, genau wie in der Abbildung unten (aber ich habe mich stattdessen für Java entschieden). Dies liegt daran, dass Regex immer das beste Tool ist, das für alle Aufgaben verwendet werden kann, bei denen Text extrahiert oder analysiert wird.
Dieser Code ist böse, weil:
quelle
Python
Dadurch wird die Zeichenfolge auf das längste verfügbare Palindrom umstrukturiert.
Beispielsweise:
Eingabe: Hallo
Ausgang: lol
quelle
Bioinformatik Interpretation
Sehr cooler Frage-Typ!
Palindrome in normaler Sprache sind nicht eindeutig spezifiziert, zum Beispiel ob Leerzeichen erlaubt sind oder nicht. Es ist also nicht klar, ob diese als Palindrome zugelassen werden sollen oder nicht:
Wie auch immer, ich denke, Sie beziehen sich auf die besser spezifizierte wissenschaftliche Bedeutung von Palindrom: Damit eine Nukleotidsequenz als Palindrom betrachtet werden kann, muss ihr komplementärer Strang dasselbe in entgegengesetzter Richtung lesen. Sowohl die Stränge, dh der Strang von 5 'nach 3' als auch sein komplementärer Strang von 3 'nach 5' müssen komplementär sein (siehe hier ).
Es gibt einige Forschungsarbeiten zur Erkennung von Palindromsequenzen, und ich denke, Sie sollten dies zumindest wirklich lesen . Um Ihr Problem zu lösen, können Sie den Ansatz so ziemlich einfach kopieren! Der Professor sendet sogar den Quellcode, wenn Sie ihn fragen.
Nun zum eigentlichen Problem. Angenommen, Sie haben eine Nukleotidsequenz als Zeichenfolge angegeben. Der beste Weg, Palindrome in einer solchen Sequenz zu finden, ist die Verwendung von Standardalgorithmen. Ich denke, Ihre beste Wette ist wahrscheinlich die Verwendung dieses Online-Tools: http://www.alagu-molbio.net/palin.html
Da Sie eine Funktion bereitstellen müssen, die die Aufgabe übernimmt, müssen Sie sich überlegen, wie Sie Ihren String in diese App integrieren können. Nun, da fängt der Spaß an. Ich denke, Sie könnten Selen dafür verwenden. Da ich Ihre Hausaufgaben nicht machen möchte, gebe ich Ihnen nur die Grundidee. In Java beginnt Ihre Welt so:
Wenn Sie an Sprachpalindromen interessiert sind, können Sie dieselbe Technik mit anderen Webdiensten wie http://www.jimsabo.com/palindrome.html oder http://calculator.tutorvista.com/math/492/palindrome-checker verwenden .html
Code-Trolling-Technik
Lassen Sie die wirklich hilfreichen Quellen wie http://rosettacode.org/wiki/Palindrome_detection weg
Interessant, aber wenig hilfreich in Sachen Bioinformatik
absichtlich missverstehen dies als bioinformatische Aufgabe
Schummeln - um das Problem zu lösen, wird ein Webdienst verwendet
quelle
Python
Die Zeichenfolge "das längste Palindrom" wird aus der Dokumentzeichenfolge in extrahiert
longest_palindrome
.Die
reversed()
Funktion gibt einen Iterator zurück, ist alsoreversed(substring) == substring
niemals wahr undlongest_palindrome
wird niemals überschrieben.Daher findet die Funktion buchstäblich "das längste Palindrom" in einer Zeichenfolge.
quelle
Javascript
Oh, das ist einfach;). Hier gehts:
:)
quelle
Ruby - Die (optimierte und monkeymisierte!) Brute Force
Ich finde, der beste Weg, dies zu tun, ist der bekannte Monkey-Algorithmus, den Sie wahrscheinlich in BOOST finden können. Sie hatten immer Möglichkeiten, Sie zum Reden zu bringen ...
Dies ist äußerst ineffizient, aber ziemlich niedlich und rubinrot, wenn Sie alles in den ursprünglichen Namen umbenennen: MaxMonkeys = len; MonkeyTalk = result, MonkeySpeed = strlen; monkeyA: a; Affe B: b; getMonkeys: getMaxPalindrome.
Dies hat für das OP keinen Wert und birgt die Gefahr, dass er sich entscheidet, tatsächlich mit C zu kommunizieren, und wir alle wissen, wie das endet ...
quelle
Python 2.7
Ich lehne es ab, die Standardfunktionen zu verwenden, da sie ineffizient sind. Jeder weiß, dass der beste Weg, eine Länge nachzuschlagen, darin besteht, eine Tabelle als Referenz zu haben. Daher erstelle ich eine Tabelle mit allen möglichen Palindromen und sortiere sie mit einem pythonischen Bogosort. Um die Effizienz zu verbessern, entferne ich zuerst Duplikate . Zu diesem Zeitpunkt berechne ich alle Elemente, die Palindrome sind, und sortiere sie nach Längen. Sie können dann einfach die letzte Länge in der Liste nehmen, die eine O (n) -Nachschlag enthält, indem Sie die Liste iterieren.
Code:
Hinweis
Nicht wirklich geeignet für Zeichenfolgen, die länger als 4 Zeichen sind. Ist "abba" in Ordnung, aber ich ging Kaffee kaufen und kochte das Mittagessen, bevor es abcba tat
Probleme:
Wahnsinnige Variablennamen (und auch inkonsistent)
Lächerliche Algorithmusauswahl (Berechne alle möglichen Permutationen für jeden Teilstring der angegebenen Zeichenfolge, überprüfe, ob es sich um Palindrome handelt, sortiere sie nach Länge und suche den letzten Wert)
Enthält tatsächlich die Lösung des Problems
Blöder Sortieralgorithmus (Bogosort) und eine Nutjob-Methode, um sicherzustellen, dass die Liste sortiert ist.
Außerdem gibt es einen Einrückungsfehler bei der Duplikatprüfung, der eigentlich gar nichts bewirkt. Es ist nur Zeitverschwendung.
quelle
C
Das Auffinden von Palindromen ist eine schwierige PNP * -Operation, daher muss sie mit hochoptimiertem Code durchgeführt werden. Hier sind fünf Optimierungstricks, mit denen Sie die Lösung schneller finden.
if this else that
Form schrecklich langsam . (Im weiteren Verlauf Ihrer Karriere sollten Sie dieif
Verzweigungsvorhersage beherrschen, wenn Sie ein echter Code-Ninja sein möchten.) Mit diesem Code wird das Verzweigungsproblem vermiedenfor
Anweisungen verwenden, die Ihnen 3 Anweisungen zum Preis von einer geben.Aber nicht an Variablennamen sparen, Lesbarkeit ist wichtig.
* Palindrom-Nicht Palindrom
Neben dem offensichtlichen Trolling im Kommentar gibt es noch einige andere Probleme. Der Suchalgorithmus ist eine gültige Implementierung von Boyer-Moore-Horspool, speichert jedoch niemals die Stringlängen, sondern ruft stattdessen so etwas wie N * M-mal auf, was ihn viel langsamer als eine einfache Suche macht. "Zuerst nach der längsten Zeichenfolge suchen" ist wahr, danach wird jedoch nicht nach der Längenreihenfolge gesucht, sodass ein vorzeitiges Beenden eine falsche Antwort ergibt, wenn es implementiert wurde. Ist es aber nicht, so sucht es das ganze N! Möglichkeiten sowieso. Und fast alle Parameternamen (Nadel / Heuhaufen; src / dest) sind von ihrer Standardbedeutung umgekehrt.
quelle
Folgendes habe ich bisher in VB6:
Aber ich denke nicht, dass es funktioniert, und ich denke, ich kann es besser machen.
quelle
Hier ist eine Java-Lösung für Sie:
quelle
AutoHotkey
Die Funktion gibt auch Leerzeichen zurück, da sie Teil einer Palindromsequenz in einer Zeichenfolge sind. Das oben Gesagte kehrt also zurück
<space>abcdedcba<space>
.quelle
Polyglot
Dies ist Trolling, weil es darum bittet, "das längste Palindrom in einer Zeichenfolge zu finden", also das längste Palindrom in "einer Zeichenfolge" zu finden.
quelle
Ich hätte nie gedacht, dass Saiten Palindrome enthalten könnten. Können Sie mir zeigen, wo Sie das gelernt haben? Wenn Sie das längste Palindrom benötigen, besuchen Sie bitte diese Website: http://www.norvig.com/pal2txt.html
quelle
Durchlaufen Sie jedes Zeichen der Zeichenfolge. Überprüfen Sie dann die Zeichen vor und nach diesem Zeichen. Dann die Zeichen zwei vor und zwei nach diesem Zeichen. Wiederholen Sie dies, bis Sie zu Zeichen kommen, die nicht gleich sind. Auf diese Weise können Sie die Länge jedes Palindroms im Wort identifizieren. Diese Methode funktioniert jedoch nur für Palindrome ungerader Länge. Um nach Palindromen gleicher Länge zu suchen, überprüfen Sie die Zeichen an Position i und i-1, dann i + 1 und i-2, dann i + 2 und i-3 usw. Ich hoffe, dies hilft !!
quelle
Die naheliegende Antwort besteht darin, die Zeichenfolge mit ihrer eigenen Inversen zu vergleichen und die längste gemeinsame Sequenz zu berechnen.
Das folgende Perl-Programm macht genau das. Möglicherweise müssen Sie das Acme :: DonMartin-Modul herunterladen. Es wird normalerweise nicht standardmäßig installiert.
quelle
Lua / Python
Lua ist eine sehr schnelle Sprache (die Sie brauchen, weil es viele zu überprüfende Teilzeichenfolgen gibt!), Aber Python ist besser im Umgang mit Zeichenfolgen. Warum also nicht beide verwenden?
Weil ich gehört habe, dass es gut ist, lokale Variablen zu haben, habe ich eine. Außerdem habe ich die Funktionsaufrufe von ihren Argumenten getrennt, da zu viele Argumente Ausdrücke unübersichtlich und unleserlich machen.
Ich denke auch, dass dies mit allen Zeichenfolgen funktioniert, die Sie ausprobieren möchten. Es wird wahrscheinlich keine Probleme mit seltsamen Eingaben geben.
(Übrigens, Sie werden nicht glauben, wie lange ich dafür gebraucht habe.)
quelle
Python Einzeiler:
quelle
Python - 126 Zeichen
Hier ist mein Ansatz:
Dies funktioniert, glaube ich, sowohl in Python 2.x als auch in Python 3.x. Die Variable k enthält die Antwort.
EDIT: Ich habe vergessen zu sagen, die Variable p sollte die Zeichenkette enthalten, um nach Palindromen zu suchen.
Dies ist eine legitime Implementierung, daher funktioniert sie für jede Zeichenfolge.
quelle
Java
Wenn
aString
es sich um ein Palindrom handelt,aString
ist es offensichtlich das längste Palindrom im InnerenaString
. An der Aussage kann man erkennen, dass es funktioniert. Denken Sie nicht zu viel über die erste Zeile des ausführbaren Codes nach. Das ist nur Standard Java Boilerplate.quelle
Game Maker-Sprache
quelle
Fortran
Saiten sind in Fortran zu schwierig, deshalb habe ich mich für die Verwendung entschieden
iachar
, sie alle in Ganzzahlen umzuwandeln:Es funktioniert nicht genau. Angenommen, die Zeichenfolge
aabbaac
sagt, dass die längste istaa
, aber angenommen, die Zeichenfolgeacasdabbbaabb
sagt, dass die längste istabbba
. Nahe genug.quelle
bbaabb
ist länger in der zweiten.Sie können auf dem heutigen Markt nicht mit dem konkurrieren, was gefragt ist. Dieser Code findet auch das kürzeste Palindrom und unterscheidet nicht zwischen Groß- und Kleinschreibung:
quelle
Lua
quelle
Effizienteste Python-Implementierung, die alle anderen Bemühungen übertrifft:
Anmerkungen:
Dies wird immer "das längste Palindrom" finden
Es wird zwischen Groß- und Kleinschreibung unterschieden.
Mit einigen Modifikationen können auch andere Zeichenfolgen gesucht werden. Sie müssen jedoch eine Klasse erstellen, eine geeignete Methode hinzufügen und diese dann für jede zu findende Zeichenfolge in Unterklassen unterteilen.
Diese Funktion könnte durch Portierung auf FORTRAN 77 oder Festcodierung in Intel 8008-Maschinencode verbessert werden.
quelle
Dies ist meine erste Antwort auf Code-Trolling. Es ist kein besonders brutaler Troll, es kam mir nur albern vor, die Frage zu beantworten
Trolle sind:
quelle
Python 3
Sehr effizientes Programm. Es sucht nach langen Palindromen mit dem Zentrum in aufeinanderfolgenden Positionen (auf dem Zeichen und dazwischen) und wählt das längste aus
quelle