Zielsetzung
Erstellen Sie eine Funktion zum Umkehren der Zeichenfolgenverkettung
Eingang
Zwei Zeichenfolgen (alphanumerisch + Leerzeichen), wobei eine für die andere subtrahiert werden soll.
- Sie können davon ausgehen, dass die zu subtrahierende Zeichenfolge niemals größer als die andere sein wird.
Ausgabe
Das Ergebnis aus der Subtraktion
Subtraktion
Sie sollten eine Zeichenfolge vom Anfang oder Ende einer anderen Zeichenfolge entfernen. Wenn die Zeichenfolge am Anfang und am Ende vorhanden ist, können Sie nur eine entfernen. Welche Zeichenfolge entfernt wird, liegt bei Ihnen.
Wenn die Zeichenfolge nicht am Anfang oder am Ende steht oder nicht exakt übereinstimmt, ist die Subtraktion ungültig und Sie sollten die ursprüngliche Zeichenfolge ausgeben.
Testfälle
Gültige Subtraktion
'abcde','ab' -> 'cde'
'abcde','cde' -> 'ab'
'abab','ab' -> 'ab'
'abcab','ab' -> 'abc' or 'cab'
'ababcde','ab' -> 'abcde'
'acdbcd','cd' -> 'acdb'
'abcde','abcde' -> ''
'abcde','' -> 'abcde'
'','' -> ''
Ungültige Subtraktion (gibt die ursprüngliche Zeichenfolge zurück)
'abcde','ae' -> 'abcde'
'abcde','aa' -> 'abcde'
'abcde','bcd' -> 'abcde'
'abcde','xab' -> 'abcde'
'abcde','yde' -> 'abcde'
Ungültige Eingabe (muss nicht bearbeitet werden)
'','a' -> ''
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
cde
? Was meinst du mit gültig? Müssen wir die Gültigkeit der Eingabe beurteilen oder meinen Sie, dass wir keine ungültigen Eingaben erhalten?'abcde','bcd' -> 'abcde'
meine Lösung gebrochen hast'ababcde', 'ab'
→'abcde'
als Testfall vorschlagen . Einige naive Algorithmen schlagen in diesem Fall fehl.Antworten:
Java 8,
46454440 Bytes-1 Byte dank TheLethalCoder
-1 Byte, weil ich dumm bin (danke Rod!)
-4 Bytes dank Kevin Cruijssen
Probieren Sie es online! (beinhaltet alle Testfälle)
Eine Java-Antwort schlägt tatsächlich einige andere praktische Sprachen. Lächelt. (Und jetzt schlägt es JS!)
quelle
a->b->
First
umAll
für -2 Bytes. Aufgrund des^
und steht$
es immer entweder am Ende oder am Anfang des Strings,replaceAll
ersetzt ihn also auch damit nur einmal. Probieren Sie es hier aus. PS: Ich habe die vorangegangenen durchgestrichenen Byte-Zählungen zu Ihrer Antwort hinzugefügt, was normalerweise nach Code-Golf-Änderungen hier bei PPCG der Fall ist.All
anstelle von verwendeFirst
, wird dies wahr:"abab" + "ab" -> ""
JavaScript (ES6), 41 Byte
Übernimmt Eingaben über die Currysyntax, d
f("abab")("ab")
. H.quelle
eval()
RegExes zu erstellen ?!Brachylog (Online testen !), 12 Byte
Probieren Sie es online!
Subtrahiert die Zeichenfolge von der Standardeingabe und subtrahiert die Zeichenfolge als Befehlszeilenargument.
Erläuterung
quelle
Netzhaut , 21 Bytes
1 Byte Danke an Martin Ender.
Probieren Sie es online!
quelle
JavaScript (ES6),
76704541 ByteVersuch es
quelle
new
.Perl 6 , 21 Bytes
Versuch es
Erweitert:
quelle
Japt ,
119 BytesProbieren Sie es online!
quelle
TI-Basic (TI-84 Plus CE), 63 Byte
quelle
Ans
überhaupt in der vierten Zeile?Ans
bezieht sich auf den zuletzt ausgewerteten Wert, in diesem Fall also auf den von zurückgegebenen WertinString(
, der der Index der TeilzeichenfolgeStr2
in der Zeichenfolge ist,Str0
oder auf 0, wenn die Teilzeichenfolge nicht angezeigt wird. Eine if-Anweisung ändert den Wert von Ans nicht. In der vierten Zeile befindet sich der Index also nochAns
.inString
funktioniert hat. Schönes Golf!Mathematica, 162 Bytes
Testeingabestil ["abcde", "ab"]
quelle
#
anstelle von verwenden#1
- sie bedeuten genau dasselbe. Anstatt zu verwendenStringJoin@t
, können Sie auch schummeln, indem Sie eine leere Zeichenfolge damit verbinden""<>t
, wodurch automatisch auch allest
zusammengefügt wird. Haben Sie die Seite mit den Mathematica-Golftipps gesehen ?t={};
Beginn definieren ), aber es könnte einfacher sein, einen völlig anderen Ansatz zu verwenden - haben Sie versucht, die zu verwendenStringReplace
Funktion?c=Characters;a=c@#;b=c@#2;
l@Intersection[a,b]
istl[a∩b]
.Python,
696864575145 BytesDies war eine völlig andere Lösung für Regex.
Danke an Value Ink für -2 Bytes!
und Felipe Nardi Batista für die massiven -6 Bytes!
Probieren Sie es online!
quelle
re.sub(c.join("^|$"),'',s,1)
c+'$|^'+c
Bash ,
666149 BytesProbieren Sie es online!
weniger golfen:
Verwendet case zum Testen von Anfang oder Ende und der Subtraktion von Array-Präfix / Suffix (% / #)
quelle
case
, aber länger als nötig. Die 2. und 3. Muster könnte zu einem einzigen zusammengefasst werden:*)c=${1#$2};;
. Dann mit nur 2 Zweige wären kürzerecho
jeweils direkt anstelle der Verwendung von variablen$c
:case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac
. Oder Sie könnten halten Sie es, aber ohnecase
:c=${1%$2};[[ $c = $1 ]]&&c=${1#$2};echo $c
.APL (Dyalog) ,
3130 Bytes-1 danke an Zacharý .
Dies verwendet tatsächlich die umgekehrte Verkettung! Nimmt den Originalstring als linkes Argument und was als rechtes Argument zu subtrahieren ist.
Probieren Sie es online!
Ungolfed:
Legende:
{
…}
Anonyme Funktion⍺
linkes Argument der aktuellen Funktion⍵
richtiges Argument der aktuellen Funktion0::
… Falls ein Fehler auftritt, führe diesen aus, sonst…⍣¯1⊢
invers,∘⍵
verketten ⍵ auf der rechten Seite⍵,
verketten ⍵ auf der linken Seitequelle
{0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}
.PHP, 54 Bytes
Testfälle
quelle
Python 2 , 68 Bytes
Probieren Sie es online!
quelle
Haskell , 49 Bytes
Probieren Sie es online! Verbrauch:
f"" "abcdef" "ab"
. Alternativ definieren(-)=f""
und verwenden Sie like"abcdef" - "ab"
.Bei dieser Lösung ohne regulären Ausdruck wird die Zeichenfolge in alle Vor- und Nachfixes rekursiv aufgeteilt und überprüft, ob die zu subtrahierende Zeichenfolge mit einer dieser Zeichenfolgen übereinstimmt.
quelle
Python 2 ,
7265 BytesProbieren Sie es online!
-7 Bytes dank @FelipeNardiBatista
quelle
88 Bytes
Kompiliert zu a
Func<string, Func<string, string>>
.quelle
Rubin (Lambda-Ausdruck), 29 Bytes
Yay für Regex-Interpolation! Benötigt regex-sichere Subtrahenden, aber das ist gemäß der Herausforderung in Ordnung.
quelle
Tcl , 37 Bytes
Probieren Sie es online! (jetzt laufen alle tests)
Tcl ist einfach.
proc s {a b}
definiert eine Funktion mit dem Namen,s
die Parametera
und akzeptiertb
.regsub
Ersetzt{}
den Wertb
, der am Anfang oder Ende von steht, durch eine leere Zeichenfolgea
. Die Rückgabe ist implizit.quelle
C 96 Bytes
Es ist allgemein bekannt, dass die Manipulation von Saiten in C umständlich ist, da eine Erweiterung des Golfsports eine masochistische Grenze darstellen würde. Klingt in Ordnung für mich.
Eines der weniger lesbaren Programme, die ich geschrieben habe. Nimmt zwei Eingaben entgegen (
char**
unabhängig davon, wie die Funktion aussieht), eine, die auf die zu dekonkatenierende Zeichenfolge zeigt, und eine,char*
die die zu entfernende Zeichenfolge ist. Der Eingabezeiger wird an Ort und Stelle bearbeitet und wird zur Ausgabe (wer sowieso über Speicherverluste spricht).Anwendungsbeispiel:
quelle
AWK ,
2132 BytesProbieren Sie es online!
Die ursprüngliche Einreichung ersetzte naiv den Text innerhalb der ersten Zeichenfolge, nicht nur am Anfang oder Ende.
Probieren Sie es online!
Ursprünglich ohne geschweifte Klammern ausprobiert, waren jedoch Tricks erforderlich, um leere Zeilen und / oder keine Übereinstimmungen auszudrucken, wodurch mehr Bytes als in dieser Version hinzugefügt wurden.
quelle
R
204241 Bytes-1 Byte dank MickyT!
Gibt eine anonyme Funktion zurück (die Argumente in der Reihenfolge enthält
b,a
). Berechnet den Stringunterschieda-b
.sub
ist eine einfache Ersetzung, bei der das erste Auftreten des Musters durch die leere Zeichenfolge ersetzt wird''
. Konstruiert den regulären Ausdruck sosprintf
, dass er nur am Anfang und am Ende der Zeichenfolge übereinstimmt. Erfordert diepryr
Installation des Pakets.Verwendet
function(a,b)
für die TIO-Verknüpfung die ausführlichere Definition für die Funktion für vier weitere Bytes.Probieren Sie es online!
quelle
'abcde','bcd' -> 'abcde'
Fall?sub
ist eine einfache Ersetzung, die einfach das erste Vorkommen vonb
ina
vertauscht": Wird diese Ersetzung durchgeführt, wenn sich die zweite Zeichenfolge in der Mitte der ersten Zeichenfolge befindet?sprintf('^%s|%s$',b,b)
Common Lisp, 121 Bytes
Probieren Sie es online!
Das übliche wortreiche Common Lisp!
Ungolfed-Version:
quelle
Kotlin , 91 Bytes
Probieren Sie es online!
quelle
{a,b->var c=a.removePrefix(b);if(a==c){c=a.removeSuffix(b)};c}
Powershell,
34 bis40 Bytes+6 Bytes beim
Invalid Subtraction
Hinzufügen von TestfällenKommentar:
Der Ausdruck regexp
^$t|$t$
funktioniert nicht wie erwartet: Er ersetzt beide Übereinstimmungen statt einer (Flagg
immer aktiviert ). Wir sind also gezwungen, die negative Lookahead-Gruppe zu verwenden.Testskript:
Ausgabe:
quelle
QBIC , 57 Bytes
Whegh, das ist ein Durcheinander in QBIC / QBasic ...
quelle
Lua ,
7165 BytesVorschläge annehmen
Probieren Sie es online!
quelle
Ich habe die Anweisungen anfangs falsch gelesen. Vielen Dank, Ørjan Johansen, dass Sie auf meinen Fehler hingewiesen haben!
PowerShell ,
4651 BytesProbieren Sie es online!
quelle
abcde
-bcd
tritt an keinem Ende des Strings auf.Excel, 129 Bytes
quelle
sed ,
5653 bytesProbieren Sie es online!
quelle