Chuỗi X có phải là chuỗi con của chuỗi Y không?


23

Cho các chuỗi X và Y, xác định xem X có phải là chuỗi con của Y hay không. Chuỗi trống được coi là chuỗi con của mọi chuỗi. (Ví dụ, '''anna'là phần sau của 'banana'.)

Đầu vào

  • X, một chuỗi chữ và số có thể phân biệt chữ hoa chữ thường
  • Y, một chuỗi chữ và số có thể phân biệt chữ hoa chữ thường

Đầu ra

  • Đúng hoặc Sai (hoặc tương đương), cho biết chính xác liệu X có phải là con của Y.

Ví dụ I / O

X      Y        output

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

Tiêu chí

  • Chương trình ngắn nhất sẽ thắng, được xác định bởi số byte của mã nguồn.

Chương trình ví dụ


1
Tại sao 'anna' chất nền của 'chuối'?
kaoD

4
@kaoD - annalà một dãy (nhưng không một chuỗi con) của banana. Chuỗi X là một chuỗi con của chuỗi Y chỉ khi X có thể được lấy từ Y bằng cách xóa 0 hoặc nhiều phần tử của Y; ví dụ, xóa bvà thứ hai atừ bananacho anna.
res

2
Điều này có về một giải pháp duy nhất trong mọi ngôn ngữ kịch bản cung cấp biểu thức chính quy vừa tầm thường để xem và không thể đánh gôn hơn nữa.
Joey

Câu trả lời:


18

Perl 5 , 17 byte (+1?), Chương trình đầy đủ

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

Hãy thử trực tuyến!

Gọi pcờ với trình thông dịch perl, như trong perl -pe 's//.*/g;$_=<>=~$_'. Theo các quy tắc tính điểm được thiết lập khi thử thách này ban đầu được đăng , cờ này có thêm một byte. Theo các quy tắc gần đây hơn , AFAICT, nó có thể miễn phí.

Dù bằng cách nào, các chuỗi đầu vào phải được cung cấp trên các dòng kết thúc dòng mới riêng biệt trên stdin. Đầu ra (tới thiết bị xuất chuẩn) sẽ là 1nếu chuỗi đầu vào đầu tiên là một chuỗi con của chuỗi thứ hai hoặc không có gì cả nếu không.

Lưu ý rằng cả hai dòng đầu vào phải có một dòng mới ở cuối, hoặc chương trình sẽ không hoạt động chính xác. Ngoài ra, bạn có thể thêm lcờ dòng lệnh vào lệnh gọi để tạo dải perl cho dòng mới; tùy thuộc vào quy tắc tính điểm có hiệu lực, điều này có thể hoặc không tốn thêm một byte. Lưu ý rằng sử dụng cờ này cũng sẽ nối thêm một dòng mới vào đầu ra.

Phiên bản gốc (đoạn trích, 18 byte / ký tự)

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

Đầu vào được đưa ra trong các biến $x$y, kết quả là giá trị của biểu thức (trong ngữ cảnh vô hướng). Lưu ý rằng $xđược sửa đổi trong quá trình. (Vâng, tôi biết cách sử dụng $_thay vì $xsẽ cho phép tôi tiết kiệm Bốn ký tự, nhưng làm điều đó trong một đoạn mà cảm thấy một chút quá cheesy cho tôi.)

Làm thế nào nó hoạt động?

Phần đầu tiên $x=~s//.*/g, chèn chuỗi .*giữa mỗi ký tự $x. Phần thứ hai $y=~$x, coi $xnhư một biểu thức chính quy và phù hợp $yvới nó. Trong biểu thức chính tả Perl, .*khớp 0 hoặc nhiều ký tự tùy ý, trong khi tất cả các ký tự chữ và số đều khớp một cách thuận tiện.


Theo sự đồng thuận (mới?), Bài nộp phải là chương trình hoặc chức năng, không phải đoạn trích. Nếu trình của bạn không thỏa mãn điều đó, hãy xem xét chỉnh sửa nó.
dùng202729

@ user202729: Thử thách này cũ hơn rất nhiều so với sự đồng thuận đó, vì vậy trừ khi được cho là áp dụng hồi tố, các câu trả lời trong chủ đề này có lẽ nên được "mở rộng". Điều đó nói rằng, tôi chỉ thêm một phiên bản tuân thủ các quy tắc hiện hành và thậm chí có thể ngắn hơn một byte / char (lưu ý rằng đếm dựa trên byte cũng mới hơn thử thách này, AFAIK) tùy thuộc vào cách bạn đếm các công tắc dòng lệnh.
Ilmari Karonen

9

Ruby, 32 ký tự

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

Giải pháp này trả về nilnếu xkhông phải là một số sau yvà một số khác (ví dụ như ruby ​​tương đương falsetrue). Ví dụ:

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)

1
về cơ bản tôi đã làm điều tương tự, nhưng nó quá giống nhau nên tôi sẽ không đăng nó. Tôi nghĩ việc rời khỏi lambda là điều có thể chấp nhận được, điều này sẽ khiến bạn mất y=~/#{[*x.chars]*".*"}/(23 ký tự). chúc mừng
Patrick Oscarity

1
hoặc thậm chí y=~/#{x.split("")*".*"}/(21 ký tự) :)
Patrick Oscarity

@padde Phần tách ra thực sự là 24 ký tự.
Howard

1
xin lỗi, tôi đoán là tôi đã vô tình bỏ đi y=~trong khi loay hoay với điều này trong
irb

Phiên bản của tôi ngắn hơn 2 char.
Hauleth

7

Haskell, 51 37

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

Cảm ơn Hammar vì sự cải thiện đáng kể. Bây giờ nó là một hàm infix, nhưng dường như không có lý do tại sao nó không nên.

Trình diễn:

GHCi> :{
GHCi| zipWith (%) [""   , "z00", "z00" , "anna"  , "Anna"]
GHCi|             ["z00", "z00", "00z0", "banana", "banana"]
GHCi| :}
[True,True,False,True,False]

Vì danh sách trống nhỏ hơn bất kỳ danh sách nào khác, bạn có thể đơn giản hóa các trường hợp cơ sở để s x y=x<=y. Ngoài ra, bạn có thể tiết kiệm thêm một vài chi tiết bằng cách biến nó thành toán tử và sử dụng @mô hình thay vì (f:l). Điều này cắt giảm xuống còn 37 ký tự:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
hammar

6

Python (48 ký tự)

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

Cách tiếp cận tương tự như câu trả lời Ruby của Howard. Quá tệ về nhu cầu của Python để nhập gói regex và "verbose" của nó lambda. :-)


1
Tôi đồng ý, lambda là dài dòng.
Máy

4

Con trăn, 59 ký tự

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

Tôi hình dung câu trả lời của tôi sẽ được diễn đạt tốt hơn bằng Python.

Chỉnh sửa: Đã thêm đề xuất của res.


Chắc chắn được đưa ra x="a"y="ab"bạn sẽ thoát khỏi vòng lặp với y=="b"và trở lại false?
Peter Taylor

@PeterTaylor Yeah, tôi nhận thấy khi tôi đang chạy các ví dụ như kiểm tra sau khi gửi bài mà tôi đã pha trộn xylên. Trong các chức năng của tôi ycần phải là một sau đó x. Tôi nghĩ rằng tôi nên thay đổi chúng để tránh bất kỳ sự nhầm lẫn.
Gareth

Bạn có thể giảm xuống còn 59 ký tự : def s(x,y): for c in y: if x:x=x[c==x[0]:] return x=="". Nó không hiển thị chính xác trong một bình luận, nhưng tôi nghĩ bạn có thể thấy những gì tôi muốn nói. (Ngoài ra, một không gian được thêm vào là đủ để tăng mức độ thụt lề.)
res

@res Cảm ơn, Python không phải là ngôn ngữ tôi sử dụng nhiều như bạn có thể nói. Chơi golf đẹp. (63 ký tự theo bản mô tả người dùng Codegolf - nó phải được tính các dòng mới).
Gareth

1
Bạn có thể sử dụng kéo dài cắt để bảo vệ chống x ''và lưu một số ký tự bằng cách viếtx=x[c==x[0:1]:]
Nolen Royalty

4

GolfScript (22 ký tự)

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

Giả sử rằng đầu vào được lấy là hai biến được xác định trước XY, mặc dù điều đó khá bất thường trong GolfScript. Lá 1cho đúng hoặc 0sai trên ngăn xếp.



4

Burlesque (6 ký tự)

6 ký tự trong Burlesque: R@\/~[ (giả sử x và y nằm trên ngăn xếp. Xem ở đây trong hành động.)



3

PHP, 90 ký tự

<?function s($x,$y){while($a<strlen($y))if($y[$a++]==$x[0])$x=substr($x,1);return $x=="";}

Bạn có thể xóa ifcâu lệnh và đơn giản hóa thành $x=substr($x,$y[$a++]==$x[0]): ideone.com/Ch9vK
mellamokb

Ngoài ra, đây là một giải pháp 82 ký tự ngắn hơn một chút bằng cách sử dụng đệ quy: ideone.com/IeBns
mellamokb


3

CoffeeScript 112 100 95 89

Nỗ lực đầu tiên của tôi về môn đánh gôn ... hy vọng tôi không làm xấu hổ gia đình mình!

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]

Chỉnh sửa : hóa ra Coffeescript dễ tha thứ hơn tôi nghĩ với khoảng trắng.

Cảm ơn res và Peter Taylor cho một số lời khuyên để làm cho nó đẹp hơn một chút


Một vài ký tự nữa có thể được loại bỏ như sau (điều này sẽ không hiển thị ngay trong một bình luận, nhưng tôi nghĩ bạn có thể thấy những gì tôi muốn nói) : 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]. (Trong một số trình duyệt, ví dụ Chrome, bạn có thể thấy mã nhận xét được hiển thị chính xác bằng cách nhấp chuột phải, sau đó Kiểm tra phần tử.)
res

a.lengthsẽ không bao giờ trở nên tiêu cực, vì vậy bạn có thể lưu thêm một ký tự bằng cách thay thế if a==0bằng if a<1. Tôi không biết cách hoạt động if0mã thông báo của CoffeeScript, nhưng nếu nó tồn tại dưới dạng hai mã thông báo, bạn có thể tiết kiệm thêm hai bằng cách đảo ngược cả hai điều kiện (nghĩa là if1>a).
Peter Taylor

Điểm tốt. if1>akhông hợp lệ, nhưng if!alà và là một nhân vật ngắn hơn! Tôi cũng nhận ra rằng tôi có thể cạo một nhân vật phụ chuyển b+1đến bvà incrementing nó trên dòng trước đó, cũng làm tương tự iflừa càng tốt vì nó đã được làm việc với một-0 không tình 0 /.
Johno

3

C #, 70 113 107 90 ký tự

static bool S(string x,string y){return y.Any(c=>x==""||(x=x.Remove(0,c==x[0]?1:0))=="");}

6
Không phải tìm kiếm này cho một chuỗi con chứ không phải là một chuỗi?
Gareth

vâng, tôi đọc sai Nên sửa ngay.
mizer

1
Vui như Linq, tôi nghĩ bạn có thể tiết kiệm 10% bằng cách sử dụng đệ quy thay thế.
Peter Taylor

Đây là nỗ lực tốt nhất của tôi. Vẫn còn dài. 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

Bạn có thể giảm một đệ quy xuống x==""||y!=""&&S(...), nhưng nó vẫn dài hơn phiên bản Linq được cập nhật. Sử dụng tốt đẹp Any!
Peter Taylor

3

Toán học 19 17 27

LongestCommonSequencetrả về chuỗi con không liền kề dài nhất của hai chuỗi. (Không nên nhầm lẫn với LongestCommonSubsequence, trả về chuỗi tiếp theo dài nhất.

Các kiểm tra sau đây xem chuỗi tiếp theo dài nhất có phải là chuỗi đầu tiên trong hai chuỗi không. (Vì vậy, bạn phải nhập chuỗi ngắn hơn theo sau là chuỗi lớn hơn.)

LongestCommonSequence@##==#& 

Ví dụ

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

Đúng Đúng Đúng Đúng Sai

Bài kiểm tra quan trọng là bài kiểm tra thứ ba, bởi vì "anna" được chứa không liên tục trong "chuối".


3

Python 3.8 (tiền phát hành) , 42 byte

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

Hãy thử trực tuyến!

Python 3.8 (tiền phát hành) , 48 byte

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

Hãy thử trực tuyến!

Python 2 , 48 byte

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

Hãy thử trực tuyến!

Sao chép từ câu trả lời này của Lynn . Có >0thể bỏ qua nếu đầu ra trung thực / falsey là OK.

Python 2 , 50 byte

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

Hãy thử trực tuyến!

Python 2 , 50 byte

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

Hãy thử trực tuyến!


Công dụng tuyệt vời của hải mã.
Jonathan Allan

2

C - 74 71 64

Điều này không đánh bại giải pháp của Peter Taylor, nhưng tôi nghĩ nó khá thú vị (cộng với, đây là một chương trình làm việc hoàn chỉnh, không chỉ là một chức năng)

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

Và vô lương tâm:

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

Để kiểm tra nó, bạn có thể làm một cái gì đó như:

./is_subsequence banana anna && echo "yes" || echo "nope"    
# yes
./is_subsequence banana foobar && echo "yes" || echo "nope"    
# nope

!=0trong một điều kiện hơi dài dòng ... Chương trình vs chức năng là điều mà câu hỏi cần xác định rõ ràng, và ở đây thì không, vì vậy các câu trả lời có các tùy chọn khác nhau.
Peter Taylor

Chết tiệt, đó !='\0'là một thói quen xấu (tốt?) Từ việc viết mã không phải là golf, tôi đã để điều đó rơi vào hai vòng golf cuối cùng của mình, tôi sẽ phải cẩn thận hơn trong tương lai. Đối với chương trình so với chức năng, vâng, bạn hoàn toàn đúng.
Gordon Bailey

@GordonBailey xin lỗi vì vết sưng, nhưng tôi đã thực hiện một vài thay đổi thành phiên bản ngắn hơn.
oldrinb

2

Con trăn 66 62 59 58 ký tự

Một loại giải pháp thú vị, chắc chắn là một vấn đề gọn gàng.

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

2

Hồng ngọc 32 30 28

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

Điều này sẽ trả về MatchDatathể hiện nếu alà sau đó bhoặc nilnếu không.

Phiên bản cũ tìm chuỗi con thay vì sau đó

Hồng ngọc 15

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

Sử dụng String#[](str)phương thức trả về strif strlà một chuỗi con của self!!để trả về Booleannếu giá trị được trả về có thể được sử dụng như boolean (và không cần phải truehoặc false) thì nó chỉ có thể là 13 ký tự:

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

Nó sẽ trở lại nilnếu akhông phải là một chuỗi con của b.


2
Đẹp, nhưng câu hỏi yêu cầu một chuỗi con hơn là một chuỗi con.
Gareth

2

SWI-Prolog, SICStus

Danh sách con vị ngữ tích hợp / 2 của SICStus kiểm tra xem tất cả các mục trong danh sách đầu tiên cũng xuất hiện trong danh sách thứ hai. Vị từ này cũng có sẵn trong SWI-Prolog thông qua thư viện tương thích, có thể được tải bởi truy vấn [library(dialect/sicstus/lists)]..

Chạy mẫu:

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.

Số lượng byte về mặt kỹ thuật có thể là 0, vì tất cả những gì chúng ta đang làm ở đây là truy vấn, giống như cách chúng ta chạy một chương trình và cung cấp đầu vào cho nó.


2

PHP, 41 byte

in 1 cho đúng và không có gì sai

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

Nếu chỉ chèn từ từ 1 đến từ 2 thì số đếm bằng 0 đối với trường hợp đúng

levenshtein

Hãy thử trực tuyến!

PHP, 57 byte

in 1 cho đúng và 0 cho sai

Tạo một Regex

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

Hãy thử trực tuyến!


1
-2 byte: hàng đầu .*là không cần thiết. -2 byte: don Xnt gán $argvcho $a. +24 byte: cần array_map(preg_quote())cho các ký tự đặc biệt (sử dụng dấu ngoặc đơn làm dấu phân cách để tránh preg_quotetham số thứ hai .)
Titus

2
@Titus hàng đầu. * Là cần thiết cho đầu vào của một chuỗi trống và đối với đầu vào, tôi chỉ phải xử lý một chuỗi ký tự chữ và số có thể phân biệt chữ hoa chữ thường. Bạn đúng với trích dẫn nếu có nhân vật đặc biệt. Cảm ơn bạn đã đếm bài tập. Sao chép và dán bằng một giải pháp trước đó và không nghĩ về nó
Jörg Hülsermann

1
preg_matchsẽ không phàn nàn về một regex trống miễn là các dấu phân cách ở đó. Nó sẽ chỉ phù hợp với bất cứ điều gì. Nhưng preg_quote chỉ là +22 byte, không phải +24 : array_map(preg_quote,str_split(...)).
Tít

1
Nhưng sau đó, đầu vào được đảm bảo là chữ và số :) Nhưng bạn vẫn không cần hàng đầu .*.
Tít

2

Brachylog , 2 byte

⊆ᵈ

Hãy thử trực tuyến!

Như với câu trả lời này, là một biến vị ngữ tích hợp khai báo mối quan hệ giữa các biến đầu vào và biến đầu ra và là một biến vị ngữ meta điều chỉnh nó để khai báo mối quan hệ tương tự giữa các phần tử thứ nhất và thứ hai của biến đầu vào (và thống nhất biến đầu ra với phần tử thứ hai nhưng vì đây là vấn đề quyết định không kết thúc ở đây). X⊆Ylà một khẳng định rằng X là một chuỗi con của Y, do đó, cũng vậy [X,Y]⊆ᵈ.

Vị từ này (tất nhiên xuất ra thông qua thành công hay thất bại in true.hoặc false.khi nó chạy như một chương trình) lấy đầu vào làm danh sách hai chuỗi. Nếu đầu vào linh hoạt hơn một chút ...

Brachylog , 1 byte

Hãy thử trực tuyến!

Lấy chuỗi X làm biến đầu vào và chuỗi Y làm biến đầu ra. Đầu ra thông qua thành công hay thất bại, như trước đây. Nếu chạy như một chương trình đầy đủ, X được cung cấp làm đầu vào và Y được cung cấp làm đối số dòng lệnh đầu tiên.


1

Cà phê 73

Đây là câu trả lời CoffeeScript thay thế, sử dụng regexes thay vì đệ quy:

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

Nếu haystack phù hợp với một regex rất tham lam được xây dựng từ kim, nó sẽ được thay thế bằng một chuỗi rỗng. Nếu đống cỏ khô ngắn hơn lúc bắt đầu, kim là một thứ tự.

Trả về false khi xycả hai chuỗi rỗng. Hãy nghĩ rằng chúng ta cần một triết gia để cho chúng ta biết nếu một chuỗi trống là một chuỗi của chính nó!

(Được đăng dưới dạng một câu trả lời riêng biệt trước đây của tôi vì cảm thấy đủ khác biệt để biện minh cho nó).


1

PowerShell, 38

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

Tất nhiên, bất kỳ giải pháp dựa trên kết hợp chính quy hoặc mẫu nào như vậy đều có vấn đề nghiêm trọng về hiệu năng với chuỗi dài hơn. Nhưng vì sự ngắn ngủi là tiêu chí ...


1

Một loại giải pháp chống tạo ra tất cả các phần sau của Y:

Con trăn 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)]

1

APL (31)

Xử lý chuỗi là một chút thiếu trong APL.

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

sử dụng:

      {(⊂ '') ←N ← 1, ⍨ = / ⊃¨⍵: ~ × N⋄∇N} 'anna' 'chuối'
1
      {(⊂ '') ∊N ← 1, ⍨ = / ⊃¨⍵: ~ × N⋄∇N} 'Anna' 'chuối'
0
      {(⊂ '') ←N ← 1, ⍨ = / ⊃¨⍵: ~ × N⋄∇N} '' 'chuối'
1

1

Con trăn 132

Tương tự như Daniero. Không phải là giải pháp dễ nhất, nhưng nó rất thú vị để thử. Tôi chưa quen với Python, vì vậy tôi chắc chắn rằng tôi có thể rút ngắn nó nếu tôi biết nhiều hơn một chút.

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


1

Con trăn ( 75 52)

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

Giải pháp đệ quy đơn giản. Lần đầu tiên chơi golf, vì vậy bất kỳ lời khuyên nào về việc giảm bớt điều này đều được đánh giá cao :)

Đã thử nghiệm như sau:

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

Cảm ơn @lirtosiast cho một số thủ thuật boolean thông minh.


1
Bạn có thể giảm xuống còn 52 ký tự:s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
lirtosiast 10/03/2016

Cảm ơn, thật thông minh, sử dụng boolean làm chỉ số 0/1 vào mối nối :)
foslock 10/03/2016

1

PHP, 75 65 64 byte

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

lấy đầu vào từ các đối số dòng lệnh; in 1đúng, chuỗi rỗng cho sai. Chạy với -r.

giải trình:

  • strpostrả về falsenếu kim $ckhông ở trong đống cỏ khô $argv[2](sau vị trí $p),
    làm cho vòng lặp bị phá vỡ.
  • strposcũng trả về falsecho một kim trống, phá vỡ vòng lặp ở cuối $argv[1].
  • Nếu $argv[1]là một phần sau của $argv[2], $csẽ trống khi vòng lặp bị hỏng.
  • strposcần @phải ngăn chặn Empty needlecảnh báo.

+$pthay vì $p+1sau đó thì không cần gạch dưới
Jörg Hülsermann

@ JörgHülsermann +1là cần thiết để tiến lên trong chuỗi haystack; và gạch dưới tránh $p=-1khởi tạo. Nhưng ... tôi có thể tránh false!==.
Tít

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.