Bestimmen Sie anhand der Zeichenfolgen X und Y, ob X eine Teilfolge von Y ist. Die leere Zeichenfolge wird als Teilfolge jeder Zeichenfolge betrachtet. (ZB ''
und 'anna'
sind Teilfolgen von 'banana'
.)
Eingang
- X, eine möglicherweise leere alphanumerische Zeichenfolge, bei der die Groß- und Kleinschreibung beachtet wird
- Y, eine möglicherweise leere alphanumerische Zeichenfolge, bei der die Groß- und Kleinschreibung beachtet wird
Ausgabe
- True oder False (oder Äquivalente), die korrekt angeben, ob X eine Teilfolge von Y ist.
I / O-Beispiele
X Y output
'' 'z00' True
'z00' 'z00' True
'z00' '00z0' False
'aa' 'anna' True
'anna' 'banana' True
'Anna' 'banana' False
Kriterien
- Das kürzeste Programm gewinnt, wie durch die Anzahl der Bytes des Quellcodes bestimmt.
Beispielprogramme
- Mehrere Programme, die angepasst werden könnten, befinden sich in dieser zugehörigen Buchung .
anna
ist eine Teilfolge (aber keine Teilfolge ) vonbanana
. Die Zeichenfolge X ist eine Teilfolge der Zeichenfolge Y, wenn X aus Y erhalten werden kann, indem null oder mehr der Elemente von Y gelöscht werden. zB das Löschen desb
und des zweitena
vonbanana
gibtanna
.Antworten:
Perl 5 , 17 Bytes (+1?), Volles Programm
Probieren Sie es online!
Rufen Sie mit dem
p
Flag den Perl-Interpreter auf, wie inperl -pe 's//.*/g;$_=<>=~$_'
. Gemäß den festgelegten Bewertungsregeln, als diese Herausforderung ursprünglich veröffentlicht wurde , kostet dieses Flag ein zusätzliches Byte. Nach neueren Regeln , AFAICT, kann es kostenlos sein.In beiden Fällen sollten die Eingabezeichenfolgen in separaten Zeilen mit Zeilenumbruch auf stdin bereitgestellt werden. Die Ausgabe (nach stdout) erfolgt,
1
wenn die erste Eingabezeichenfolge eine Teilzeichenfolge der zweiten ist, oder wenn dies nicht der Fall ist, wird überhaupt nichts ausgegeben.Beachten Sie, dass beide Eingabezeilen am Ende eine neue Zeile haben müssen, sonst funktioniert das Programm nicht richtig. Alternativ können Sie
l
dem Aufruf das Befehlszeilenflag hinzufügen , damit Perl die Zeilenumbrüche entfernt. Abhängig von den geltenden Bewertungsregeln kann dies ein zusätzliches Byte kosten oder auch nicht. Beachten Sie, dass bei Verwendung dieses Flags auch eine neue Zeile an die Ausgabe angehängt wird.Originalversion (Snippet, 18 Bytes / Zeichen)
Die Eingabe erfolgt in den Variablen,
$x
und$y
result ist der Wert des Ausdrucks (im skalaren Kontext). Beachten Sie, dass$x
im Prozess geändert wird. (Ja, ich weiß, mit$_
anstatt$x
würde ich vier Zeichen sparen, aber das in einem Ausschnitt zu tun, der sich für mich ein bisschen zu kitschig anfühlt.)Wie funktioniert es?
Im ersten Teil wird
$x=~s//.*/g
die Zeichenfolge.*
zwischen den einzelnen Zeichen in eingefügt$x
. Der zweite Teil wird als regulärer Ausdruck$y=~$x
behandelt$x
und spielt$y
dagegen. Stimmt in Perl-Regexps.*
mit null oder mehr beliebigen Zeichen überein, während alle alphanumerischen Zeichen in geeigneter Weise mit sich selbst übereinstimmen.quelle
Ruby, 32 Zeichen
Diese Lösung gibt zurück,
nil
wennx
es sich nicht um eine Folge vony
und ansonsten um eine Zahl handelt (dh Rubinäquivalente zufalse
undtrue
). Beispiele:quelle
y=~/#{[*x.chars]*".*"}/
(23 Zeichen) einbringen würde. Prost!y=~/#{x.split("")*".*"}/
(21 Zeichen) :)y=~
Haskell,
5137Vielen Dank an Hammar für die wesentliche Verbesserung. Es ist jetzt eine Infix-Funktion, aber es scheint keinen Grund zu geben, warum es nicht sollte.
Demonstration:
quelle
s x y=x<=y
. Sie können auch einige weitere speichern, indem Sie es zu einem Operator machen und stattdessen ein@
-pattern verwenden(f:l)
. Diesh@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
Python (48 Zeichen)
Gleicher Ansatz wie Howards Ruby-Antwort. Schade, dass Python das Regex-Paket und dessen "ausführliche" Informationen importieren muss
lambda
. :-)quelle
Python, 59 Zeichen
Ich dachte, meine Antwort würde sich besser in Python ausdrücken lassen.
Bearbeiten: Vorschläge von res hinzugefügt.
quelle
x="a"
undy="ab"
Sie würden die Schleife mit verlasseny=="b"
und zurückkehrenfalse
?x
und nachy
oben. In meinen Funktioneny
muss eine Folge von seinx
. Ich denke, ich sollte sie ändern, um Verwirrung zu vermeiden.def s(x,y): for c in y: if x:x=x[c==x[0]:] return x==""
. Es wird in einem Kommentar nicht richtig angezeigt, aber ich denke, Sie können sehen, was ich meine. (Auch ein mehr Platz ist genug , um den Einzug zu erhöhen.)''
und mehrere Zeichen zu speichern, indem Sie Folgendes schreiben:x=x[c==x[0:1]:]
GolfScript (22 Zeichen)
Geht davon aus, dass die Eingabe als zwei vordefinierte Variablen genommen wird
X
undY
, obwohl das eher ungewöhnlich in GolfScript ist. Blätter1
für wahr oder0
falsch auf dem Stapel.quelle
C (52 Zeichen)
Testfälle
quelle
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
Burlesque (6 Zeichen)
6 Zeichen in Burlesque:
R@\/~[
(Angenommen, x und y sind auf dem Stapel. Sehen Sie hier in Aktion.)quelle
C 23:
Ergebnis in * x
http://ideone.com/BpITZ
quelle
PHP, 90 Zeichen
quelle
if
Aussage entfernen und zu vereinfachen$x=substr($x,$y[$a++]==$x[0])
: ideone.com/Ch9vKScala 106:
quelle
CoffeeScript
1121009589Mein erster Versuch, Code Golf zu spielen ... hoffe, ich schäme meine Familie nicht!
Bearbeiten : Es stellt sich heraus, dass Coffeescript mehr verzeiht, als ich mit Leerzeichen dachte.
Vielen Dank an res und Peter Taylor für ein paar Tipps, um es ein bisschen schlanker zu machen
quelle
z=(x,y)-> a=x.length return 1if a==0 b=y.indexOf x[0] return 0if b<0 z x[1..a],y[b+1..y.length]
. (In einigen Browsern, zB Chrome, können Sie Kommentar Code korrekt angezeigt durch einen Rechtsklick, dann Inspect Element sehen.)a.length
wird nie negativ sein, so dass Sie ein Zeichen mehr durch Ersetzen sparenif a==0
mitif a<1
. Ich weiß nicht, wie die Tokenisierung von CoffeeScript funktioniert, aber wenn sieif0
zwei Token enthält, können Sie zwei weitere sparen, indem Sie beide Bedingungen umkehren (dhif1>a
).if1>a
ist nicht gültig, aberif!a
ist und ist ein Zeichen kürzer! Ich erkennen auch , dass ich ein zusätzliches Zeichen Umwandlung rasieren könnteb+1
zub
und Erhöhen sie in der vorhergehenden Zeile, auch die Herstellung desselbenif
Trick möglich , da es mit einer 0 / nicht-0 Situation zu tun war.C #,
7011310790 Zeichenquelle
static bool S(string x,string y){if(x!=""&&y=="")return false;return x==""||S(y[0]==x[0]?x.Remove(0,1):x,y.Remove(0,1));}
x==""||y!=""&&S(...)
Version auf reduzieren , sie ist jedoch immer noch länger als die aktualisierte Linq-Version. Gute Verwendung vonAny
!Mathematica
19 1727LongestCommonSequence
Gibt die längste nicht zusammenhängende Folge von zwei Zeichenfolgen zurück. (Nicht zu verwechseln mitLongestCommonSubsequence
der längsten zusammenhängenden Folge.Im Folgenden wird geprüft, ob die längste zusammenhängende Teilfolge die erste der beiden Zeichenfolgen ist. (Sie müssen also die kürzere Zeichenfolge gefolgt von der größeren Zeichenfolge eingeben.)
Beispiele
Richtig Richtig Richtig Falsch
Der kritische Test ist der dritte, weil "anna" nicht zusammenhängend in "banana" enthalten ist.
quelle
Python 3.8 (Vorabversion) , 42 Byte
Probieren Sie es online!
Python 3.8 (Vorabversion) , 48 Byte
Probieren Sie es online!
Python 2 , 48 Bytes
Probieren Sie es online!
Abgeschrieben von dieser Antwort von Lynn . Das
>0
kann weggelassen werden, wenn nur die Wahrheits- / Falschausgabe in Ordnung ist.Python 2 , 50 Bytes
Probieren Sie es online!
Python 2 , 50 Bytes
Probieren Sie es online!
quelle
C -
74 7164Dies schlägt Peter Taylors Lösung nicht, aber ich denke, es macht ziemlich viel Spaß
(plus, dies ist ein vollständiges Arbeitsprogramm, nicht nur eine Funktion)Und ungolfed:
Zum Testen können Sie Folgendes tun:
quelle
!=0
in einem Zustand ist ein bisschen wortreich ... Programm vs Funktion ist etwas, das die Frage klar spezifizieren muss, und hier nicht, so dass die Antworten verschiedene Optionen haben.!='\0'
ist eine schlechte (gute?) Angewohnheit beim Schreiben von Nicht-Golf-Code. Ich habe das in meine letzten beiden Golfrunden einfließen lassen. Ich muss in Zukunft vorsichtiger sein. Was das Programm und die Funktion angeht, haben Sie absolut Recht.Python,
66625958 ZeichenIrgendwie eine lustige Lösung, definitiv ein ordentliches Problem.
quelle
Ruby
323028Dies gibt eine
MatchData
Instanz zurück, wenna
eine Folge vonb
oder aufnil
andere Weise vorliegt.Alte Version, die Teilzeichenfolge anstelle von Teilzeichenfolge findet
Rubin 15
Wenn Sie eine
String#[](str)
Methode verwenden, die zurückgibt,str
wennstr
es sich um eine Teilzeichenfolge vonself
und handelt,!!
um zurückzugeben,Boolean
wenn der zurückgegebene Wert als boolescher Wert verwendet werden kann (und dies nicht sein musstrue
oderfalse
), können es nur 13 Zeichen sein:Es wird zurückgegeben,
nil
wenna
es sich nicht um eine Teilzeichenfolge von handeltb
.quelle
SWI-Prolog, SICStus
Die eingebaute Prädikat- Unterliste / 2 von SICStus prüft, ob alle Elemente der ersten Liste auch in der zweiten Liste erscheinen. Dieses Prädikat ist auch in SWI-Prolog über eine Kompatibilitätsbibliothek verfügbar, die von der Abfrage geladen werden kann
[library(dialect/sicstus/lists)].
.Probelauf:
Die Byteanzahl kann technisch gesehen 0 sein, da hier nur abgefragt wird, ähnlich wie wir ein Programm ausführen und Eingaben an dieses senden.
quelle
PHP, 41 Bytes
Gibt 1 für wahr und nichts für falsch aus
Wenn nur die Einfügungen von Wort 1 bis Wort 2 durchgeführt wurden, ist der Zähler für wahre Fälle Null
levenshtein
Probieren Sie es online!
PHP, 57 Bytes
Gibt 1 für wahr und 0 für falsch aus
Erstellt einen Regex
Probieren Sie es online!
quelle
.*
ist nicht erforderlich. -2 Bytes DO NOT assign$argv
zu$a
. +24 Bytes: Erfordertarray_map(preg_quote())
Sonderzeichen (verwenden Sie Klammern als Begrenzer, um den zweitenpreg_quote
Parameter zu vermeiden .)preg_match
wird sich nicht über einen leeren regulären Ausdruck beschweren, solange die Begrenzer vorhanden sind. Es passt einfach zu allem. Aber preg_quote ist nur 22 Bytes, nicht 24:array_map(preg_quote,str_split(...))
..*
.Brachylog , 2 Bytes
Probieren Sie es online!
Wie bei dieser Antwort
⊆
handelt es sich um ein integriertes Prädikat, das eine Beziehung zwischen den Eingabe- und Ausgabevariablen und deklariertᵈ
um ein Metaprädikat, das es modifiziert, um stattdessen dieselbe Beziehung zwischen dem ersten und dem zweiten Element der Eingabevariablen zu deklarieren (und zu vereinheitlichen) die Ausgabevariable mit dem zweiten Element, da dies jedoch ein Entscheidungsproblem ist, das hier keine Rolle spielt).X⊆Y
ist eine Behauptung, dass X eine Folge von Y ist, also ist es so[X,Y]⊆ᵈ
.Dieses Prädikat (das natürlich durch Erfolg oder Misserfolg ausgibt, was gedruckt wird)
true.
oderfalse.
wenn es als Programm ausgeführt wird) nimmt die Eingabe als Liste von zwei Zeichenfolgen entgegen. Wenn die Eingabe etwas flexibler ist ...Brachylog , 1 Byte
Probieren Sie es online!
Nimmt String X als Eingabevariable und String Y als Ausgabevariable. Outputs durch Erfolg oder Misserfolg wie zuvor. Wenn es als vollständiges Programm ausgeführt wird, wird X als Eingabe und Y als erstes Befehlszeilenargument angegeben.
quelle
CoffeeScript 73
Hier ist eine alternative CoffeeScript-Antwort, bei der reguläre Ausdrücke anstelle von Rekursionen verwendet werden:
Wenn der Heuhaufen einem sehr gierigen Regex entspricht, der aus der Nadel besteht, wird er durch einen leeren String ersetzt. Wenn der Heuhaufen kürzer ist als er begonnen hat, war die Nadel eine Teilsequenz.
Gibt false zurück, wenn
x
undy
sind beide leere Strings. Denken Sie, wir brauchen einen Philosophen, der uns sagt, ob eine leere Zeichenkette eine Folge von sich selbst ist!(Gepostet als separate Antwort von meiner vorherigen, da es sich anders anfühlt, als es rechtfertigt).
quelle
PowerShell, 38
Natürlich hat jede solche auf Regex oder Musteranpassung basierende Lösung schwerwiegende Leistungsprobleme mit längeren Zeichenfolgen. Aber da ist Kürze das Kriterium ...
quelle
Eine Art Anti-Lösung, die alle Teilfolgen von Y erzeugt:
Python 93
quelle
APL (31)
In APL fehlt es etwas an der String-Behandlung.
Verwendung:
quelle
Python 132
Ähnlich wie bei Daniero. Nicht die einfachste Lösung, aber es hat Spaß gemacht, es zu versuchen. Ich bin neu in Python, daher bin ich mir sicher, dass ich es kürzer machen könnte, wenn ich ein bisschen mehr wüsste.
quelle
Python - 72
quelle
Python (
7552)Einfache rekursive Lösung. Das erste Mal Golf spielen, also sind alle Tipps zum Abschwächen sehr willkommen :)
Getestet mit:
Vielen Dank an @lirtosiast für einige clevere boolesche Tricks.
quelle
s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
PHP,
756564 BytesNimmt Eingaben von Befehlszeilenargumenten entgegen. druckt
1
für wahr, leere Zeichenfolge für falsch. Laufen Sie mit-r
.Erläuterung:
strpos
zurückkehrt ,false
wenn Nadel$c
nicht im Heuhaufen ist$argv[2]
(nach der Position$p
),wodurch die Schleife zu durchbrechen.
strpos
kehrt auchfalse
für eine leere Nadel zurück und unterbricht die Schleife am Ende von$argv[1]
.$argv[1]
eine Untersequenz von ist$argv[2]
,$c
ist diese leer, wenn die Schleife unterbrochen wird.strpos
muss Warnung@
unterdrückenEmpty needle
.quelle
+$p
stattdessen$p+1
ist der Unterstrich nicht mehr nötig+1
wird benötigt, um im Heuhaufen voranzukommen; und der Unterstrich vermeidet die$p=-1
Initialisierung. Aber ... ich kann es vermeidenfalse!==
.Swift, 27
quelle