Problem
Angenommen, ein Wort ist fast ein Palindrom, wenn es möglich ist, einen seiner Buchstaben zu entfernen, sodass das Wort zu einem Palindrom wird. Ihre Aufgabe ist es, ein Programm zu schreiben, das für ein bestimmtes Wort bestimmt, welchen Buchstaben Sie entfernen müssen, um ein Palindrom zu erhalten.
Der kürzeste Code, um dies in einer Programmiersprache zu tun, gewinnt.
Eingang
Die Eingabe besteht aus einem Wort mit Großbuchstaben von 2 bis 1000 Zeichen.
Ausgabe
Geben Sie die 1-indizierte Position (der Buchstabe ganz links hat Position 1, der nächste hat Position 2 usw.) des Buchstabens aus, der entfernt werden soll. Wenn es Auswahlmöglichkeiten gibt, die zum Palindrom führen, geben Sie eine dieser Positionen aus. Beachten Sie, dass Sie einen Buchstaben entfernen müssen, auch wenn das angegebene Wort bereits ein Palindrom ist. Wenn das angegebene Wort nicht fast ein Palindrom ist, wird -1 ausgegeben.
Beispiel
Die Eingabe:
racercar
könnte die Ausgabe erzeugen:
5
weil das Entfernen des 5
th Buchstabens erzeugt racecar
, was ein Palindrom ist.
Auch die Eingabe
racecar
kann noch die Ausgabe produzieren
4
denn das Entfernen des 4
zu produzierenden Buchstabens raccar
ist immer noch ein Palindrom.
Antworten:
J -
3125 charIm Großen und Ganzen Standardtarif für J, daher werde ich nur auf die coolen Details hinweisen.
Das Adverb
\.
heißt Outfix .x u\. y
Entfernt jedes Längen-Infixx
vony
und giltu
für das Ergebnis jeder Entfernung. Hierx
ist 1y
die Eingabezeichenfolge undu
ist(-:|.)
ein Test, ob die Zeichenfolge mit ihrer Umkehrung übereinstimmt. Das Ergebnis dieser Anwendung von\.
ist daher eine Liste von Booleschen Werten, 1 anstelle jedes Zeichens, dessen Entfernung die Eingabe zu einem Palindrom macht.I.
Erstellt eine Liste aller Indizes (0-Ursprung) von oben, bei denen es eine 1 gab. Durch Hinzufügen von 1 mit werden1+
diese Indizes mit 1 Ursprung erstellt. Wenn keine Indizes 1 waren, ist die Liste leer. Nun versuchen wir, das letzte Element mit aufzunehmen_1{
. (Wir dürfen jeden der entfernbaren Buchstaben ausgeben!) Wenn dies funktioniert, kehren wir zurück. Wenn die Liste jedoch leer war, gab es überhaupt keine Elemente.{
Daher wird ein Domänenfehler ausgegeben, mit dem wir abfangen::
und den Wert -1 zurückgeben[
.Verwendung (Rückruf
NB.
für Kommentare):quelle
Nicht-PHP-Python (73):Wo a ist die Zeichenfolge, die Sie überprüfen möchten.
Dies löst jedoch einen Fehler aus, wenn Sie ihn nicht in ein Palindrom verwandeln können. Stattdessen könnten Sie verwendenEDIT: Nein, warte, es funktioniert!Danke, das erhöht tatsächlich den PHP-Inhalt dieses Skripts um etwa 25% (das ist es, was Sie wollen, oder?)
quelle
1>0
anstelle vonTrue
und das Leerzeichen zwischen]
undfor
in...[::-1] for g...
1
statt verwendenTrue
.1 == True
, Letztendlich.Mathematica,
106988791 ZeichenIch denke, ich bin durch die langen Funktionsnamen etwas behindert, aber solche Probleme machen in Mathematica ziemlich viel Spaß:
Es werden einige Warnungen ausgegeben, da das
l_
Muster auch mit allen darin enthaltenen Zeichen übereinstimmt, dieReverse
nicht bearbeitet werden können. Aber hey, es funktioniert!Etwas ungolfed:
quelle
GolfScript,
2826 ZeichenVielen Dank an Peter für die Kürzung um 2 Zeichen. Probieren Sie die Testfälle online aus :
quelle
RACECAR
ist immer noch ein Palindrom mit dem E. Muss ein zu entfernendes Zeichen angegeben werden, wenn das eingegebene Wort bereits ein Palindrom ist?-2]$-1=)
? Zu Beginn dieses Blocks hast du höchstens einen Gegenstand auf dem Stapel, so dass du ihn leicht kürzen kannst-2]0=)
. (Oder für die gleiche Länge]-2or)
. Ich habe gelernt,or
für besondere Fälle zu lieben ).Rebol (81)
Beispiel für die Verwendung in der Rebol-Konsole:
Oben wird der Index des zuletzt gefundenen Palindroms zurückgegeben. Eine alternative Lösung (85 Zeichen), die jedes gefundene Palindrom zurückgibt, wäre:
Also
"racercar"
dafür würde die Liste zurückkehren[4 5]
.quelle
C #, 134 Zeichen
Ich weiß, ich verliere :( aber es hat trotzdem Spaß gemacht : D
Lesbare Version:
quelle
R
definiert und verwendet?Stax ,
810 BytesFühren Sie es aus und debuggen Sie es
Dieses Programm zeigt alle 1-basierten Indizes an, die aus der Zeichenfolge entfernt werden können, um ein Palindrom zu bilden. Und wenn es keine gibt, wird -1 angezeigt.
quelle
aaabb
Ausgaben5
anstelle von-1
).Rubin (61):
Hier haben Sie eine Rubinlösung. Es gibt die Position des zu entfernenden Zeichens oder -1 zurück, wenn dies nicht möglich ist.
Ich kann nicht anders, als zu glauben, dass es Verbesserungen im Abschnitt dup und slice gibt, aber Ruby scheint keine String-Methode zu haben, die ein Zeichen an einem bestimmten Index entfernt und den neuen String -__- zurückgibt.
Bearbeitet nach Kommentar, ty!
quelle
-1
wenn kein Palindrom gefunden wurde.-1
, danke. Ich bin mir nicht sicher, was Sie davon halten, wenn es darum geht, eine Methode herauszubekommen.05AB1E , 10 Bytes
Probieren Sie es online aus oder überprüfen Sie einige weitere Testfälle .
Erläuterung:
quelle
Nicht PythonPHP ,858381 BytesProbieren Sie es online!
Unnötig rekursiv:
PHP , 96 Bytes
Probieren Sie es online!
quelle
Haskell, 107 Zeichen:
Als Funktion ( 85 Zeichen ):
original ungolfed version:
quelle
C # (184 Zeichen)
Ich gebe zu, das ist nicht die beste Sprache, um Code-Golf zu spielen ...
Formatiert und kommentiert:
quelle
C # (84 Zeichen)
Die LINQpad-Anweisung erwartet, dass die Variable
i
die Eingabezeichenfolge enthält. Die Ausgabe wird in dero
Variablen gespeichert .quelle
Haskell, 80
So genannt:
quelle
Japt , 8 Bytes
Versuch es
quelle
Haskell, 118C
Ungolfed:
quelle
Jelly ,
17-14BytesProbieren Sie es online!
Da ich meinen Ansatz so schnell geändert habe, dass die alte Version nicht mehr im Bearbeitungsverlauf angezeigt wird, war dies:
ŒPṚḊŒḂ€TṂ©’<La®o-
quelle
Brachylog , 24 Bytes
Probieren Sie es online!
Fühlt sich viel zu lang an.
Könnten zwei Bytes kürzer sein, wenn die Ausgabe 2-indiziert sein könnte :
Zwei frühere und noch schlimmere Iterationen:
Die Verwendung einer globalen Variablen durch letztere erfordert einen anderen Testheader .
quelle
Python 3 , 71 Bytes
Probieren Sie es online!
Gibt das 1-indizierte Zeichen zurück, wenn die Operation ausgeführt werden kann
-1
.quelle
Wolfram Language (Mathematica) , 56 Byte
Probieren Sie es online!
Übernimmt die Eingabe als Liste von Zeichen. Fügen Sie für die Zeichenfolge-Eingabe an
@*Characters
.PalindromeQ
wurde im Jahr 2015 eingeführt. Die Alternative kostet +4 Bytes .quelle
Perl 5
-p
,5652 BytesProbieren Sie es online!
quelle
C (GCC) ,
180168159157140139 BytesProbieren Sie es online!
21617 Bytes dank Ceilingcat abgeschnitten! Und 3 weitere Bytes, da die Regeln angeben, dass die Mindestlänge der Eingabe 2 Zeichen beträgt, müssen Sie nicht nach leeren Zeichenfolgen suchen.Ungolfed:
quelle
&&!++p
ist nur schwer zu erklären :)Python, 84
Hiermit wird nicht überprüft, ob die Eingabe (Zeichenfolge s) fast palindrom ist, sondern ob sie zeiteffizient und lesbar ist.
quelle
s[-(i+1)]
kann auf gekürzt werdens[-i-1]
. Ich bin mir auch nicht sicher, aber Sie können möglicherweise dieif...else...
mitreturn i+1 if ... else len(s)-1
s = "abcde"
-1 zurückgegeben werden soll.Mein erstes Code-Golf.
Java. ~ 1200 Zeichen in den Haupt- (und Unter-) Funktionen. Ja baby
Klasse top und gebrauch:
Die Hauptfunktion:
Unterfunktionen:
Volle Klasse:
quelle