Wenn Sie (in STDIN, als Befehlszeilenargumente oder als Funktionsargumente) zwei unterschiedliche, nicht leere Zeichenfolgen angeben, suchen Sie die kürzeste Teilzeichenfolge der ersten Zeichenfolge, die keine Teilzeichenfolge der zweiten ist, und geben Sie sie zurück. Wenn keine solche Teilzeichenfolge vorhanden ist, können Sie die leere Zeichenfolge zurückgeben, eine beliebige Zeichenfolge zurückgeben, die keine Teilzeichenfolge der ursprünglichen Zeichenfolge ist, oder eine Ausnahme auslösen. Wenn Sie von einer Funktion zurückkehren, können Sie in diesem Fall auch null (oder undefiniert, keine usw.) zurückgeben. Wenn mehrere solcher Teilzeichenfolgen für die kürzeste Zeit gebunden sind, können Sie eine beliebige davon zurückgeben.
Zeichenfolgen können aus beliebigen druckbaren ASCII-Zeichen bestehen.
Auf STDIN angegebene Eingaben werden mit einer Zeichenfolge in jeder Zeile angegeben. Auf Ihren Wunsch kann am Ende der Eingabe eine einzelne Leerzeile eingefügt werden.
Dies ist Codegolf, also gewinnt das kürzeste gültige Programm.
EINIGE TESTFÄLLE
EINGANG:
STRING ONE
STRING TWO
AUSGABE:
E
EINGANG:
A&&C
A&$C
GÜLTIGE AUSGÄNGE:
&&
&C
EINGANG:
(Zwei zufällig generierte Zeichenfolgen mit 80 Buchstaben)
QIJYXPYWIWESWBRFWUHEERVQFJROYIXNKPKVDDFFZBUNBRZVUEYKLURBJCZJYMINCZNQEYKRADRYSWMH
HAXUDFLYFSLABUCXUWNHPSGQUXMQUIQYRWVIXGNKJGYUTWMLLPRIZDRLFXWKXOBOOEFESKNCUIFHNLFE
ALLE GÜLTIGEN AUSGÄNGE:
AD
BJ
BR
CZ
DD
EE
ER
EY
EY
FF
FJ
FW
FZ
HE
IJ
IN
IW
JC
JR
JY
KL
KP
KR
KV
LU
MH
MI
NB
NQ
OY
PK
PY
QE
QF
QI
RA
RB
RF
RO
RV
RY
RZ
SW
UE
UH
UN
UR
VD
VQ
VU
WB
WE
WI
WU
XN
XP
YI
YK
YK
YM
YS
YW
YX
ZB
ZJ
ZN
ZV
Antworten:
Brachylog , 23 Bytes
Funktioniert auf dem alten Java-Transpiler. Erwartet die beiden Zeichenfolgen in einer Liste als Eingabe, vereinheitlicht die Ausgabe mit der Teilzeichenfolge. Wenn keine Teilzeichenfolge gefunden wird, wird false zurückgegeben.
Leider habe ich die im neuen Prolog-Transpiler integrierte Teilmenge noch nicht codiert.
Erläuterung
quelle
Python,
11911591Testfälle:
Ich arbeite daran, es kürzer zu machen, aber das ist mein Gehirninstinkt. Noch kein richtiger Golfer.
Vielen Dank an @ user81655 und @NonlinearFruit für die zusätzlichen Bytes.
Bearbeiten :
Dang. Versuchte diesen Code:
Dachte, es wäre ein paar Bytes kürzer. Es stellte sich heraus, dass es 1 Byte länger war als vor der Bearbeitung.
quelle
(r=range)(1,len(a)+1)
dann nutzenr
?range
zur
in der Zeile darüber, fügt es tatsächlich ein Byte. Gute Idee. Es gibt wahrscheinlich einen kürzeren Weg, um die Teilzeichenfolgen zu durchlaufen.range(1,len(a))
undrange(len(a)-1)
sollte funktionieren sollte es nicht? Außerdem würde die Verwendung eines Tabulatorzeichens für den Einzug mit zwei Leerzeichen ein Byte sparen.range(1,len(a))
schlägt die vierte Testbesetzung fehl, da nicht die gesamte Saite ausprobiert wird. es geht nur bis zur Länge der Zeichenkette - 1. Und mitrange(len(a)-1)
schlägt der erste Testfall fehl,'cd'
anstatt nur zurückzukehren'd'
. Möglicherweise gibt es dort jedoch etwas.range(1,len(a)+1)
undrange(len(a))
.Python,
8786 BytesIst dies der Fall, wird die am weitesten links stehende aller kürzesten eindeutigen Teilzeichenfolgen zurückgegeben.
Wenn es keine eindeutige Teilzeichenfolge gibt, wird eine Teilzeichenfolge IndexError gibt .
Teste es auf Ideone .
quelle
enumerate
, umj
bei zu beginneni+1
.j
dann zuersti
.'ab'
gegen eine Eingabe aus'abc','aaa'
.Python, 82 Bytes
Verbrauch:
f('A&&C', 'A&$C')
-> Rückkehr'&&'
Löst ValueError aus, wenn keine geeignete Teilzeichenfolge vorhanden ist.
Erläuterung:
g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}
Erstellt rekursiv eine Menge der Teilzeichenfolgen vonu
f=lambda s,t:min(g(s)-g(t),key=len)
entnimmt die kürzeste Teilzeichenfolge der Mengenunterschiedequelle
JavaScript (ES6), 79 Byte
Wenn die Rückgabe
false
akzeptabel ist, speichern Sie 2 Bytes mit&&s
anstelle von?s:''
.quelle
Pyth, 11 Bytes
Probieren Sie es online!
quelle
JavaScript (Firefox), 80 Byte
Test funktioniert nur in Firefox. Gibt zurück,
undefined
wenn keine Teilzeichenfolge vorhanden ist.quelle
b.includes
stattdessen verwenden?includes
.SyntaxError: unexpected token 'for'
Retina , 37 Bytes
Die Ausgabe ist leer, wenn in keine gültige Teilzeichenfolge gefunden wird
A
.Probieren Sie es online!(Leicht modifiziert, um mehrere Testfälle gleichzeitig auszuführen. Das Eingabeformat ist tatsächlich zeilenweise getrennt, aber Testsuiten lassen sich am einfachsten mit einem Testfall pro Zeile schreiben. Das Testframework verwandelt den Raum in einen Zeilenvorschub, bevor der eigentliche Code beginnt.)
Erläuterung
A
Suchen Sie für jede mögliche Startposition in die kürzeste Unterzeichenfolge, die nicht in angezeigt wirdB
. Das&
ist für überlappende Übereinstimmungen, so dass wir tatsächlich jede Startposition ausprobieren, auch wenn eine Übereinstimmung länger als ein Zeichen ist. Das\G
stellt sicher, dass wir keine Positionen überspringen - insbesondere müssen wir auf diese Weise beim Zeilenvorschub anhalten, damit wir keine zusätzlichen Übereinstimmungen vonB
sich bekommen. Der Grund, warum dies die Dinge nicht durcheinander bringt, ist eigentlich ziemlich subtil: Wenn es eine Startposition gibt,A
an der wir keine gültigen Teilzeichenfolgen finden können, ist dies auch ein Fehler, der dazu führt, dass\G
keine weiteren Positionen mehr überprüft werden. Wenn jedoch (ab der aktuellen Startposition) alle Teilzeichenfolgen in angezeigt werdenB
, werden alle Teilzeichenfolgen, die weiter rechts von der aktuellen Position beginnen, so dass das Verwerfen dieser Teilzeichenfolgen kein Problem darstellt (und die Leistung tatsächlich verbessert).Aufgrund der
M!
Konfiguration werden alle diese Übereinstimmungen zusammen mit Zeilenvorschüben von der Bühne zurückgegeben.Dadurch werden die Zeilen des vorherigen Ergebnisses nach Länge sortiert. Dies geschieht durch Abgleichen der Zeile mit
.+
. Dann$
aktiviert eine Form von „sort-by“, so dass die Übereinstimmung mit substituierten wird$.&
zur Bestimmung Sortierreihenfolge. Der$.&
selbst ersetzt das Streichholz durch seine Länge. Schließlich weist die#
Option Retina an, numerisch zu sortieren (andernfalls würden die resultierenden Zahlen als Zeichenfolgen behandelt und lexikografisch sortiert).Schließlich behalten wir einfach nur die erste Zeile bei, indem wir eine grep-Stufe mit einem leeren regulären Ausdruck (der immer übereinstimmt) und einem Limit von verwenden
1
.quelle
Perl,
8785Dies ist eine anonyme Funktion, die die erste (nach Position) der kürzesten Teilzeichenfolgen zurückgibt
$_[0]
, die nicht in vorkommen$_[1]
, oderundef
wenn keine solche Teilzeichenfolge vorhanden ist.Testprogramm mit Strings aus der Antwort von @ iAmMortos, getestet mit Perl 5.22.1:
quelle
Haskell, 72 Bytes
Anwendungsbeispiel:
"abcd" # "dabc"
->"cd"
.Eine unkomplizierte Implementierung: Erstellen Sie alle Teilzeichenfolgen von
a
und behalten Sie diejenigen bei, die nicht in angezeigt werdenb
.argmin
Gibt ein Element einer Liste zurück, das die Funktion mit dem 2. Argument minimiertlength
.quelle
argmin
! It seems extremely useful.Pyth -
96 bytesTry it online here.
quelle
C#, 152 bytes
quelle
Ruby, 70 bytes
Collects all substrings of a certain length from the first string, and if there is one that isn't in the second string, return it.
quelle
Burlesque - 26 bytes
Right now the shortest way I can come up with is:
quelle
Japt, 14 bytes
Try it online!
Returns
undefined
if there is no valid substring. This is distinct from returning the string "undefined", though the difference is only visible because of the -Q flag.Explanation:
quelle
Japt
-h
, 11 bytesTry it
quelle