สตริง X เป็นองค์ประกอบของสตริง Y หรือไม่


23

ได้รับสาย X และ Y ตรวจสอบว่า X เป็นsubsequenceของวายสตริงว่างเปล่าจะถูกยกย่องว่าเป็น subsequence ของทุกสตริง (เช่น''และ'anna'เรียงตามลำดับ'banana')

อินพุต

  • X สตริงตัวอักษรผสมตัวเลขที่คำนึงถึงขนาดตัวพิมพ์
  • Y สตริงตัวอักษรผสมตัวเลขที่คำนึงถึงขนาดตัวพิมพ์

เอาท์พุต

  • จริงหรือเท็จ (หรือเทียบเท่า) แสดงอย่างถูกต้องว่า X เป็นองค์ประกอบของ Y

ตัวอย่าง I / O

X      Y        output

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

เกณฑ์

  • โปรแกรมที่สั้นที่สุดชนะตามที่กำหนดโดยจำนวนไบต์ของซอร์สโค้ด

ตัวอย่างโปรแกรม


1
ทำไม 'แอนนา' สารตั้งต้นของ 'Banana'
kaoD

4
@kaoD - annaเป็นsubsequence ( แต่ไม่สตริงย่อย) bananaของ String X เป็นส่วนประกอบของ string Y หาก X สามารถหาได้จาก Y โดยการลบศูนย์หรือมากกว่าองค์ประกอบของ Y; เช่นการลบbและครั้งที่สองaจากการให้banana anna
res

2
นี่เป็นวิธีแก้ปัญหาเดียวในทุกภาษาสคริปต์ที่ให้ regex ที่ทั้งเล็กและใหญ่มองไม่เห็นที่จะเล่นกอล์ฟต่อไป
Joey

คำตอบ:


18

Perl 5 , 17 ไบต์ (+1) โปรแกรมเต็มรูปแบบ

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

ลองออนไลน์!

วิงวอนกับpธงล่าม Perl perl -pe 's//.*/g;$_=<>=~$_'ในขณะที่ ตามกฎการให้คะแนนที่กำหนดไว้เมื่อมีการโพสต์ความท้าทายครั้งแรกค่าสถานะนี้จะมีค่าเพิ่มหนึ่งไบต์ ภายใต้กฎล่าสุด AFAICT อาจให้บริการฟรี

ทั้งสองวิธีสตริงอินพุตควรถูกจัดหาบนบรรทัดที่ขึ้นบรรทัดใหม่ที่แยกต่างหากบน stdin เอาต์พุต (ถึง stdout) จะเป็น1ถ้าสตริงอินพุตแรกเป็นซับสตริงของวินาทีหรือไม่มีอะไรเลยถ้าไม่ใช่

สังเกตว่าทั้งคู่บรรทัดจะต้องมีการขึ้นบรรทัดใหม่ในตอนท้ายมิฉะนั้นโปรแกรมจะทำงานไม่ถูกต้อง หรือคุณสามารถเพิ่มการlตั้งค่าสถานะบรรทัดคำสั่งลงในการเรียกใช้เพื่อให้ perl ตัดการขึ้นบรรทัดใหม่ ขึ้นอยู่กับกฎการให้คะแนนที่มีผลบังคับใช้ซึ่งอาจมีหรือไม่มีค่าใช้จ่ายเพิ่มเติมหนึ่งไบต์ โปรดทราบว่าการใช้การตั้งค่าสถานะนี้จะเพิ่มบรรทัดใหม่ไปยังเอาต์พุต

รุ่นดั้งเดิม (ตัวอย่างข้อมูล, 18 ไบต์ / ตัวอักษร)

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

อินพุตถูกกำหนดในตัวแปร$xและ$yผลลัพธ์คือค่าของนิพจน์ (ในบริบทสเกลาร์) โปรดทราบว่า$xมีการแก้ไขในกระบวนการ (ใช่ฉันรู้ว่าใช้$_แทน$xจะช่วยให้ฉันบันทึกสี่ตัวอักษร แต่ทำในตัวอย่างที่รู้สึกเล็กน้อยเกินไปสำหรับฉัน)

มันทำงานยังไง?

ส่วนแรก$x=~s//.*/gแทรกสตริงระหว่างตัวละครแต่ละตัวใน.* $xส่วนที่สอง$y=~$xถือว่า$xเป็น regexp และตรง$yกับมัน ใน Perl regexps .*จับคู่อักขระใดก็ได้หรือมากกว่าโดยพลการขณะที่อักขระตัวอักษรและตัวเลขทั้งหมดจับคู่ได้สะดวก


ตามฉันทามติ (ใหม่?) การส่งต้องเป็นโปรแกรมหรือฟังก์ชันไม่ใช่ตัวอย่างข้อมูล หากการส่งของคุณไม่เป็นไปตามนั้นให้พิจารณาแก้ไข
user202729

@ user202729: ความท้าทายนี้เก่ากว่าฉันทามตินั้นมากดังนั้นถ้าหากไม่คิดว่าจะใช้ย้อนหลังคำตอบในกระทู้นี้น่าจะเป็น "คุณปู่" ซึ่งบอกว่าฉันเพิ่งเพิ่มรุ่นที่สอดคล้องกับกฎปัจจุบันและ อาจจะเป็นหนึ่งไบต์ / อักขระที่สั้นลง (โปรดทราบว่าการนับแบบอิงไบต์นั้นใหม่กว่าความท้าทายนี้ AFAIK) ขึ้นอยู่กับวิธีที่คุณนับสวิตช์บรรทัดคำสั่ง
Ilmari Karonen

9

Ruby, 32 ตัวอักษร

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

วิธีการแก้ปัญหานี้จะส่งกลับnilถ้าxไม่ใช่การต่อเนื่องของyและจำนวนอื่น ๆ (เช่นทับทิมเทียบเท่ากับfalseและtrue) ตัวอย่าง:

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
ฉันทำสิ่งเดียวกันโดยพื้นฐานแล้ว แต่มันคล้ายกันเกินไปดังนั้นฉันจะไม่โพสต์ ฉันคิดว่าเป็นที่ยอมรับได้ที่จะออกจากแลมบ์ดาซึ่งจะทำให้คุณมีy=~/#{[*x.chars]*".*"}/(23 ตัวอักษร) ไชโย!
Patrick Oscity

1
หรือแม้กระทั่งy=~/#{x.split("")*".*"}/(21 ตัวอักษร) :)
Patrick Oscity

@padde อันที่จริงแล้วแยกเป็น 24 ตัวอักษร
Howard

1
ขอโทษผมคิดว่าผมตั้งใจซ้ายออกy=~ในขณะที่เล่นซอกับเรื่องนี้ในคณะกรรมการ ...
แพทริค Oscity

รุ่นของฉันสั้นกว่า 2 ถ่าน
Hauleth

7

Haskell, 51 37

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

ขอบคุณ Hammar สำหรับการปรับปรุงที่สำคัญ ตอนนี้มันเป็นฟังก์ชั่นมัด แต่ดูเหมือนจะไม่มีเหตุผลว่าทำไมมันไม่ควร

สาธิต:

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

ตั้งแต่รายการที่ว่างเปล่ามีขนาดเล็กกว่ารายการอื่น ๆ s x y=x<=yที่คุณสามารถลดความซับซ้อนกรณีฐาน นอกจากนี้คุณยังสามารถบันทึกอีกไม่กี่ด้วยการทำให้ผู้ประกอบการและใช้@-pattern (f:l)แทน วิธีนี้จะลดความยาวได้ถึง 37 ตัวอักษร:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
hammar

6

Python (48 ตัวอักษร)

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

วิธีการเดียวกับคำตอบทับทิมของฮาวเวิร์ด เลวร้ายเกินไปเกี่ยวกับความจำเป็นของงูใหญ่ที่จะนำเข้าแพคเกจ regex และ lambda"ละเอียด" :-)


1
ฉันเห็นด้วยแลมบ์ดาเป็น verbose
CalculatorFeline

4

Python 59 ตัวอักษร

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

ฉันคิดว่าคำตอบของฉันจะดีกว่าใน Python

แก้ไข: เพิ่มคำแนะนำของ res


ได้รับแน่นอนx="a"และy="ab"คุณจะออกจากวงด้วยy=="b"และกลับมาfalse?
Peter Taylor

@PeterTaylor ใช่ผมสังเกตว่าเมื่อผมทำงานตัวอย่างเช่นการทดสอบหลังการโพสต์ที่ผมเคยผสมxและyขึ้น ในการทำงานของฉันyจะต้องมี subsequence xของ ฉันคิดว่าฉันควรเปลี่ยนพวกเขาเพื่อหลีกเลี่ยงความสับสน
Gareth

คุณสามารถได้รับการลงนี้ถึง 59 def s(x,y): for c in y: if x:x=x[c==x[0]:] return x==""ตัวอักษร: มันไม่แสดงอย่างถูกต้องในความคิดเห็น แต่ฉันคิดว่าคุณสามารถเห็นสิ่งที่ฉันหมายถึง (นอกจากนี้หนึ่งพื้นที่เพิ่มก็เพียงพอที่จะเพิ่มระดับการเยื้อง)
res

@res ขอบคุณ Python ไม่ใช่ภาษาที่ฉันใช้มากเท่าที่คุณจะบอกได้ การเล่นกอล์ฟที่ดี (63 ตัวอักษรตามผู้ใช้ Codegolf - ต้องนับบรรทัดใหม่)
Gareth

1
คุณสามารถใช้การแบ่งส่วนข้อมูลเพิ่มเติมเพื่อป้องกันการ x ''และบันทึกหลาย chars โดยการเขียนx=x[c==x[0:1]:]
Nolen Royalty

4

GolfScript (22 ตัวอักษร)

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

ถือว่าอินพุตถูกใช้เป็นตัวแปรที่กำหนดไว้ล่วงหน้าสองตัวXและYแม้ว่าจะค่อนข้างผิดปกติใน GolfScript ปล่อย1ให้เป็นจริงหรือ0เป็นเท็จในกอง





3

PHP, 90 ตัวอักษร

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

คุณสามารถลบifคำสั่งและลดความซับซ้อนของ$x=substr($x,$y[$a++]==$x[0]): ideone.com/Ch9vK
mellamokb

นอกจากนี้ที่นี่เป็นโซลูชัน 82 ตัวที่สั้นกว่าเล็กน้อยโดยใช้การเรียกซ้ำ: ideone.com/IeBns
mellamokb


3

CoffeeScript 112 100 95 89

ความพยายามครั้งแรกของฉันที่การตีกอล์ฟ ... หวังว่าฉันจะไม่ทำให้ครอบครัวอับอาย!

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]

แก้ไข : ปรากฎว่า Coffeescript นั้นให้อภัยมากกว่าที่ฉันคิดด้วยช่องว่าง

ขอบคุณ res และ Peter Taylor สำหรับเคล็ดลับในการทำให้มันดูเพรียวบาง


ตัวอักษรอีกไม่กี่สามารถตัดออกได้ดังต่อไปนี้ (นี้จะไม่แสดงสิทธิในการแสดงความคิดเห็น 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]แต่ฉันคิดว่าคุณสามารถเห็นสิ่งที่ฉันหมายความว่า): (ในบางเบราว์เซอร์เช่น Chrome คุณสามารถเห็นรหัสความคิดเห็นแสดงได้อย่างถูกต้องโดยคลิกขวาจากนั้นตรวจสอบองค์ประกอบ)
res

a.lengthจะไม่ไปเป็นค่าลบเพื่อให้คุณสามารถบันทึกตัวละครตัวหนึ่งมากขึ้นโดยการแทนที่ด้วยif a==0 if a<1ฉันไม่ทราบว่าif0โทเค็นการทำงานของ CoffeeScript ทำงานอย่างไร แต่ถ้ามันมีค่าเป็นโทเค็นสองอันคุณสามารถประหยัดอีกสองค่าได้ด้วยการย้อนกลับทั้งสองเงื่อนไข (เช่นif1>a)
Peter Taylor

จุดที่ดี if1>aไม่ถูกต้อง แต่if!aเป็นและตัวละครสั้นกว่า! ฉันยังตระหนักว่าฉันสามารถโกนอักขระพิเศษที่แปลงb+1เป็นbและเพิ่มขึ้นในบรรทัดก่อนหน้าได้เช่นเดียวกันifเนื่องจากมีการจัดการกับสถานการณ์ 0 / non-0
Johno

3

C #, 70 113 107 90 ตัวอักษร

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

6
นี่ค้นหา substring แทนที่จะเป็นชุดย่อยหรือไม่?
Gareth

ใช่ฉันอ่านผิด ควรได้รับการแก้ไขแล้ว
mizer

1
สนุกเท่าที่ Linq คือฉันคิดว่าคุณสามารถประหยัด 10% โดยใช้การเรียกซ้ำ
Peter Taylor

นี่คือความพยายามที่ดีที่สุดของฉัน อีกต่อไป 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

คุณสามารถลดการเรียกซ้ำx==""||y!=""&&S(...)ได้ แต่ก็ยังคงนานกว่าเวอร์ชั่น Linq ที่อัปเดต ใช้งานได้ดีAny!
Peter Taylor

3

Mathematica 19 17 27

LongestCommonSequenceส่งคืนการเรียงลำดับที่ไม่ต่อเนื่องกันนานที่สุดของสองสตริง (เพื่อไม่ให้สับสนกับLongestCommonSubsequenceซึ่งส่งกลับลำดับที่ต่อเนื่องกันยาวนานที่สุด

ต่อไปนี้จะตรวจสอบว่าการเรียงลำดับที่ต่อเนื่องกันยาวนานที่สุดเป็นสตริงแรกของสองสตริงหรือไม่ (ดังนั้นคุณต้องป้อนสตริงที่สั้นกว่าแล้วตามด้วยสตริงที่ใหญ่กว่า)

LongestCommonSequence@##==#& 

ตัวอย่าง

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

จริงจริงเท็จจริง

การทดสอบที่สำคัญนั้นเป็นการทดสอบครั้งที่สามเนื่องจาก "anna" ไม่มีอยู่ใน "Banana" อย่างต่อเนื่อง


3

Python 3.8 (เผยแพร่ล่วงหน้า) , 42 ไบต์

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

ลองออนไลน์!

Python 3.8 (pre-release) 48 ไบต์

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

ลองออนไลน์!

Python 2 , 48 ไบต์

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

ลองออนไลน์!

คัดลอกมาจากคำตอบของ Lynnนี้ >0สามารถละเว้นถ้าเพียง truthy / falsey ผลผลิตเป็นที่ตกลง

Python 2 , 50 ไบต์

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

ลองออนไลน์!

Python 2 , 50 ไบต์

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

ลองออนไลน์!


การใช้งานที่ดีของวอลรัส
Jonathan Allan

2

C - 74 71 64

นี่ไม่ได้เป็นทางออกของปีเตอร์เทย์เลอร์ แต่ฉันคิดว่ามันสนุกดี(บวกนี่เป็นโปรแกรมการทำงานที่สมบูรณ์ไม่ใช่แค่ฟังก์ชั่น)

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

และไม่ดี

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

เพื่อทดสอบคุณสามารถทำสิ่งที่ชอบ:

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

!=0ในเงื่อนไขเป็นบิต verbose ... ฟังก์ชั่นโปรแกรม vs เป็นสิ่งที่คำถามต้องระบุอย่างชัดเจนและที่นี่มันไม่ได้ดังนั้นคำตอบใช้ตัวเลือกที่แตกต่างกัน
Peter Taylor

นั่น!='\0'เป็นนิสัยที่ไม่ดี (ดี) จากการเขียนรหัสที่ไม่ใช่กอล์ฟฉันปล่อยให้มันเข้าไปในสนามกอล์ฟสองรอบสุดท้ายของฉันฉันจะต้องระวังให้มากขึ้นในอนาคต สำหรับโปรแกรมเทียบกับฟังก์ชั่นใช่แล้วคุณพูดถูก
Gordon Bailey

@GordonBailey ขอโทษสำหรับการชน แต่ฉันทำการเปลี่ยนแปลงเล็กน้อยในรุ่นที่สั้นกว่า
oldrinb


2

ทับทิม32 30 28

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

สิ่งนี้จะคืนค่าMatchDataอินสแตนซ์ถ้าaมีการต่อเนื่องของbหรือnilมิฉะนั้น

เวอร์ชันเก่าที่ค้นหาซับสตริงแทนการเรียงลำดับ

ทับทิม 15

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

การใช้String#[](str)เมธอดที่คืนค่าstrหากstrเป็นสตริงย่อยของselfและ!!คืนBooleanถ้าค่าที่ส่งคืนสามารถใช้เป็นบูลีน (และไม่จำเป็นต้องเป็นtrueหรือfalse) จากนั้นก็สามารถมีได้เพียง 13 ตัวอักษร:

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

มันจะกลับมาnilถ้าไม่ได้เป็นย่อยของab


2
ดี แต่คำถามถามถึงการเรียงลำดับมากกว่าซับสตริง
Gareth

2

SWI-Prolog, SICStus

ในตัวกริยารายการย่อย / 2ของการตรวจสอบ SICStus ว่ารายการทั้งหมดในรายการแรกยังปรากฏอยู่ในรายการที่สอง กริยานี้ยังมีอยู่ใน [library(dialect/sicstus/lists)].SWI-เปิดฉากผ่านห้องสมุดความเข้ากันได้ซึ่งสามารถโหลดได้จากแบบสอบถาม

วิ่งตัวอย่าง:

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.

ในทางเทคนิคจำนวนไบต์สามารถเป็น 0 เนื่องจากสิ่งที่เราทำที่นี่คือการสืบค้นเช่นเดียวกับที่เราเรียกใช้โปรแกรมและป้อนข้อมูลเข้า


2

PHP, 41 ไบต์

พิมพ์ 1 สำหรับจริงและไม่มีอะไรที่เป็นเท็จ

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

หากการแทรกจากคำ 1 ถึงคำ 2 เสร็จสิ้นการนับเป็นศูนย์สำหรับกรณีจริง

levenshtein

ลองออนไลน์!

PHP, 57 ไบต์

พิมพ์ 1 สำหรับจริงและ 0 สำหรับเท็จ

สร้าง Regex

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

ลองออนไลน์!


1
-2 ไบต์: การนำหน้า.*ไม่จำเป็น -2 ไบต์: ห้ามกำหนดที่จะ$argv $a+24 bytes: ต้องการarray_map(preg_quote())อักขระพิเศษ (ใช้วงเล็บเป็นตัวคั่นเพื่อหลีกเลี่ยงpreg_quoteพารามิเตอร์ที่สอง)
Titus

2
@Tios the Leading. * จำเป็นสำหรับอินพุตของสตริงว่างและสำหรับอินพุตฉันต้องจัดการกับสตริงตัวอักษรผสมตัวเลขและตัวพิมพ์เล็ก คุณพูดถูกถ้ามีตัวอักษรพิเศษ ขอบคุณสำหรับการนับจำนวนที่ได้รับมอบหมาย คัดลอกและวางโดยการแก้ปัญหาก่อนหน้านี้และไม่ได้คิดเกี่ยวกับมัน
JörgHülsermann

1
preg_matchจะไม่บ่นเกี่ยวกับ regex ที่ว่างเปล่าตราบใดที่มีตัวคั่น มันจะจับคู่อะไรก็ได้ แต่ preg_quote เป็นเพียง 22 ไบต์ไม่ได้ array_map(preg_quote,str_split(...))24:
ติตัส

1
แต่แล้วใส่รับประกันได้ว่าจะเป็นตัวเลขและ :) .*แต่คุณยังคงไม่จำเป็นต้องนำ
ติตัส

2

Brachylogขนาด 2 ไบต์

⊆ᵈ

ลองออนไลน์!

เช่นเดียวกับคำตอบ นี้เป็นคำกริยาภายในที่ประกาศความสัมพันธ์ระหว่างตัวแปรอินพุตและเอาต์พุตและเป็น meta-predicate ที่ปรับเปลี่ยนให้ประกาศความสัมพันธ์เดียวกันระหว่างองค์ประกอบแรกและตัวที่สองของตัวแปรอินพุตแทน (และรวมเข้าด้วยกัน ตัวแปรเอาต์พุตที่มีอิลิเมนต์ที่สอง แต่เนื่องจากนี่เป็นปัญหาการตัดสินใจที่ไม่ได้จบลงที่นี่) X⊆Yคือการยืนยันว่า X เป็น subsequence ของ Y [X,Y]⊆ᵈดังนั้นเพื่อให้เป็น

ภาคนี้ (ซึ่งแน่นอนผลผ่านความสำเร็จหรือความล้มเหลวที่พิมพ์ true.หรือfalse.เมื่อเรียกใช้เป็นโปรแกรม) รับอินพุตเป็นรายการของสองสาย หากอินพุตมีความยืดหยุ่นมากกว่านี้ ...

Brachylogขนาด 1 ไบต์

ลองออนไลน์!

รับสตริง X เป็นตัวแปรอินพุตและสตริง Y เป็นตัวแปรเอาต์พุต ผลลัพธ์ผ่านความสำเร็จหรือล้มเหลวเหมือนเมื่อก่อน หากเรียกใช้เป็นโปรแกรมเต็มรูปแบบ X จะได้รับเป็นอินพุตและ Y จะให้เป็นอาร์กิวเมนต์บรรทัดคำสั่งแรก


1

CoffeeScript 73

ต่อไปนี้เป็นคำตอบ CoffeeScript ทางเลือกโดยใช้ regexes แทนการเรียกซ้ำ:

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

หากกองหญ้าตรงกับ regex โลภมากที่สร้างขึ้นจากเข็มมันจะถูกแทนที่ด้วยสตริงว่าง หากกองหญ้านั้นสั้นกว่าที่เริ่ม

ส่งคืนค่า false เมื่อxและyทั้งสองเป็นสตริงว่าง คิดว่าเราต้องการนักปรัชญาที่จะบอกเราว่าสตริงว่างเปล่าเป็นส่วนประกอบของตัวมันเองหรือไม่!

(โพสต์เป็นคำตอบที่แยกต่างหากจากครั้งก่อนของฉันเพราะมันให้ความรู้สึกที่แตกต่างพอที่จะให้เหตุผลได้)


1

PowerShell, 38

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

แน่นอนว่าโซลูชันที่ใช้การจับคู่ regex หรือการจับคู่รูปแบบดังกล่าวมีปัญหาประสิทธิภาพการทำงานรุนแรงกับสตริงที่ยาวขึ้น แต่เนื่องจากความสั้นเป็นเกณฑ์ ...


1

ประเภทต่อต้านการแก้ปัญหาสร้างทั้งหมดของ Y 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)]

1

APL (31)

การจัดการสตริงเป็นบิตขาดใน APL

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

การใช้งาน:

      {(⊂ '') ∊N ←⍵↓⍨¨1, ⍨ = / ⊃¨⍵: ~ ×⍴⊃N⋄∇N} 'แอนนา' 'กล้วย'
1
      {(⊂ '') ∊N ←⍵↓⍨¨1, ⍨ = / ⊃¨⍵: ~ ×⍴⊃N⋄∇N} 'แอนนา' 'กล้วย'
0
      {(⊂ '') ∊N ←⍵↓⍨¨1, ⍨ = / ⊃¨⍵: ~ ×⍴⊃N⋄∇N} '' 'กล้วย'
1

1

Python 132

คล้ายกับของ Daniero ไม่ใช่ทางออกที่ง่ายที่สุด แต่ก็สนุกไปกับการลอง ฉันใหม่กับ Python ดังนั้นฉันจึงมั่นใจว่าสามารถทำให้สั้นลงได้ถ้าฉันรู้มากขึ้นอีกนิด

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

Python ( 75 52)

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

โซลูชันแบบเรียกซ้ำง่าย ๆ การเล่นกอล์ฟเป็นครั้งแรกดังนั้นเคล็ดลับใด ๆ ในการลงมือทำสิ่งนี้จึงเป็นที่นิยมอย่างมาก :)

ทดสอบกับสิ่งต่อไปนี้:

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

ขอบคุณ @lirtosiast สำหรับเทคนิคบูลีนที่ฉลาด


1
คุณสามารถลดความยาวได้ถึง 52 ตัวอักษร:s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
lirtosiast

ขอขอบคุณที่ฉลาดใช้บูลเป็นดัชนี 0/1 เข้ามาประกบกัน :)
foslock

1

PHP, 75 65 64 ไบต์

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

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง พิมพ์1สำหรับสตริงจริงและว่างเปล่าสำหรับเท็จ -rทำงานด้วย

คำอธิบาย:

  • strposผลตอบแทนfalseถ้าเข็ม$cไม่ได้อยู่ในกองหญ้า$argv[2](หลังจากตำแหน่ง$p)
    ทำให้เกิดวงแตก
  • strposนอกจากนี้ยังมีผลตอบแทนสำหรับเข็มที่ว่างเปล่าหมดห่วงในตอนท้ายของfalse$argv[1]
  • ถ้า $argv[1]เป็น subsequence ของ$argv[2],$cจะว่างเปล่าเมื่อแบ่งห่วง
  • strposจำเป็นต้อง@ระงับEmpty needleคำเตือน

+$pแทนที่จะเป็น$p+1หลังจากนั้นไม่จำเป็นต้องใช้ขีดเส้นใต้
JörgHülsermann

@ JörgHülsermann +1เป็นสิ่งจำเป็นในการก้าวไปในสายหญ้าแห้ง; และขีดล่างเพื่อหลีกเลี่ยงการ$p=-1เริ่มต้น แต่ ... ฉันสามารถหลีกเลี่ยงfalse!==ได้
ติตัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.