Ist String X eine Folge von String Y?

23

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

res
quelle
1
Warum ist 'anna' ein Teil von 'banana'?
KaoD
4
@kaoD - annaist eine Teilfolge (aber keine Teilfolge ) von banana. 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 des bund des zweiten avon bananagibt anna.
Res
2
Dies hat ungefähr eine einzige Lösung in jeder Skriptsprache, die Regex bietet, die sowohl trivial zu sehen als auch unmöglich weiter zu golfen ist.
Joey

Antworten:

18

Perl 5 , 17 Bytes (+1?), Volles Programm

s//.*/g;$_=<>=~$_

Probieren Sie es online!

Rufen Sie mit dem pFlag den Perl-Interpreter auf, wie in perl -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, 1wenn 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 ldem 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)

$x=~s//.*/g,$y=~$x

Die Eingabe erfolgt in den Variablen, $xund $yresult ist der Wert des Ausdrucks (im skalaren Kontext). Beachten Sie, dass $xim Prozess geändert wird. (Ja, ich weiß, mit $_anstatt $xwü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//.*/gdie Zeichenfolge .*zwischen den einzelnen Zeichen in eingefügt $x. Der zweite Teil wird als regulärer Ausdruck $y=~$xbehandelt $xund spielt $ydagegen. Stimmt in Perl-Regexps .*mit null oder mehr beliebigen Zeichen überein, während alle alphanumerischen Zeichen in geeigneter Weise mit sich selbst übereinstimmen.

Ilmari Karonen
quelle
Nach unserem (neuen?) Konsens müssen Einsendungen ein Programm oder eine Funktion sein, kein Ausschnitt. Wenn Ihr Beitrag dem nicht entspricht, sollten Sie ihn bearbeiten.
User202729
@ user202729: Diese Herausforderung ist viel älter als dieser Konsens. Daher sollten die Antworten in diesem Thread, sofern nicht davon ausgegangen wird, dass sie rückwirkend angewendet werden, wahrscheinlich "großväterlich" lauten kann sogar ein Byte / Zeichen kürzer sein (beachten Sie, dass die Byte-basierte Zählung auch neuer ist als diese Herausforderung, AFAIK), je nachdem, wie Sie Befehlszeilenschalter zählen.
Ilmari Karonen
9

Ruby, 32 Zeichen

s=->x,y{y=~/#{[*x.chars]*".*"}/}

Diese Lösung gibt zurück, nilwenn xes sich nicht um eine Folge von yund ansonsten um eine Zahl handelt (dh Rubinäquivalente zu falseund true). Beispiele:

p s['','z00']        # => 0   (i.e. true)
p s['z00','z00']     # => 0   (i.e. true)
p s['z00','00z0']    # => nil (i.e. false)
p s['anna','banana'] # => 1   (i.e. true)
p s['Anna','banana'] # => nil (i.e. false)
Howard
quelle
1
Ich habe im Grunde das Gleiche getan, aber es ist zu ähnlich, so dass ich es nicht posten werde. Ich denke, es ist akzeptabel, das Lambda wegzulassen, was Ihnen y=~/#{[*x.chars]*".*"}/(23 Zeichen) einbringen würde. Prost!
Patrick Oscity
1
oder sogar y=~/#{x.split("")*".*"}/(21 Zeichen) :)
Patrick Oscity
@padde Der Split ist eigentlich 24 Zeichen.
Howard
1
Entschuldigung, ich schätze, ich habe versehentlich y=~
aufgehört,
Meine Version ist 2 Zeichen kürzer.
Hauleth
7

Haskell, 51 37

h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y

Vielen 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:

GHCi> :{
GHCi| zipWith (%) [""   , "z00", "z00" , "anna"  , "Anna"]
GHCi|             ["z00", "z00", "00z0", "banana", "banana"]
GHCi| :}
[True,True,False,True,False]
hörte auf, sich gegen den Uhrzeigersinn zu drehen
quelle
Da die leere Liste kleiner ist als jede andere Liste, können Sie die Basisfälle zu vereinfachen 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). Dies h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
reduziert
6

Python (48 Zeichen)

import re;s=lambda x,y:re.search('.*'.join(x),y)

Gleicher Ansatz wie Howards Ruby-Antwort. Schade, dass Python das Regex-Paket und dessen "ausführliche" Informationen importieren muss lambda. :-)

Eric
quelle
1
Ich stimme zu, Lambda ist wortreich.
CalculatorFeline
4

Python, 59 Zeichen

def s(x,y):
 for c in y:
  if x:x=x[c==x[0]:]
 return x==""

Ich dachte, meine Antwort würde sich besser in Python ausdrücken lassen.

Bearbeiten: Vorschläge von res hinzugefügt.

Gareth
quelle
Sicher gegeben x="a"und y="ab"Sie würden die Schleife mit verlassen y=="b"und zurückkehren false?
Peter Taylor
@PeterTaylor Ja, bemerkte ich , als ich die Beispiele als Tests nach Entsendung lief , dass ich gemischt xund nach yoben. In meinen Funktionen ymuss eine Folge von sein x. Ich denke, ich sollte sie ändern, um Verwirrung zu vermeiden.
Gareth
Sie können diese bis zu 59 Zeichen erhalten: 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.)
res
@res Danke, Python ist keine Sprache, die ich viel benutze, wie Sie wahrscheinlich sagen können. Schönes Golfen. (63 Zeichen laut Codegolf-User-Skript - es müssen die Zeilenumbrüche gezählt werden).
Gareth
1
Sie können das erweiterte Slicing verwenden, um sich gegen das x-Sein zu schützen ''und mehrere Zeichen zu speichern, indem Sie Folgendes schreiben:x=x[c==x[0:1]:]
Nolen Royalty
4

GolfScript (22 Zeichen)

X[0]+Y{1$(@={\}*;}/0=!

Geht davon aus, dass die Eingabe als zwei vordefinierte Variablen genommen wird Xund Y, obwohl das eher ungewöhnlich in GolfScript ist. Blätter 1für wahr oder 0falsch auf dem Stapel.

Peter Taylor
quelle
4

C (52 Zeichen)

s(char*x,char*y){return!*x||*y&&s(*x-*y?x:x+1,y+1);}

Testfälle

Peter Taylor
quelle
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
l4m2
4

Burlesque (6 Zeichen)

6 Zeichen in Burlesque: R@\/~[ (Angenommen, x und y sind auf dem Stapel. Sehen Sie hier in Aktion.)

mroman
quelle
3

PHP, 90 Zeichen

<?function s($x,$y){while($a<strlen($y))if($y[$a++]==$x[0])$x=substr($x,1);return $x=="";}
Gareth
quelle
Sie können die ifAussage entfernen und zu vereinfachen $x=substr($x,$y[$a++]==$x[0]): ideone.com/Ch9vK
mellamokb
Auch hier ist eine etwas kürzere 82-Zeichen-Lösung mit Rekursion: ideone.com/IeBns
mellamokb
3

Scala 106:

def m(a:String,b:String):Boolean=(a.size==0)||((b.size!=0)&&((a(0)==b(0)&&m(a.tail,b.tail))||m(a,b.tail)))
Benutzer unbekannt
quelle
3

CoffeeScript 112 100 95 89

Mein erster Versuch, Code Golf zu spielen ... hoffe, ich schäme meine Familie nicht!

z=(x,y)->a=x.length;return 1if!a;b=y.indexOf x[0];return 0if!++b;z x[1..a],y[b..y.length]

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

Johno
quelle
Noch ein paar Zeichen eliminiert werden wie folgt (dies in einem Kommentar nicht richtig angezeigt wird, aber ich denke , man kann sehen , was ich meine): 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.)
res
a.lengthwird nie negativ sein, so dass Sie ein Zeichen mehr durch Ersetzen sparen if a==0mit if a<1. Ich weiß nicht, wie die Tokenisierung von CoffeeScript funktioniert, aber wenn sie if0zwei Token enthält, können Sie zwei weitere sparen, indem Sie beide Bedingungen umkehren (dh if1>a).
Peter Taylor
Gute Argumente. if1>aist nicht gültig, aber if!aist und ist ein Zeichen kürzer! Ich erkennen auch , dass ich ein zusätzliches Zeichen Umwandlung rasieren könnte b+1zu bund Erhöhen sie in der vorhergehenden Zeile, auch die Herstellung desselben ifTrick möglich , da es mit einer 0 / nicht-0 Situation zu tun war.
Johno
3

C #, 70 113 107 90 Zeichen

static bool S(string x,string y){return y.Any(c=>x==""||(x=x.Remove(0,c==x[0]?1:0))=="");}
Mizer
quelle
6
Sucht diese nicht nach einer Teilzeichenfolge statt nach einer Teilsequenz?
Gareth
Ja, ich habe falsch gelesen. Sollte jetzt behoben sein.
Mizer
1
So unterhaltsam Linq auch ist, ich denke, Sie können 10% sparen, indem Sie stattdessen die Rekursion verwenden.
Peter Taylor
Hier ist mein bester Versuch. Noch länger 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));}
Mizer
Sie können die rekursive x==""||y!=""&&S(...)Version auf reduzieren , sie ist jedoch immer noch länger als die aktualisierte Linq-Version. Gute Verwendung von Any!
Peter Taylor
3

Mathematica 19 17 27

LongestCommonSequenceGibt die längste nicht zusammenhängende Folge von zwei Zeichenfolgen zurück. (Nicht zu verwechseln mit LongestCommonSubsequenceder 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.)

LongestCommonSequence@##==#& 

Beispiele

LongestCommonSequence@## == # &["", "z00"]
LongestCommonSequence@## == # &["z00", "z00"]
LongestCommonSequence@## == # &["anna", "banana"]
LongestCommonSequence@## == # &["Anna", "banana"]

Richtig Richtig Richtig Falsch

Der kritische Test ist der dritte, weil "anna" nicht zusammenhängend in "banana" enthalten ist.

DavidC
quelle
3

Python 3.8 (Vorabversion) , 42 Byte

lambda a,b:''in[a:=a[a[:1]==c:]for c in b]

Probieren Sie es online!

Python 3.8 (Vorabversion) , 48 Byte

lambda a,b,j=0:all((j:=1+b.find(c,j))for c in a)

Probieren Sie es online!

Python 2 , 48 Bytes

lambda a,b:re.search('.*'.join(a),b)>0
import re

Probieren Sie es online!

Abgeschrieben von dieser Antwort von Lynn . Das >0kann weggelassen werden, wenn nur die Wahrheits- / Falschausgabe in Ordnung ist.

Python 2 , 50 Bytes

f=lambda a,b:b and f(a[a[:1]==b[0]:],b[1:])or''==a

Probieren Sie es online!

Python 2 , 50 Bytes

lambda a,b:reduce(lambda s,c:s[c==s[:1]:],b,a)==''

Probieren Sie es online!

xnor
quelle
Gute Verwendung des Walross.
Jonathan Allan
2

C - 74 71 64

Dies 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)

main(int c,char**v){for(;*v[1]!=0;++v[1])v[2]+=*v[1]==*v[2];return*v[2];}

main(int c,char**v){for(;*v[1];++v[1])v[2]+=*v[1]==*v[2];return*v[2];}


main(c,v)char**v;{while(*v[1])v[2]+=*v[1]++==*v[2];return*v[2];}

Und ungolfed:

main(int argc, char** argv){
   char * input = argv[1];
   char * test  = argv[2];

   // advance through the input string. Each time the current input
   // character is equal to the current test character, increment
   // the position in the test string.

   for(; *input!='\0'; ++input) test += *input == *test;

   // return the character that we got to in the test string.
   // if it is '\0' then we got to the end of the test string which
   // means that it is a subsequence, and the 0 (EXIT_SUCCESS) value is returned
   // otherwise something non-zero is returned, indicating failure.
   return *test;
}

Zum Testen können Sie Folgendes tun:

./is_subsequence banana anna && echo "yes" || echo "nope"    
# yes
./is_subsequence banana foobar && echo "yes" || echo "nope"    
# nope
Gordon Bailey
quelle
!=0in 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.
Peter Taylor
Verdammt, das !='\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.
Gordon Bailey
@ Gordon Bailey Entschuldigung für die Beule, aber ich habe ein paar Änderungen an einer kürzeren Version vorgenommen.
Oldrinb
2

Python, 66 62 59 58 Zeichen

Irgendwie eine lustige Lösung, definitiv ein ordentliches Problem.

def f(n,h,r=0):
 for c in h:r+=n[r:r+1]==c
 return r==len(n)
Nolen Royalty
quelle
2

Ruby 32 30 28

f=->a,b{b.match a.tr'','.*'}

Dies gibt eine MatchDataInstanz zurück, wenn aeine Folge von boder auf nilandere Weise vorliegt.

Alte Version, die Teilzeichenfolge anstelle von Teilzeichenfolge findet

Rubin 15

f=->a,b{!!b[a]}

Wenn Sie eine String#[](str)Methode verwenden, die zurückgibt, strwenn stres sich um eine Teilzeichenfolge von selfund handelt, !!um zurückzugeben, Booleanwenn der zurückgegebene Wert als boolescher Wert verwendet werden kann (und dies nicht sein muss trueoder false), können es nur 13 Zeichen sein:

f=->a,b{b[a]}

Es wird zurückgegeben, nilwenn aes sich nicht um eine Teilzeichenfolge von handelt b.

Holeth
quelle
2
Schön, aber die Frage fragt nach einer Subsequenz und nicht nach einer Teilzeichenfolge.
Gareth
2

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:

25 ?- sublist("","z00").
true.

26 ?- sublist("z00","z00").
true .

27 ?- sublist("z00","00z0").
false.

28 ?- sublist("aa","anna").
true .

29 ?- sublist("anna","banana").
true .

30 ?- sublist("Anna","banana").
false.

Die Byteanzahl kann technisch gesehen 0 sein, da hier nur abgefragt wird, ähnlich wie wir ein Programm ausführen und Eingaben an dieses senden.

n̴̖̋h̴̖̋ã̷͉h̷̭̿d̷̰̀ĥ̷̳
quelle
2

PHP, 41 Bytes

Gibt 1 für wahr und nichts für falsch aus

<?=!levenshtein($argv[1],$argv[2],0,1,1);

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

<?=preg_match(_.chunk_split($argv[1],1,".*")._,$argv[2]);

Probieren Sie es online!

Jörg Hülsermann
quelle
1
-2 Bytes: Führend .*ist nicht erforderlich. -2 Bytes DO NOT assign $argvzu $a. +24 Bytes: Erfordert array_map(preg_quote())Sonderzeichen (verwenden Sie Klammern als Begrenzer, um den zweiten preg_quoteParameter zu vermeiden .)
Titus
2
@Titus das führende. * Ist notwendig für die Eingabe einer leeren Zeichenkette und für die Eingabe darf ich nur eine möglicherweise leere alphanumerische Zeichenkette mit Groß- und Kleinschreibung behandeln. Mit dem Zitat liegen Sie richtig, wenn es Sonderzeichen gibt. Danke, dass du die Aufgabe gezählt hast. Kopieren und Einfügen durch eine frühere Lösung und nicht darüber nachdenken
Jörg Hülsermann
1
preg_matchwird 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(...)).
Titus
1
Aber dann ist die Eingabe garantiert alphanumerisch .*.
Titus
2

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⊆Yist 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. oder false.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.

Nicht verwandte Zeichenfolge
quelle
1

CoffeeScript 73

Hier ist eine alternative CoffeeScript-Antwort, bei der reguläre Ausdrücke anstelle von Rekursionen verwendet werden:

z=(x,y)->a='.*';a+=c+'.*'for c in x;b=eval('/'+a+'/');(y.replace b,'')<y

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 xundy 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).

Johno
quelle
1

PowerShell, 38

$args[1]-clike($args[0]-replace'','*')

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 ...

Joey
quelle
1

Eine Art Anti-Lösung, die alle Teilfolgen von Y erzeugt:

Python 93

l=len(y)
print x in[''.join(c for i,c in zip(bin(n)[2:].rjust(l,'0'),y)if i=='1')for n in range(2**l)]
daniero
quelle
1

APL (31)

In APL fehlt es etwas an der String-Behandlung.

{(⊂'')∊N←⍵↓⍨¨1,⍨=/⊃¨⍵:~×⍴⊃N⋄∇N}

Verwendung:

      {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⊃: ~ × ⍴⊃N⋄∇N} 'anna' 'banane'
1
      {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⊃: ~ × ⍴⊃N⋄∇N} 'Anna' 'Banane'
0
      {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⊃: ~ × ⍴⊃N⋄∇N} '' 'Banane'
1
Marinus
quelle
1

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.

def f(i):
    s=x;j=0
    while j<len(s):t=~i%2;s=[s[:j]+s[j+1:],s][t];j+=t;i>>=1
    return s==y
print True in map(f,range(1,2**len(x)))
scleaver
quelle
1

Python - 72

def f(a,b):
 c=len(a)
 for i in b:a=a.replace(i,"",1)
 print len(a+b)==c
Codierung Mann
quelle
1

Python ( 75 52)

s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])

Einfache rekursive Lösung. Das erste Mal Golf spielen, also sind alle Tipps zum Abschwächen sehr willkommen :)

Getestet mit:

assert s('anna', 'banana') == True
assert s('oo0', 'oFopp0') == True
assert s 'this', 'this is a string') == True
assert s('that', 'this hat is large') == True
assert s('cba', 'abcdefg') == False

Vielen Dank an @lirtosiast für einige clevere boolesche Tricks.

Foslock
quelle
1
Sie können dies auf 52 Zeichen s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
reduzieren
Danke, das ist klug und verwendet den Booleschen
Wert
1

PHP, 75 65 64 Bytes

for(;$p=@strpos(_.$argv[2],$c=$argv[1][$i++],$p+1););echo""==$c;

Nimmt Eingaben von Befehlszeilenargumenten entgegen. druckt 1für wahr, leere Zeichenfolge für falsch. Laufen Sie mit -r.

Erläuterung:

  • strposzurückkehrt , falsewenn Nadel $cnicht im Heuhaufen ist $argv[2](nach der Position $p),
    wodurch die Schleife zu durchbrechen.
  • strposkehrt auch falsefür eine leere Nadel zurück und unterbricht die Schleife am Ende von $argv[1].
  • Wenn $argv[1]eine Untersequenz von ist $argv[2], $cist diese leer, wenn die Schleife unterbrochen wird.
  • strposmuss Warnung @unterdrücken Empty needle.
Titus
quelle
+$pstattdessen $p+1ist der Unterstrich nicht mehr nötig
Jörg Hülsermann
@ JörgHülsermann +1wird benötigt, um im Heuhaufen voranzukommen; und der Unterstrich vermeidet die $p=-1Initialisierung. Aber ... ich kann es vermeiden false!==.
Titus
1

Swift, 27

print(Y.range(of:X) != nil)
Dimitrie-Toma Furdui
quelle
Willkommen bei PPCG!
Martin Ender