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
- Kilka programów, które można dostosować, znajduje się w tej powiązanej publikacji .
anna
jest 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ącb
a drugia
zbanana
dajeanna
.Odpowiedzi:
Perl 5 , 17 bajtów (+1?), Pełny program
Wypróbuj online!
Wywołaj
p
flagę do interpretera perla, jak wperl -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,
1
jeś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ć
l
flagę 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)
Dane wejściowe są podawane w zmiennych,
$x
a$y
wynikiem jest wartość wyrażenia (w kontekście skalarnym). Uwaga, która$x
jest modyfikowana w procesie. (Tak, wiem, że użycie$_
zamiast$x
pozwoli 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//.*/g
wstawia ciąg znaków.*
między każdym znakiem$x
. Druga część,$y=~$x
traktuje$x
jako wyrażenie regularne i dopasowuje się$y
do niego. W wyrażeniach regularnych Perl.*
dopasowuje zero lub więcej dowolnych znaków, podczas gdy wszystkie znaki alfanumeryczne wygodnie pasują do siebie.źródło
Ruby, 32 znaki
To rozwiązanie zwraca,
nil
jeślix
nie jest to podsekwencja,y
a liczba jest inna (tj. Rubinowe odpowiednikifalse
itrue
). Przykłady:źródło
y=~/#{[*x.chars]*".*"}/
(23 znakami). Twoje zdrowie!y=~/#{x.split("")*".*"}/
(21 znaków) :)y=~
Haskell,
5137Dzięki Hammar za znaczną poprawę. Jest to teraz funkcja poprawki, ale wydaje się, że nie ma powodu, dla którego nie powinna.
Demonstracja:
źródło
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
Python (48 znaków)
Takie samo podejście jak odpowiedź Ruby Howarda. Szkoda, że Python musi zaimportować pakiet wyrażeń regularnych i jego „szczegółowe”
lambda
. :-)źródło
Python, 59 znaków
Uznałem, że moja odpowiedź będzie lepiej wyrażona w Pythonie.
Edycja: Dodano sugestie res.
źródło
x="a"
ay="ab"
wyjdziesz z pętliy=="b"
i wróciszfalse
?x
iy
do góry. W moich funkcjachy
musi być podsekwencjax
. Myślę, że powinienem je zmienić, aby uniknąć nieporozumień.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.)''
i zaoszczędzić kilka znaków, piszącx=x[c==x[0:1]:]
GolfScript (22 znaki)
Zakłada się, że dane wejściowe są traktowane jako dwie predefiniowane zmienne
X
iY
chociaż jest to dość niezwykłe w GolfScript. Pozostawia na stosie wartość1
prawda lub0
fałsz.źródło
C (52 znaki)
Przypadki testowe
źródło
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
Burleska (6 znaków)
6 znaków w Burlesce:
R@\/~[
(zakładając, że xiy znajdują się na stosie. Zobacz tutaj w akcji.)źródło
C, 23:
wynik w * x
http://ideone.com/BpITZ
źródło
PHP, 90 znaków
źródło
if
oświadczenie i uprościć$x=substr($x,$y[$a++]==$x[0])
: ideone.com/Ch9vKScala 106:
źródło
CoffeeScript
1121009589Moja pierwsza próba golfa kodowego ... mam nadzieję, że nie zawstydzę mojej rodziny!
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
źródło
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.)a.length
nigdy nie będzie negatywny, więc możesz uratować jeszcze jedną postać, zastępującif a==0
jąif a<1
. Nie wiem, jak działa tokenizacja CoffeeScript, ale jeśli leksujeif0
jako dwa tokeny, możesz zapisać dwa kolejne, odwracając oba warunki (tjif1>a
.).if1>a
nie jest ważny, aleif!a
jest i jest postacią krótszą! Uświadomiłem sobie również, że mogę ogolić dodatkową postać, przekształcającb+1
jąb
i zwiększając ją w poprzedniej linii, co również umożliwia tę samąif
sztuczkę, ponieważ dotyczy sytuacji 0/0.C #,
7011310790 znakówźródło
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(...)
, ale wciąż jest dłuższy niż zaktualizowana wersja Linq. Niezłe wykorzystanieAny
!Matematyka
19 1727LongestCommonSequence
zwraca najdłuższą nieciągłą podsekwencję dwóch łańcuchów. (Nie mylić z tymLongestCommonSubsequence
, 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).
Przykłady
Prawda Prawda Prawda Fałsz
Krytyczny test jest trzeci, ponieważ „anna” jest zawarta niejednoznacznie w „bananie”.
źródło
Python 3.8 (wersja wstępna) , 42 bajty
Wypróbuj online!
Python 3.8 (wersja wstępna) , 48 bajtów
Wypróbuj online!
Python 2 , 48 bajtów
Wypróbuj online!
Skopiowano z tej odpowiedzi Lynn .
>0
Mogą być pominięte, jeśli tylko truthy / falsey wyjście jest OK.Python 2 , 50 bajtów
Wypróbuj online!
Python 2 , 50 bajtów
Wypróbuj online!
źródło
C -
74 7164To 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)I bez golfa:
Aby to przetestować, możesz zrobić coś takiego:
źródło
!=0
w 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.!='\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ę.Pyton,
66625958 znakówTo zabawne rozwiązanie, zdecydowanie fajny problem.
źródło
Rubinowy
323028Zwróci
MatchData
instancję, jeślia
jest to podsekwencjab
lub wnil
inny sposób.Stara wersja, która zamiast podciągów znajduje podciąg
Rubin 15
Używając
String#[](str)
metody, która zwracastr
ifstr
jest podciągiemself
i!!
zwraca,Boolean
jeśli zwracana wartość może być użyta jako boolean (i nie musi byćtrue
lubfalse
), to może być tylko 13 znaków:Zwróci,
nil
jeślia
nie jest podciągiemb
.źródło
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:
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.
źródło
PHP, 41 bajtów
drukuje 1 za prawdę i nic za fałsz
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
Wypróbuj online!
źródło
.*
jest niepotrzebne. -2 bajty: nie przypisuj$argv
do$a
. +24 bajty: potrzebaarray_map(preg_quote())
znaków specjalnych (użyj nawiasów jako ograniczników, aby uniknąć drugiegopreg_quote
parametru.)preg_match
nie 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(...))
..*
.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⊆Y
jest 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.
lubfalse.
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ń.
źródło
CoffeeScript 73
Oto alternatywna odpowiedź CoffeeScript z użyciem wyrażeń regularnych zamiast rekurencji:
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
x
iy
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ć).
źródło
PowerShell, 38
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ść ...
źródło
Rodzaj anty-rozwiązania generującego wszystkie podsekwencje Y:
Python 93
źródło
APL (31)
Trochę brakuje obsługi ciągów w APL.
stosowanie:
źródło
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.
źródło
Python - 72
źródło
Python (
7552)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:
Dzięki @lirtosiast za kilka sprytnych sztuczek boolowskich.
źródło
s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
PHP,
756564 bajtówpobiera dane wejściowe z argumentów wiersza poleceń; wypisuje
1
dla true, pusty łańcuch dla false. Uruchom z-r
.wyjaśnienie:
strpos
zwraca,false
jeśli igła$c
nie znajduje się w stogu siana$argv[2]
(po pozycji$p
),co powoduje przerwanie pętli.
strpos
zwracafalse
także pustą igłę, przerywając pętlę na końcu$argv[1]
.$argv[1]
jest podsekwencją$argv[2]
,$c
będzie puste, gdy pęka pętla.strpos
musi@
ukryćEmpty needle
ostrzeżenie.źródło
+$p
zamiast$p+1
tego nie ma potrzeby podkreślenia+1
jest potrzebny, aby przejść w łańcuchu stogu siana; podkreślenie unika$p=-1
inicjalizacji. Ale ... mogę tego uniknąćfalse!==
.Szybki, 27
źródło