ทดสอบว่าสตริงสามารถทำกับสตริงย่อย!


23

กำหนดสตริงsและอาร์เรย์ / รายการlตรวจสอบหรือไม่ว่าสามารถทำกับชิ้นส่วนจากsl

ตัวอย่างเช่นหากสตริงคือ"Hello, world!"และรายการ[' world!', 'Hello,']นั้นโปรแกรม / ฟังก์ชั่นควรส่งกลับค่าความจริงเพราะคุณสามารถจัดเรียงรายการเพื่อสร้างสตริง รายการต่อไปนี้จะคืนค่าความ['l', 'He', 'o, wor', 'd!']จริงด้วย: ลองนึกภาพการ'l'เติมในสิ่งที่เขาต้องการในสาย ใช่แล้วคุณอาจทำซ้ำองค์ประกอบของรายการเพื่อจัดรูปแบบสตริง หากไม่สามารถสร้างสตริงได้ควรส่งคืนค่าที่ผิดพลาด วิธีการมาตรฐานของ IO ใช้ช่องโหว่มาตรฐาน

กรณีทดสอบ:

Input (In the form of s, l)
Output (1 if possible, 0 if impossible)

"Hello, world!", ["l", "He", "o, wor", "d!"]
1

"la lal al ", ["la", " l", "al "]
1

"this is a string", ["this should return falsy"]
0

"thi is a string", ["this", "i i", " a", " string"]
0

"aaaaa", ["aa"]
0

"foo bar foobar", ["foo", "bar", " ", "spam"]
1

"ababab", ["a","ba","ab"]
1

"", ["The string can be constructed with nothing!"]
1

มันไม่สำคัญว่าถ้าอาร์เรย์มีมากขึ้นสตริงกว่าที่มีความจำเป็นในการสร้างสตริงหลัก?
Shaggy

ค่าตอบแทนควรเป็นเท่าไหร่ในกรณีเหล่านั้น?
Shaggy

@Shaggy Truthy หากมีพิเศษแล้วสตริงสามารถสร้างด้วยส่วนที่ไม่ใช่พิเศษทั้งหมด ฉันจะเพิ่มกรณีทดสอบ
สหาย SparklePony

3
ฉันแนะนำให้เพิ่มกรณีทดสอบนี้:"ababab", ["a","ba","ab"]
คณิตศาสตร์ junkie

3
ฉันขอแนะนำให้คุณเพิ่มกรณีทดสอบที่มีอักขระเมตาของ regex
Joey

คำตอบ:


11

Brachylogขนาด 8 ไบต์

~c¬{∋¬∈}

ลองออนไลน์!

มันช้ามาก ใช้เวลาประมาณ 37 วินาทีสำหรับ "Hello, world!" กรณีทดสอบบนพีซีของฉันและหมดเวลากับ TIO

สิ่งนี้ใช้สตริงผ่านตัวแปร Input และรายการผ่านตัวแปร Output

คำอธิบาย

             String = ?, List = .

             It is possible to find…
~c           …a deconcatenation of ?…
  ¬{   }     …such that it is impossible…
    ∋¬∈      …that an element of that deconcatenation is not an element of .

"la lal al" มากกว่า 60 วินาที ...
2560

1
@RosLuP ด้วยการป้อนข้อมูลนี้และ["la", " l", "al "]เป็นรายการมันจะถูกยกเลิกบนคอมพิวเตอร์ของฉันและตอบถูกต้องfalse.หลังจาก 6800 วินาทีและ "เพียง" 113 พันล้านข้อสรุป
ลดขนาด

ฉันรู้สึกอยากเขียนอะไรในภาษานี้จะส่งผลให้โปรแกรมไม่สามารถเรียกใช้บน TIO haha
Magic Octopus Urn

@carusocomputing ภาษาไม่ได้ช้าสำหรับโปรแกรมส่วนใหญ่เป็นเพียงว่าในบางกรณีเนื่องจากการเสื่อมสภาพของโปรแกรมมันส่งผลในเวลาดำเนินการช้ามาก (ซึ่งสามารถปรับปรุงอย่างมากในราคารหัสยาว)
Fatalize

@ กระชับ errr ... ฉันหมายถึงการเล่นกอล์ฟไม่ได้เขียนดูเหมือนว่าคำแนะนำที่น้อยกว่ายิ่งคำถาม "" กลายเป็นวงกว้างและการคำนวณที่คุณต้องการมากขึ้น ดูเหมือนว่าจะมีปัญหาทางคณิตศาสตร์เชิงทฤษฎีที่ยอดเยี่ยมมาก
Magic Octopus Urn

7

Mathematica, 29 ไบต์

StringMatchQ[#,""|##&@@#2..]&

คำอธิบาย:

             #,               (* The first argument *)
StringMatchQ[                 (* matches the string pattern *)
               ""|##&         (*   Alternatives *)
                     @@       (*     applied to *)
                       #2     (*     the second argument *)
                         ..   (*   repeated *)
                           ]&

การแก้ปัญหาการโกงแนวชายแดน 21 ไบต์

StringMatchQ[#,#2..]&

เนื่องจาก Mathematica เป็นภาษาการเขียนโปรแกรมเชิงสัญลักษณ์จึงไม่มีความแตกต่าง * ระหว่างนิพจน์List[a,b,...]และAlternatives[a,b,...]อื่น ๆ นอกเหนือจากวิธีที่พวกเขาโต้ตอบกับสัญลักษณ์อื่นและวิธีแสดง ( {a,b,...}และa|b|...ตามลำดับ) เมื่อนำมาใช้ในอาร์กิวเมนต์ที่สองของStringMatchQการAlternativesแสดงออกจะถือว่าเป็นรูปแบบสตริงและทำให้เราสามารถประหยัด8ไบต์มากกว่าการแก้ปัญหาดังกล่าวข้างต้นของฉันโดยการอาร์กิวเมนต์ที่สองเป็นAlternativesการแสดงออก

* ทางเทคนิคListคือการLockedป้องกันผู้ใช้จากการใช้งานUnprotectและการเปลี่ยนแปลงพฤติกรรมของมัน


1
{x,y,z}ได้รับการปฏิบัติเช่นเดียวกับx|y|zการจับคู่รูปแบบสตริง ฉันคิดว่าคุณสามารถแทนที่มีเพียง""|##&@@#2.. #2..
ไม่ใช่ต้นไม้

5

Pyth, 23 ไบต์

AQW&GhGJ.(G0Vf!xJTH aG>JlN;G

[['string'],['list', 'of', 'parts']]จะเข้าเช่น เอาต์พุตเป็นรายการว่างหรือรายการที่มีค่าอยู่ภายใน ใน Pyth หมายถึงรายการที่มีสิ่งใดแม้แต่สตริง null ( ['']) จะประเมินค่าเป็นจริง

ลองออนไลน์!

คำอธิบาย:

                             | Implicit: Q = eval(input())
AQ                           | Assign the first value of Q to G and the second to H
  W&GhG                      | While G is not empty and G doesn't contain an empty string:
       J.(G0                 |  Pop the first value of G and store into J
            Vf!xJTH          |  For N in elements in H that match the beginning of J:
                             |   Additional space for suppressing printing 
                    aG>JlN   |   Append to G the elements of J from the length of N to the end
                          ;  | End all loops
                           G | Print G

โซลูชันนี้พยายามที่จะลบทุกส่วนที่เป็นไปได้อย่างต่อเนื่องตั้งแต่เริ่มต้นของสตริงและติดตามค่าที่ยังคงต้องดูผ่าน

หากเราดูค่าของGกรณีทดสอบ[['ababab'],['a','ba','ab']]หลังจากวนซ้ำในขณะที่วนซ้ำนี่คือสิ่งที่เราได้รับ:

['ababab']
['babab', 'abab']
['abab', 'bab']
['bab', 'bab', 'ab']
['bab', 'ab', 'b']
['ab', 'b', 'b']
['b', 'b', '']
['b', '']
['']   <---Remember, this evaluates to True

และในกรณีทดสอบ[['aaaaa'],['aa']]นี่คือสิ่งที่เราได้รับ:

['aaaaa']
['aaa']
['a']
[]   <---And this evaluates to False

ฉันสร้างอีกกรณีทดสอบ[['aaaaaa'],['a','aa','aaa']]และผลลัพธ์คือ:

['', 'aaa', 'aa', 'a', 'aa', 'a', '', 'a', '', 'aa', 'a', '', 'a', '', '', 'a', '', '']

รายการผลลัพธ์มีขยะจำนวนมากอยู่ข้างใน แต่ก็ยังมีคุณค่าที่แท้จริง


5

Perl 5 , 39 ไบต์

รหัส 38 ไบต์ + -pธง

map{chop;$v.="\Q$_\E|"}<>;$_=/^($v)*$/

ลองออนไลน์!

สำหรับการป้อนข้อมูล"Hello, world!", ["l", "He", "o, wor", "d!"](คั่นด้วยการขึ้นบรรทัดใหม่จริง) ก็สร้างรูปแบบl|He|o, wor|d!|(มี metacharacters หนีขอบคุณ\Q..\E) /^($v)*$/แล้วรูปลักษณ์ถ้าสายแรกตรงกับรูปแบบนี้กับ

บน TryItOnline โปรดทราบว่าจำเป็นต้องมีบรรทัดใหม่ต่อท้าย


"สวัสดีโลก! l เขาโอววว!" อินพุตนี้มีช่องว่างหลังจาก "l" ไม่ได้สร้างผลลัพธ์
RosLuP

@ RosLuP คุณสามารถให้ลิงค์ TryItOnline แก่ฉันได้ไหม (ฉันไม่เข้าใจความหมายที่แท้จริงของคุณโปรดทราบว่า "false" ไม่ได้พิมพ์อะไรจริง ๆ เพราะนี่คือ Perl)
Dada

ดังนั้นสำหรับการพิมพ์ที่ผิดอะไร ในกรณีนี้นะคะ แต่ตอนนี้ไม่มีค่าการส่งออกไม่ได้ดูเหมือนว่าฉันมากเกินไปประโยชน์ ...
RosLuP

@RosLuP ถูกต้องแล้ว ใน Perl undefค่าที่ผิดพลาดถูกส่งคืนโดย builtin ส่วนใหญ่ และเมื่อพิมพ์มันไม่ได้พิมพ์อะไรจริงๆ และนั่นคือสิ่งที่ฉันทำ การพิมพ์ "1/0" เป็นเรื่องธรรมดาสำหรับภาษาที่ใช้ภาษา C แต่สำหรับ Perl "1 / undef" เป็นวิธีที่เป็นธรรมชาติ
ดาดา

ไม่มีเอาต์พุตมีความกำกวมอย่างหนึ่ง "มันกำลังทำงานอยู่หรือโปรแกรมสิ้นสุดเท็จแล้วหรือ"
RosLuP

4

PHP, 69 ไบต์

<?=($s=$_GET[0])>""?ctype_digit(strtr($s,array_flip($_GET[1])))?:0:1;

Testcases


ฉลาดมากใช้เวลาสักครู่เพื่อทำความเข้าใจกับสิ่งที่คุณกำลังทำ +1 เมื่อคิดนอกกรอบ
Martijn

ค่าลบที่เป็นเท็จสำหรับเคสขอบที่น่ารำคาญ["", ["The string can be constructed with nothing!"]]
Jonathan Allan

@JonathanAllan ทำแล้วเป็นสตริงว่างสตริง?
JörgHülsermann

ใช่ปัญหาของการแบ่งพาร์ติชันที่ว่างเปล่าเป็นปัญหาในหลายวิธี
Jonathan Allan


3

JavaScript (ES6), 59 ไบต์

ใช้เวลาอาร์เรย์ของสตริงaและสตริงในไวยากรณ์s currying (a)(s)ผลตอบแทน/falsetrue

a=>g=s=>!s||a.some(e=>s.split(e)[0]?0:g(s.slice(e.length)))

แสดงความคิดเห็น

a =>                          // main function that takes 'a' as input
  g = s =>                    // g = recursive function that takes 's' as input
    !s ||                     // if 's' is empty, return true (success!)
    a.some(e =>               // else, for each element 'e' in 'a':
      s.split(e)[0] ?         //   if 's' doesn't begin with 'e':
        0                     //     do nothing
      :                       //   else:
        g(s.slice(e.length))  //     remove 'e' at the beginning of 's' and
    )                         //     do a recursive call on the remaining part

กรณีทดสอบ


3

Haskell , 35 ไบต์

#ใช้เวลาStringและรายชื่อของStrings Boolและผลตอบแทน

s#l=elem s$concat<$>mapM("":)(l<$s)

ลองออนไลน์!

อย่าเพิ่งสนใจกรณีทดสอบที่ฉันออกไปเพราะมันทำให้แล็ปท็อปของฉันมีน้อยแม้กระทั่งกับ -O2 ฉันสงสัยว่า GHC ไม่ได้หลอมรวมรายชื่อองค์ประกอบกลาง 30517578125 มันมีการแบ่งปันมากเกินไปที่จะรวบรวมขยะอย่างรวดเร็วและเนื่องจากกรณีทดสอบเป็นเท็จโปรแกรมต้องสร้างทั้งหมด ... รู้สึกอิสระที่จะลองถ้าคุณสามารถ จัดการที่

mapM("":)(l<$s)เป็นรายการของทุกวิถีทางที่จะทำให้เป็นรายการขององค์ประกอบที่มีทั้งสตริงว่างเปล่าหรือสตริงจากlength sl


3

Pyth, 17 15 11 14 ไบต์

AQ|!G}Ym-dH./G

ข้อกำหนดสำหรับสตริงว่างเปลี่ยนไปโดยเพิ่มจำนวน 3 ไบต์

คำอธิบาย

AQ|!G}Ym-dH./G
AQ                     Save the input into G, H.
           ./G         Get all partitions of G.
       m-dH            Check if the parts are in H.
     }Y                The empty list should be present if and only
                           if the string can be made...
  |!G                  ... or the string might be empty.

รุ่นเก่า

AQ}Ym-dH./G

สั้นลงและวิ่งในช่วงอายุของจักรวาล!

คำอธิบาย

AQ}Ym-dH./G
AQ                  Save the input into G, H.
        ./G         Get all partitions of G.
    m-dH            Check if the parts are in H.
  }Y                The empty list should be present if and only
                        if the string can be made.

AQ&G}GsMs.pMy*HlG

มันช้าอย่างน่ากลัว แต่มันใช้ได้กับกรณีทดสอบเล็ก ๆ น้อย ๆ ของฉัน

คำอธิบาย

AQ&G}GsMs.pMy*HlG
AQ                  Save the input into G, H.
             *HlG   Repeat the list of substrings for each character of G.
            y       Take the power set.
         .pM        Take every permutation of each set of substrings.
      sMs           Get a list of all the joined strings.
    }G              Check if G is one of them.
  &G                Make sure G is not empty.

3

เจลลี่ , 14 12 8 ไบต์

;FŒṖḟ€Ạ¬

ลองออนไลน์!

มันทำงานอย่างไร

;FŒṖḟ€Ạ¬   - main function, left argument s, right argument l
;F         - concatenate to the string the list, flattened to deal with "" as string
  ŒṖ       - Get all partitions of s, that is, all ways to make s from substrings
     €     - For each partition...
    ḟ      -   Filter out (exclude) those elements which are not in... 
           -   (implicit right arg) the list l. This leaves the empty set (falsy) if the partition can be made of elements from the list
      Ạ    - If any element is falsy (thus constructable from l), return 0; else return 1
       ¬   - Apply logical not to this, to yield the proper 1 = constructable from list, 0 otherwise.

แก้ไขข้อผิดพลาดในกรณีที่"", ["The string can be constructed with nothing"]ต้องขอบคุณ @JonathanAllan


ค่าลบที่เป็นเท็จสำหรับ"", ["The string can be constructed with nothing!"]
Jonathan Allan

มันจะช้ากว่านี้มาก แต่;FŒṖḟ⁹$€Ạ¬จะแก้ไขได้
Jonathan Allan

... และคุณสามารถใช้การโต้แย้งสิทธิโดยปริยายสำหรับดังนั้นคุณไม่จำเป็นต้องใช้$หรือ: ;FŒṖḟ€Ạ¬
Jonathan Allan

Grr นั่นคือสิ่งที่ฉันได้รับไม่ใช่การทดสอบทุก ๆ เคส ฉันอาจจะสามารถรักษา 8 ไบต์โดยแทนที่¬ด้วยการดำเนินการซึ่งมักจะส่งกลับจริงด้วยอาร์กิวเมนต์ที่ถูกต้อง ""
fireflame241

^ ฉันได้รับมันกลับไปที่ 8 :)
Jonathan Allan


2

Pyth, 10 8ไบต์

f!-TQ./+zh

ชุดทดสอบ

ใช้รายการในบรรทัดแรกของ STDIN และสตริง (โดยไม่ใส่เครื่องหมายอัญประกาศ) ในวินาที

ในการเริ่มต้นรายการนี้จะถูกเก็บไว้ในและสตริงถูกเก็บไว้ในQ ต่อไปเราในรูปแบบพาร์ทิชันที่เป็นไปได้ทั้งหมดz zแต่ละพาร์ติชันจะถูกกรอง (f ) เพื่อตรวจสอบว่ามันใช้เพียงบางส่วนQหรือไม่ ในการทำเช่นนี้เราจะลบองค์ประกอบทั้งหมดออกQจากTพาร์ติชันที่เรากำลังแบ่งพาร์ติชันและลบล้างผลลัพธ์ด้วยเหตุผล!เพื่อให้มีเพียงพาร์ติชันที่ทุกองค์ประกอบถูกQเก็บไว้

เพื่อแก้ไขปัญหาที่เกิดขึ้น ''ไม่มีพาร์ติชันเราเพิ่มคำแรกของพจนานุกรมลงใน z เพื่อไม่ให้เป็นสตริงว่าง


ชุดทดสอบพลาดบรรทัดล่าง (สตริงว่าง) - มันต้องมีการอ้างอิงหรือไม่? ด้วยบรรทัดว่างเปล่าหรือ""ดูเหมือนว่าจะล้มเหลว
Jonathan Allan

สตริงว่างไม่มีพาร์ติชันดังนั้นจริง ๆ แล้วมันแค่ให้คำตอบที่ผิดที่นี่ ฉันจะพยายามแก้ไข
isaacg

การแก้ไขที่ฉันแนะนำให้กับเยลลี่นั้นคือการต่อสตริงอินพุตกับอาเรย์อินพุตแบบแบนบางทีคุณอาจทำแบบเดียวกันได้หรือไม่?
Jonathan Allan

@JanathanAllan ฉันทำสิ่งที่คล้ายกันขอบคุณ
isaacg

กรณีของ "", [""]และ"", []ยังไม่ได้รับการคุ้มครอง - อย่าไปที่นั่น :)
Jonathan Allan

2

PowerShell, 61 58 57 ไบต์

{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};+!$s}

ลองออนไลน์!

โซลูชั่นเก่า:

{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};[int]!$s}
{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};0+!$s}  

อันนี้เกือบอ่านไม่ได้ดังนั้นฉันขอแนะนำให้เปลี่ยนอีกเล็กน้อย ฉันค่อนข้างแน่ใจว่าคนอื่น ๆ ส่วนใหญ่จะเห็นด้วย
Rɪᴋᴇʀ

ขอบคุณสำหรับคำอธิบายถึงสาเหตุของการแก้ไขวิธีแก้ปัญหาของฉัน
Andrei Odegov

1

Python 2, 64 ไบต์

lambda s,l:len(re.findall("^("+"|".join(l)+")*$",s))>0
import re

ลองใช้ออนไลน์!


("aaaaaaa",["aa","aaa"])ผมคิดว่านี้ไม่ได้โดยสิ้นเชิงทำงานลอง
xnor

@xnor ฉันอัปเดตแล้ว มาเพื่อค้นหา regex ที่สมบูรณ์แบบสำหรับสิ่งนี้
Neil

4
ควรจะล้มเหลวสำหรับ('x', '.')ฉันเดา แต่ไม่ได้
Joey

1
@nfnneil คุณเหรอ? การแก้ไขล่าสุดของคุณคือ 10 ชั่วโมงที่ผ่านมา
เดนนิส

1
... หรือ"Hello", ["\w"]อื่น ๆ
Jonathan Allan


1

CJam (16 ไบต์)

{Ma+1$,m*:e_\a&}

นี่คือบล็อก (ฟังก์ชั่น) ที่ไม่ระบุชื่อการรับสตริงและอาร์เรย์ของสตริงบนสแต็ก สาธิตออนไลน์

มันใช้อัลกอริทึมที่ชัดเจน:

{        e# Declare a block. Call the args str and arr
  Ma+    e#   Add the empty string to the array
  1$,m*  e#   Take the Cartesian product of len(str) copies of (arr + [""])
  :e_    e#   Flatten each element of the Cartesian product into a single string
  \a&    e#   Intersect with an array containing only str
}

ค่าส่งคืนเป็นอาเรย์ / สตริงว่าง (เท็จ) หากstrไม่สามารถทำได้หรืออาร์เรย์ที่มีstr(ความจริงแม้ว่าstrตัวเองเป็นสตริงว่าง) ถ้ามันสามารถทำได้


@RosLuP ฉันไม่แน่ใจว่าคุณหมายถึงอะไร กรณีทดสอบนั้นดำเนินการอย่างรวดเร็วจนฉันไม่สามารถกำหนดเวลาได้ กรณีทดสอบอื่น ๆ ใช้เวลานานในการดำเนินการ แต่สเป็คไม่รวมถึงข้อ จำกัด เวลาใด ๆ
Peter Taylor

@RosLuP, สาธิตออนไลน์ แต่ฉันไม่เข้าใจว่าคำร้องเรียนของคุณคืออะไร
Peter Taylor

1

C ++ (Bcc), 287 ไบต์

#include<algorithm.h>
f(a,b)char*a,**b;{int i,j,k,v,p[256];if(!a||!b||!*b)return-1;for(v=0;v<256&&b[v];++v)p[v]=v;if(v>=256)return-1;la:for(i=0,j=0;j<v&&a[i];){for(k=0;b[p[j]][k]==a[i]&&a[i];++i,++k);j=b[p[j]][k]?(i-=k),j+1:0;}if(a[i]&&next_permutation(p,p+v)) goto la;return i&&!a[i];}

เพราะฉันไม่ได้เขียนหรือใช้ next_permutation มากเกินไป () ฉันไม่รู้ว่ามันโอเคไหม ฉันไม่ทราบ 100% ถ้าเป็นวิธีแก้ปัญหาอาจเป็นไปได้ว่ามีคุณภาพ ... รายการสตริงหนึ่งรายการอยู่ที่นี่หนึ่งพอยน์เตอร์ที่จะจัดกลุ่ม; NULL สิ้นสุดอัลโกเป็นเรื่องง่ายมีหนึ่งอัลโกที่เป็นเชิงเส้นลองถ้าสตริงทั้งหมดในรายการพอดีกับอาร์กิวเมนต์ "สตริง" มีอัลโกอื่น ๆ อีกหนึ่งที่เปลี่ยนแปลงดัชนีของรายการของสตริงเพื่อลองชุดที่เป็นไปได้ทั้งหมด

Ungolf มันรหัสการทดสอบและผลลัพธ์ที่นี่

#include<stdio.h>
g(a,b)char*a,**b;
{int i,j,k,v,p[256];
 if(!a||!b||!*b) return -1;
 for(v=0;v<256&&b[v];++v) p[v]=v;
 if(v>=256)      return -1; // one array of len >256 is too much
la: 
 for(i=0,j=0;j<v&&a[i];)
   {for(k=0;b[p[j]][k]==a[i]&&a[i];++i,++k); 
    j=b[p[j]][k]?(i-=k),j+1:0;
   } 
 if(a[i]&&next_permutation(p,p+v)) goto la;
 return i&&!a[i];  
}

#define F for
#define P printf

test(char* a, char** b)
{int i;
 P("f(\"%s\",[",a);
 F(i=0;b[i];++i) 
       P("\"%s\"%s", b[i], b[i+1]?", ":"");
 P("])=%d\n", f(a,b));
}

main()
{char *a1="Hello, world!",    *b1[]={"l","He", "o, worl", "d!",      0};//1
 char *a2="la lal al ",       *b2[]={"la", " l", "al ",              0};//1
 char *a3="this is a string", *b3[]={"this should return falsy",     0};//0
 char *a4="thi is a string",  *b4[]={"this", "i i", " a", " string", 0};//0
 char *a5="aaaaa",            *b5[]={"aa",                           0};//0
 char *a6="foo bar foobar",   *b6[]={"foo","bar"," ","spam",         0};//1
 char *a7="ababab",           *b7[]={"a","ba","ab",                  0};//1
 char *a8="",                 *b8[]={"This return 0 even if has to return 1", 0};//0
 char *a9="ababc",            *b9[]={"a","abc", "b", 0};//1

  test(a1,b1);test(a2,b2);test(a3,b3);test(a4,b4);test(a5,b5);test(a6,b6);
  test(a7,b7);test(a8,b8);test(a9,b9);
}

f("Hello, world!",["l", "He", "o, worl", "d!"])=1
f("la lal al ",["la", " l", "al "])=1
f("this is a string",["this should return falsy"])=0
f("thi is a string",["this", "i i", " a", " string"])=0
f("aaaaa",["aa"])=0
f("foo bar foobar",["foo", "bar", " ", "spam"])=1
f("ababab",["a", "ba", "ab"])=1
f("",["This return 0 even if has to return 1"])=0
f("ababc",["a", "abc", "b"])=1

สิ่งนี้จะรวบรวมในคอมไพเลอร์ gcc C ++

#include<algorithm>

int f(char*a,char**b){int i,j,k,v,p[256];if(!a||!b||!*b)return -1;for(v=0;v<256&&b[v];++v)p[v]=v;if(v>=256)return -1;la:;for(i=0,j=0;j<v&&a[i];){for(k=0;b[p[j]][k]==a[i]&&a[i];++i,++k);j=b[p[j]][k]?(i-=k),j+1:0;}if(a[i]&&std::next_permutation(p,p+v))goto la;return i&&!a[i];}

ต้องรัก C ++! :)
MEMark

1

Python ขนาด 66 ไบต์

lambda s,l:s==''or any(x==s[:len(x)]and f(s[len(x):],l)for x in l)

Ungolfed:

def f(s,l):
    if s=='': 
        return 1
    for x in l:
        if s.startswith(x) and f(s[len(x):],l):
            return 1
    return 0

0

เซิร์ฟเวอร์ SQL Sql, 353 ไบต์

u as(select s.n,s collate Latin1_General_BIN s,l collate Latin1_General_BIN l,
row_number()over(partition by l.n order by len(l)desc)r from s,l where s.n=l.n),
v as(select n,s,l,replace(s,l,'')c,r from u where r=1 union all
select u.n,u.s,u.l,replace(v.c,u.l,''),u.r from v,u where v.n=u.n and v.r+1=u.r)
select s,iif(min(c)='',1,0)u from v group by n,s

ทดสอบออนไลน์

รุ่นที่อ่านได้:

with s as(
  select n,s
  from(values(1,'Hello, world!'),
             (2,'la lal al '),
             (3,'this is a string'),
             (4,'thi is a string'),
             (5,'aaaaa'),
             (6,'foo bar foobar'),
             (7,'ababab'),
             (8,''))s(n,s)),
l as(
  select n,l
  from(values(1,'l'),(1,'He'),(1,'o, wor'),(1,'d!'),
             (2,'la'),(2,' l'),(2,'al '),
             (3,'this should return falsy'),
             (4,'this'),(4,'i i'),(4,' a'),(4,' string'),
             (5,'aa'),
             (6,'foo'),(6,'bar'),(6,' '),(6,'spam'),
             (7,'a'),(7,'ba'),(7,'ab'),
             (8,'The string can be constructed with nothing!'))l(n,l)),
--The solution starts from the next line.
u as(
  select s.n,
    s collate Latin1_General_BIN s,
    l collate Latin1_General_BIN l,
    row_number()over(partition by l.n order by len(l)desc)r
  from s,l
  where s.n=l.n),
v as(
  select n,s,l,replace(s,l,'')c,r from u where r=1
    union all
  select u.n,u.s,u.l,replace(v.c,u.l,''),u.r
  from v,u
  where v.n=u.n and v.r+1=u.r
)
select s,iif(min(c)='',1,0)u from v group by n,s

0

C, 140 ไบต์

ฉันแน่ใจว่ามีวิธีที่สั้นกว่าในการทำเช่นนี้ใน C แต่ฉันต้องการสร้างโซลูชันที่ทดสอบการรวม substrings ที่เป็นไปได้ทั้งหมดแทนที่จะใช้วิธีการค้นหา / แทนที่แบบปกติ

char p[999];c,o;d(e,g,l,f)int*e,**g,**l;{c=f&&c;for(l=g;*l;)strcpy(p+f,*l++),(o=strlen(p))<strlen(e)?d(e,g,0,o):(c|=!strcmp(e,p));return c;}

ลองออนไลน์

Ungolfed:

#include <string.h>
#include <stdio.h>

char buf[999];
int result;
int temp;

int test(char *text, char **ss, char **ptr, int length) 
{
    if (length == 0)
        result = 0;

    for(ptr = ss; *ptr; ptr++)
    {
        strcpy(buf + length, *ptr);
        temp = strlen(buf);
        if (temp < strlen(text))
        {
            // test recursivly
            test(text, ss, 0, temp);
        }
        else
        {
            if (strcmp(buf, text) == 0)
                result = 1;
        }
    }
    return result;
}

int main()
{
    char *text = "Hello,World";
    char *keywords[] = { "World", "Hello", ",", 0 };
    printf("%d", test(text, keywords, 0, 0));
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.