Czy łańcuch X jest podciągiem łańcucha Y?

23

Biorąc pod uwagę łańcuchy X i Y, określ, czy X jest podsekwencją Y. Pusty łańcuch jest traktowany jako podsekwencja każdego łańcucha. (Np. ''I 'anna'są podsekwencjami 'banana'.)

Wkład

  • X, być może pusty ciąg alfanumeryczny z rozróżnianiem wielkości liter
  • Y, być może pusty ciąg alfanumeryczny z rozróżnianiem wielkości liter

Wydajność

  • Prawda czy fałsz (lub odpowiedniki), poprawnie wskazując, czy X jest podsekwencją Y.

Przykłady we / wy

X      Y        output

''     'z00'    True
'z00'  'z00'    True 
'z00'  '00z0'   False
'aa'   'anna'   True
'anna' 'banana' True
'Anna' 'banana' False

Kryteria

  • Najkrótszy program wygrywa, zgodnie z liczbą bajtów kodu źródłowego.

Przykładowe programy

res
źródło
1
Dlaczego „anna” jest substratem „banana”?
kaoD
4
@kaoD - annajest podciągiem (ale nie podciągiem) banana. Łańcuch X jest podsekwencją łańcucha Y tylko wtedy, gdy X można uzyskać z Y poprzez usunięcie zera lub więcej elementów Y; na przykład usuwając ba drugi az bananadaje anna.
res
2
Ma to jedno rozwiązanie w każdym języku skryptowym, oferujące wyrażenia regularne, które są zarówno trywialne, jak i niemożliwe do dalszego grania w golfa.
Joey,

Odpowiedzi:

18

Perl 5 , 17 bajtów (+1?), Pełny program

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

Wypróbuj online!

Wywołaj pflagę do interpretera perla, jak w perl -pe 's//.*/g;$_=<>=~$_'. Zgodnie z ustalonymi regułami punktacji, kiedy to wyzwanie zostało pierwotnie opublikowane , ta flaga kosztuje jeden dodatkowy bajt. Zgodnie z nowszymi zasadami , AFAICT, może być bezpłatny.

Tak czy inaczej, ciągi wejściowe powinny być dostarczane w osobnych liniach zakończonych znakiem nowej linii na standardowym wejściu. Wyjście (na standardowe wyjście) będzie, 1jeśli pierwszy ciąg wejściowy jest podciągiem drugiego, lub w ogóle nic, jeśli nie jest.

Zauważ, że obie linie wejściowe muszą mieć na końcu nową linię, w przeciwnym razie program nie będzie działał poprawnie. Alternatywnie możesz dodać lflagę wiersza poleceń do wywołania, aby perl usunął nowe linie; w zależności od obowiązujących reguł punktacji może to kosztować jeden dodatkowy bajt lub nie. Zauważ, że użycie tej flagi spowoduje również dodanie nowego wiersza do wyniku.

Wersja oryginalna (fragment, 18 bajtów / znaków)

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

Dane wejściowe są podawane w zmiennych, $xa $ywynikiem jest wartość wyrażenia (w kontekście skalarnym). Uwaga, która $xjest modyfikowana w procesie. (Tak, wiem, że użycie $_zamiast $xpozwoli mi zaoszczędzić cztery znaki, ale zrobienie tego we fragmencie, który wydaje mi się zbyt tandetny).

Jak to działa?

Pierwsza część $x=~s//.*/gwstawia ciąg znaków .*między każdym znakiem $x. Druga część, $y=~$xtraktuje $xjako wyrażenie regularne i dopasowuje się $ydo niego. W wyrażeniach regularnych Perl .*dopasowuje zero lub więcej dowolnych znaków, podczas gdy wszystkie znaki alfanumeryczne wygodnie pasują do siebie.

Ilmari Karonen
źródło
Zgodnie z naszym (nowym?) Konsensusem, zgłoszenia muszą być programem lub funkcją, a nie fragmentem kodu. Jeśli przesłanie nie spełnia tego warunku, rozważ jego edycję.
user202729,
@ user202729: To wyzwanie jest znacznie starsze niż ten konsensus, więc jeśli nie zakłada się, że zastosuje się je z mocą wsteczną, odpowiedzi w tym wątku powinny prawdopodobnie zostać „włączone”. To powiedziawszy, dodałem właśnie wersję zgodną z obowiązującymi zasadami i może nawet być o jeden bajt / char krótszy (zwróć uwagę, że liczenie oparte na bajtach jest również nowsze niż to wyzwanie, AFAIK), w zależności od sposobu liczenia przełączników wiersza polecenia.
Ilmari Karonen
9

Ruby, 32 znaki

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

To rozwiązanie zwraca, niljeśli xnie jest to podsekwencja, ya liczba jest inna (tj. Rubinowe odpowiedniki falsei true). Przykłady:

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
źródło
1
Zrobiłem w zasadzie to samo, ale jest zbyt podobne, więc nie opublikuję tego. myślę, że dopuszczalne jest pominięcie lambda, co pozostawiłoby cię z y=~/#{[*x.chars]*".*"}/(23 znakami). Twoje zdrowie!
Patrick Oscity,
1
a nawet y=~/#{x.split("")*".*"}/(21 znaków) :)
Patrick Oscity
@padde Podzielony ma w rzeczywistości 24 znaki.
Howard
1
przepraszam, chyba przypadkowo y=~
przestałem
Moja wersja jest o 2 znaki krótsza.
Hauleth,
7

Haskell, 51 37

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

Dzięki Hammar za znaczną poprawę. Jest to teraz funkcja poprawki, ale wydaje się, że nie ma powodu, dla którego nie powinna.

Demonstracja:

GHCi> :{
GHCi| zipWith (%) [""   , "z00", "z00" , "anna"  , "Anna"]
GHCi|             ["z00", "z00", "00z0", "banana", "banana"]
GHCi| :}
[True,True,False,True,False]
przestał się obracać w lewo
źródło
Ponieważ pusta lista jest mniejsza niż jakakolwiek inna lista, możesz uprościć przypadki podstawowe s x y=x<=y. Możesz także zaoszczędzić jeszcze kilka, czyniąc go operatorem i używając @-pattern zamiast (f:l). To skraca do 37 znaków:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
hammar,
6

Python (48 znaków)

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

Takie samo podejście jak odpowiedź Ruby Howarda. Szkoda, że ​​Python musi zaimportować pakiet wyrażeń regularnych i jego „szczegółowe” lambda. :-)

Eric
źródło
1
Zgadzam się, lambda jest pełna.
CalculatorFeline
4

Python, 59 znaków

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

Uznałem, że moja odpowiedź będzie lepiej wyrażona w Pythonie.

Edycja: Dodano sugestie res.

Gareth
źródło
Na pewno dane, x="a"a y="ab"wyjdziesz z pętli y=="b"i wrócisz false?
Peter Taylor,
@PeterTaylor Tak, zauważyłem, kiedy został uruchomiony przykłady jak testy po delegowania, że mam mieszane xi ydo góry. W moich funkcjach ymusi być podsekwencja x. Myślę, że powinienem je zmienić, aby uniknąć nieporozumień.
Gareth,
Można dostać to w dół do 59 znaków: def s(x,y): for c in y: if x:x=x[c==x[0]:] return x=="". Nie wyświetla się poprawnie w komentarzu, ale myślę, że rozumiesz, co mam na myśli. (Również jedno dodane miejsce wystarczy, aby zwiększyć poziom wcięcia.)
res
@res Dzięki, Python nie jest językiem, którego używam, jak zapewne wiesz. Niezła gra w golfa. (63 znaki według skryptu użytkownika Codegolf - musi liczyć nowe znaki).
Gareth,
1
Możesz użyć rozszerzania krojenia, aby uchronić się przed byciem x ''i zaoszczędzić kilka znaków, piszącx=x[c==x[0:1]:]
Nolen Royalty
4

GolfScript (22 znaki)

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

Zakłada się, że dane wejściowe są traktowane jako dwie predefiniowane zmienne Xi Ychociaż jest to dość niezwykłe w GolfScript. Pozostawia na stosie wartość 1prawda lub 0fałsz.

Peter Taylor
źródło
4

C (52 znaki)

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

Przypadki testowe

Peter Taylor
źródło
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
l4m2
4

Burleska (6 znaków)

6 znaków w Burlesce: R@\/~[ (zakładając, że xiy znajdują się na stosie. Zobacz tutaj w akcji.)

mroman
źródło
3

PHP, 90 znaków

<?function s($x,$y){while($a<strlen($y))if($y[$a++]==$x[0])$x=substr($x,1);return $x=="";}
Gareth
źródło
Możesz usunąć ifoświadczenie i uprościć $x=substr($x,$y[$a++]==$x[0]): ideone.com/Ch9vK
mellamokb
Również tutaj jest nieco krótsze 82-znakowe rozwiązanie z rekurencją: 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)))
nieznany użytkownik
źródło
3

CoffeeScript 112 100 95 89

Moja pierwsza próba golfa kodowego ... mam nadzieję, że nie zawstydzę mojej rodziny!

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]

Edycja : okazuje się, że Coffeescript jest bardziej wybaczający niż myślałem z białymi znakami.

Podziękowania dla res i Petera Taylora za kilka wskazówek, dzięki którym będzie trochę bardziej elegancki

Johno
źródło
Jeszcze kilka znaków można wyeliminować w następujący sposób (nie wyświetla się w komentarzu, ale myślę, że można zobaczyć, co mam na myśli) 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]. (W niektórych przeglądarkach, np. Chrome, można poprawnie wyświetlić kod komentarza, klikając prawym przyciskiem myszy, a następnie Sprawdź element.)
res
a.lengthnigdy nie będzie negatywny, więc możesz uratować jeszcze jedną postać, zastępując if a==0if a<1. Nie wiem, jak działa tokenizacja CoffeeScript, ale jeśli leksuje if0jako dwa tokeny, możesz zapisać dwa kolejne, odwracając oba warunki (tj if1>a.).
Peter Taylor,
Słuszne uwagi. if1>anie jest ważny, ale if!ajest i jest postacią krótszą! Uświadomiłem sobie również, że mogę ogolić dodatkową postać, przekształcając b+1bi zwiększając ją w poprzedniej linii, co również umożliwia tę samą ifsztuczkę, ponieważ dotyczy sytuacji 0/0.
Johno
3

C #, 70 113 107 90 znaków

static bool S(string x,string y){return y.Any(c=>x==""||(x=x.Remove(0,c==x[0]?1:0))=="");}
mizer
źródło
6
Czy to nie szuka podciągów zamiast podciągów?
Gareth,
tak, źle odczytałem. Powinien zostać teraz naprawiony.
mizer
1
Choć Linq jest tak zabawny, myślę, że możesz zaoszczędzić 10%, używając zamiast tego rekurencji.
Peter Taylor,
Oto moja najlepsza próba. Jeszcze dłużej. 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
Możesz zredukować rekursywny do x==""||y!=""&&S(...), ale wciąż jest dłuższy niż zaktualizowana wersja Linq. Niezłe wykorzystanie Any!
Peter Taylor,
3

Matematyka 19 17 27

LongestCommonSequencezwraca najdłuższą nieciągłą podsekwencję dwóch łańcuchów. (Nie mylić z tym LongestCommonSubsequence, co zwraca najdłuższą ciągłą podsekwencję.

Poniższe sprawdza, czy najdłuższy ciągły podciąg jest pierwszym z dwóch ciągów. (Więc musisz wprowadzić krótszy ciąg, a następnie większy ciąg).

LongestCommonSequence@##==#& 

Przykłady

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

Prawda Prawda Prawda Fałsz

Krytyczny test jest trzeci, ponieważ „anna” jest zawarta niejednoznacznie w „bananie”.

DavidC
źródło
3

Python 3.8 (wersja wstępna) , 42 bajty

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

Wypróbuj online!

Python 3.8 (wersja wstępna) , 48 bajtów

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

Wypróbuj online!

Python 2 , 48 bajtów

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

Wypróbuj online!

Skopiowano z tej odpowiedzi Lynn . >0Mogą być pominięte, jeśli tylko truthy / falsey wyjście jest OK.

Python 2 , 50 bajtów

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

Wypróbuj online!

Python 2 , 50 bajtów

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

Wypróbuj online!

xnor
źródło
Świetne wykorzystanie morsa.
Jonathan Allan
2

C - 74 71 64

To nie jest lepsze niż rozwiązanie Petera Taylora, ale myślę, że to całkiem zabawne (plus, to kompletny działający program, a nie tylko funkcja)

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];}

I bez golfa:

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;
}

Aby to przetestować, możesz zrobić coś takiego:

./is_subsequence banana anna && echo "yes" || echo "nope"    
# yes
./is_subsequence banana foobar && echo "yes" || echo "nope"    
# nope
Gordon Bailey
źródło
!=0w pewnych warunkach jest trochę gadatliwy ... Funkcja kontra program jest czymś, co pytanie musi jasno określić, a tutaj nie, więc odpowiedzi mają różne opcje.
Peter Taylor
Cholera, !='\0'to zły (dobry?) Nawyk pisania kodu nie golfowego. Pozwoliłem sobie na to w ostatnich dwóch rundach golfa, w przyszłości będę musiał bardziej uważać. Jeśli chodzi o program kontra funkcja, tak, masz absolutną rację.
Gordon Bailey,
@ GordonBailey przepraszam za guz, ale wprowadziłem kilka zmian w krótszej wersji.
oldrinb
2

Pyton, 66 62 59 58 znaków

To zabawne rozwiązanie, zdecydowanie fajny problem.

def f(n,h,r=0):
 for c in h:r+=n[r:r+1]==c
 return r==len(n)
Nolen Royalty
źródło
2

Rubinowy 32 30 28

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

Zwróci MatchDatainstancję, jeśli ajest to podsekwencja blub w nilinny sposób.

Stara wersja, która zamiast podciągów znajduje podciąg

Rubin 15

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

Używając String#[](str)metody, która zwraca strif strjest podciągiem selfi !!zwraca, Booleanjeśli zwracana wartość może być użyta jako boolean (i nie musi być truelub false), to może być tylko 13 znaków:

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

Zwróci, niljeśli anie jest podciągiem b.

Hauleth
źródło
2
Fajnie, ale pytanie wymaga raczej podciągów niż podciągów.
Gareth,
2

SWI-Prolog, SICStus

Wbudowana sublist predykatu / 2 SICStus sprawdza, czy wszystkie elementy z pierwszej listy pojawiają się również na drugiej liście. Ten predykat jest również dostępny w SWI-Prolog za pośrednictwem biblioteki kompatybilności, którą można załadować za pomocą zapytania [library(dialect/sicstus/lists)]..

Przykładowy przebieg:

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.

Liczba bajtów może technicznie wynosić 0, ponieważ wszystko, co tutaj robimy, to zapytania, podobnie jak uruchamiamy program i dostarczamy do niego dane wejściowe.

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
źródło
2

PHP, 41 bajtów

drukuje 1 za prawdę i nic za fałsz

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

Jeśli wykonano tylko wstawienia od słowa 1 do słowa 2, w prawdziwych przypadkach liczba wynosi zero

lewenshtein

Wypróbuj online!

PHP, 57 bajtów

wypisuje 1 dla true i 0 dla false

Tworzy Regex

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

Wypróbuj online!

Jörg Hülsermann
źródło
1
-2 bajty: przewodzenie .*jest niepotrzebne. -2 bajty: nie przypisuj $argvdo $a. +24 bajty: potrzeba array_map(preg_quote())znaków specjalnych (użyj nawiasów jako ograniczników, aby uniknąć drugiego preg_quoteparametru.)
Tytus
2
@Titus wiodący. * Jest niezbędny do wprowadzenia pustego ciągu, a do wejścia muszę obsługiwać tylko możliwie pusty ciąg alfanumeryczny z rozróżnianiem wielkości liter. Masz rację z cytatem, jeśli są znaki specjalne. Dziękujemy za policzenie zadania. Skopiuj i wklej wcześniejsze rozwiązanie i nie myśl o tym
Jörg Hülsermann
1
preg_matchnie będzie narzekać na puste wyrażenie regularne, dopóki ograniczniki będą dostępne. Po prostu pasuje do wszystkiego. Ale preg_quote jest tylko +22 bajtów, a nie +24: array_map(preg_quote,str_split(...)).
Tytus
1
Ale wtedy dane wejściowe są gwarantowane alfanumerycznie :) Ale nadal nie potrzebujesz wiodących .*.
Tytus
2

Brachylog , 2 bajty

⊆ᵈ

Wypróbuj online!

Podobnie jak w przypadku tej odpowiedzi, jest wbudowanym predykatem, który deklaruje związek między zmiennymi wejściowymi i wyjściowymi, i jest meta-predykatem, który modyfikuje go, aby zadeklarować tę samą relację między pierwszym i drugim elementem zmiennej wejściowej (i ujednolicić zmienna wyjściowa z drugim elementem, ale ponieważ jest to problem decyzyjny, który nie ma tutaj znaczenia). X⊆Yjest twierdzeniem, że X jest podsekwencją Y, dlatego tak jest [X,Y]⊆ᵈ.

Ten predykat (który jest generowany przez sukces lub niepowodzenie, który jest drukowany true.lub false.gdy jest uruchamiany jako program) przyjmuje dane wejściowe jako listę dwóch ciągów. Jeśli wprowadzanie danych jest nieco bardziej elastyczne ...

Brachylog , 1 bajt

Wypróbuj online!

Pobiera ciąg X jako zmienną wejściową, a ciąg Y jako zmienną wyjściową. Wynika z sukcesu lub porażki, jak poprzednio. Jeśli działa jako pełny program, X jest podawany jako dane wejściowe, a Y jako pierwszy argument wiersza poleceń.

Niepowiązany ciąg
źródło
1

CoffeeScript 73

Oto alternatywna odpowiedź CoffeeScript z użyciem wyrażeń regularnych zamiast rekurencji:

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

Jeśli stóg siana pasuje do bardzo chciwego wyrażenia regularnego zbudowanego z igły, zostanie zastąpiony pustym ciągiem. Jeśli stóg siana jest krótszy niż się zaczął, igła była podsekwencją.

Zwraca wartość false, gdy xiy to zarówno pustych strun. Pomyśl, że potrzebujemy filozofa, który powie nam, czy pusty łańcuch jest podsekwencją samego siebie!

(Wysłany jako oddzielna odpowiedź od mojej poprzedniej, ponieważ wydaje się wystarczająco inny, aby to uzasadnić).

Johno
źródło
1

PowerShell, 38

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

Oczywiście każde takie rozwiązanie oparte na wyrażeniach regularnych lub wzorcach ma poważne problemy z wydajnością przy dłuższych ciągach. Ale ponieważ kryterium stanowi krótkość ...

Joey
źródło
1

Rodzaj anty-rozwiązania generującego wszystkie podsekwencje Y:

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
źródło
1

APL (31)

Trochę brakuje obsługi ciągów w APL.

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

stosowanie:

      {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} „anna” „banana”
1
      {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} „Anna” „banana”
0
      {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} '' 'banana'
1
marinus
źródło
1

Python 132

Podobne do Daniero's. Nie jest to najłatwiejsze rozwiązanie, ale fajnie było spróbować. Jestem nowy w Pythonie, więc jestem pewien, że mógłbym go skrócić, gdybym wiedział trochę więcej.

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
źródło
1

Python - 72

def f(a,b):
 c=len(a)
 for i in b:a=a.replace(i,"",1)
 print len(a+b)==c
Kodowanie człowieka
źródło
1

Python ( 75 52)

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

Proste rozwiązanie rekurencyjne. Po raz pierwszy gra w golfa, więc wszelkie wskazówki dotyczące zmniejszania tego są bardzo mile widziane :)

Testowane z następującymi:

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

Dzięki @lirtosiast za kilka sprytnych sztuczek boolowskich.

foslock
źródło
1
Możesz sprowadzić to do 52 znaków:s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
lirtosiast
Dzięki, to sprytne, używając boolean jako indeksu 0/1 w
splocie
1

PHP, 75 65 64 bajtów

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

pobiera dane wejściowe z argumentów wiersza poleceń; wypisuje 1dla true, pusty łańcuch dla false. Uruchom z -r.

wyjaśnienie:

  • strposzwraca, falsejeśli igła $cnie znajduje się w stogu siana $argv[2](po pozycji $p),
    co powoduje przerwanie pętli.
  • strposzwraca falsetakże pustą igłę, przerywając pętlę na końcu$argv[1] .
  • Jeśli $argv[1]jest podsekwencją $argv[2], $cbędzie puste, gdy pęka pętla.
  • strposmusi @ukryć Empty needleostrzeżenie.
Tytus
źródło
+$pzamiast $p+1tego nie ma potrzeby podkreślenia
Jörg Hülsermann
@ JörgHülsermann +1jest potrzebny, aby przejść w łańcuchu stogu siana; podkreślenie unika $p=-1inicjalizacji. Ale ... mogę tego uniknąć false!==.
Tytus
1

Szybki, 27

print(Y.range(of:X) != nil)
Dimitrie-Toma Furdui
źródło
Witamy w PPCG!
Martin Ender