Uji apakah string dapat dibuat dengan substring!

23

Diberikan string sdan array / daftar l, tentukan apakah sdapat dibuat dengan bagian dari atau tidak l.

Misalnya, jika string adalah "Hello, world!"dan daftar adalah [' world!', 'Hello,'], maka program / fungsi harus mengembalikan nilai yang benar, karena Anda dapat mengatur daftar untuk membentuk string. Daftar berikut juga akan kembali nilai truthy: ['l', 'He', 'o, wor', 'd!']. Bayangkan saja 'l'mengisi di mana ia perlu di string. Jadi ya, Anda dapat mengulangi elemen daftar untuk membentuk string. Jika tidak dapat membentuk string, itu harus mengembalikan nilai falsy. Metode standar IO, berlaku celah standar.

Kasus uji:

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
Kamerad SparklePony
sumber
Apakah masalah jika array berisi lebih banyak string daripada yang dibutuhkan untuk membangun string utama?
Shaggy
Berapa nilai pengembalian dalam kasus-kasus itu?
Shaggy
@ Shaggy Truthy. Jika ada tambahan, maka string dapat dibangun dengan semua bagian non-ekstra. Saya akan menambahkan test case.
Kamerad SparklePony
3
Saya sarankan menambahkan test case ini:"ababab", ["a","ba","ab"]
pecandu matematika
3
Saya sarankan Anda menambahkan test case yang berisi regex metacharacters.
Joey

Jawaban:

11

Brachylog , 8 byte

~c¬{∋¬∈}

Cobalah online!

Ini sangat lambat. Butuh sekitar 37 detik untuk "Halo, dunia!" test case pada PC saya, dan batas waktu pada TIO.

Ini mengambil string melalui variabel Input dan daftar melalui variabel Output

Penjelasan

             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 .
Fatalisasi
sumber
"la lal al" lebih dari 60 detik ...
RosLuP
1
@RosLuP Dengan masukan ini dan ["la", " l", "al "]sebagai daftar, itu diakhiri di komputer saya dan dijawab dengan benar false.setelah 6800 detik, dan "hanya" 113 miliar kesimpulan.
Fatalkan
Saya merasa seperti menulis apa pun dalam bahasa ini akan menghasilkan program yang tidak dapat dijalankan di TIO haha.
Magic Gurita Guci
@carusocomputing Bahasa ini tidak terlalu lambat untuk sebagian besar program, hanya saja dalam beberapa kasus karena deklaratifitas program, ini menghasilkan waktu eksekusi yang sangat sangat lambat (yang dapat ditingkatkan secara drastis dengan biaya panjang kode)
Fatalize
@Fatalize errr ... Maksud saya mengatakan golf tidak menulis, sepertinya semakin sedikit instruksi, semakin luas "pertanyaan" menjadi dan semakin banyak perhitungan yang Anda butuhkan. Sepertinya bahasa yang luar biasa untuk masalah matematika teoretis.
Guci Gurita Sihir
7

Mathematica, 29 byte

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

Penjelasan:

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

Solusi kecurangan Borderline, 21 byte

StringMatchQ[#,#2..]&

Karena Mathematica adalah bahasa pemrograman simbolik, tidak ada * perbedaan antara ekspresi List[a,b,...]dan Alternatives[a,b,...]selain bagaimana mereka berinteraksi dengan simbol lain dan bagaimana mereka ditampilkan ( {a,b,...}dan a|b|..., masing-masing). Ketika digunakan dalam argumen kedua StringMatchQ, Alternativesekspresi diperlakukan sebagai pola string, dan dengan demikian kita dapat menyimpan 8byte di atas solusi saya di atas dengan mengambil argumen kedua sebagai Alternativesekspresi.

* Secara teknis Listjuga Locked, yang mencegah pengguna Unprotectuntuk mengubahnya dan mengubah perilakunya.

ngenisis
sumber
1
{x,y,z}diperlakukan sama seperti x|y|zuntuk pencocokan pola string. Saya pikir Anda bisa menggantinya ""|##&@@#2..dengan adil #2...
Bukan pohon
5

Pyth, 23 byte

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

Mengambil input seperti [['string'],['list', 'of', 'parts']]. Outputnya berupa daftar kosong atau daftar dengan nilai di dalamnya. Dalam Pyth, daftar yang berisi apa pun, bahkan string nol ( ['']), bernilai true.

Cobalah online!

Penjelasan:

                             | 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

Solusi ini terus-menerus mencoba untuk menghapus setiap bagian yang mungkin dari awal string, dan melacak nilai apa yang masih perlu dilihat.

Jika kita melihat nilai Gdalam kasus uji [['ababab'],['a','ba','ab']]setelah setiap iterasi dari loop sementara, inilah yang kita dapatkan:

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

Dan, dalam kasus uji [['aaaaa'],['aa']], inilah yang kami dapatkan:

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

Saya membuat test case lain, [['aaaaaa'],['a','aa','aaa']]dan hasilnya adalah ini:

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

Daftar output berisi banyak sampah di dalamnya, tetapi itu masih merupakan nilai yang sebenarnya.

K Zhang
sumber
5

Perl 5 , 39 byte

38 byte kode + -pbendera.

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

Cobalah online!

Untuk input "Hello, world!", ["l", "He", "o, wor", "d!"](sebenarnya dipisahkan oleh baris baru), ia membangun pola l|He|o, wor|d!|(dengan metacharacters lolos, terima kasih kepada \Q..\E), dan kemudian melihat apakah string pertama cocok dengan pola ini /^($v)*$/.

Pada TryItOnline, perhatikan bahwa harus ada baris baru yang tertinggal.

Dada
sumber
"Halo, dunia! L He o, wor d!" input ini dengan spasi setelah "l" tidak menghasilkan apa
apa
@RosLuP Bisakah Anda memberi saya tautan TryItOnline? (Saya tidak mengerti apa yang Anda maksud dengan tepat. Perhatikan bahwa "false" sebenarnya tidak mencetak apa-apa karena ini adalah Perl)
Dada
Jadi untuk cetak palsu apa-apa? Dalam hal ini maafkan saya, tapi ini tidak ada nilai output yang menurut saya terlalu berguna ...
RosLuP
@ RosLuP Benar. Dalam Perl, undefadalah nilai falsy yang dikembalikan oleh sebagian besar builtin. Dan ketika mencetaknya, sebenarnya tidak ada yang dicetak. Dan itulah yang saya lakukan. Mencetak "1/0" adalah alami untuk bahasa seperti C, tetapi untuk Perl, "1 / undef" adalah cara alami.
Dada
Tidak ada output yang memiliki satu ambiguitas "sedang berjalan atau programnya salah?"
RosLuP
4

PHP, 69 Bytes

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

Testcases

Jörg Hülsermann
sumber
Sangat pintar, perlu waktu sebentar untuk mengerti apa yang kamu lakukan. +1 untuk berpikir di luar kotak
Martijn
Salah negatif untuk kasing tepi yang jelek["", ["The string can be constructed with nothing!"]]
Jonathan Allan
@ Jonathan Allan lakukan adalah string kosong string?
Jörg Hülsermann
Ya, masalah partisi kosong adalah masalah dalam banyak solusi.
Jonathan Allan
3

Python 2, 141 byte

lambda s,l:s in[''.join(i)for r in range(len(s)+1)for j in combinations_with_replacement(l,r)for i in permutations(j)]
from itertools import*

Cobalah secara Online!

Sangat tidak efisien. Kasus uji pertama kali habis pada TIO.

pecandu matematika
sumber
3

JavaScript (ES6), 59 byte

Mengambil array substring adan string sdalam sintaks currying (a)(s). Pengembalian false/ true.

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

Berkomentar

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

Uji kasus

Arnauld
sumber
3

Haskell , 35 byte

#mengambil a Stringdan daftar Strings, dan mengembalikan a Bool.

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

Cobalah online!

Hanya saja, saya tidak keberatan dengan test case yang saya tinggalkan karena meronta-ronta laptop saya yang sedikit, bahkan dengan -O2. Saya menduga GHC tidak menyatukan daftar elemen perantara 30517578125, ia memiliki terlalu banyak pembagian untuk mengumpulkan sampah dengan cepat, dan karena kasus uji salah, program harus menghasilkan semuanya ... jangan ragu untuk mencoba jika Anda bisa tangani itu.

mapM("":)(l<$s)adalah daftar semua cara membuat length sdaftar elemen yang berupa string kosong atau string l.

Ørjan Johansen
sumber
3

Pyth, 17 15 11 14 byte

AQ|!G}Ym-dH./G

Persyaratan untuk string kosong berubah, menambahkan 3 byte.

Penjelasan

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.

versi lama

AQ}Ym-dH./G

Lebih pendek dan berjalan dalam umur semesta!

Penjelasan

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

Ini sangat lambat, tetapi bekerja untuk kasus uji saya (kecil)

Penjelasan

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.

sumber
3

Jelly , 14 12 8 byte

;FŒṖḟ€Ạ¬

Cobalah online!

Bagaimana itu bekerja

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

perbaikan bug pada case "", ["The string can be constructed with nothing"]berkat @JonathanAllan

fireflame241
sumber
Salah negatif untuk"", ["The string can be constructed with nothing!"]
Jonathan Allan
Ini akan jauh lebih lambat tetapi ;FŒṖḟ⁹$€Ạ¬akan memperbaikinya.
Jonathan Allan
... dan Anda dapat menggunakan argumen yang tepat implisit untuk , sehingga Anda tidak perlu $atau : ;FŒṖḟ€Ạ¬.
Jonathan Allan
Grr, itulah yang saya dapatkan karena tidak menguji setiap testcase tunggal. Saya mungkin dapat mempertahankan 8 byte dengan mengganti ¬dengan operasi yang selalu mengembalikan true dengan argumen "" yang tepat.
fireflame241
^ well, saya mendapatkannya kembali ke 8 :)
Jonathan Allan
2

R, 49 byte

function(s,l)gsub(paste(l,collapse='|'),"",s)==""

Cobalah online!

Neil
sumber
2
Harus gagal ('x', '.'), tetapi tidak.
Joey
2

Pyth, 10 8 byte

f!-TQ./+zh

Suite uji

Ini mengambil daftar di baris pertama STDIN, dan string (tanpa tanda kutip) di baris kedua.

Untuk memulai, daftar disimpan Q, dan string disimpan z. Selanjutnya, kami membentuk semua kemungkinan partisi z. Setiap partisi akan difilter ( f) untuk memeriksa apakah hanya menggunakan potongan-potongan Q. Untuk melakukan ini, kami menghapus semua elemen Qdari T, partisi tempat kami mempartisi, dan secara logis meniadakan hasilnya !, sehingga hanya partisi tempat setiap elemen Qdisimpan.

Untuk memperbaiki masalah yang ''tidak memiliki partisi, kami menambahkan kata pertama kamus ke z, sehingga tidak akan menjadi string kosong.

isaacg
sumber
Paket tes melewatkan garis bawah (string kosong) - Apakah perlu mengutip? Dengan garis kosong atau ""sepertinya gagal kasus itu.
Jonathan Allan
String kosong tidak memiliki partisi, jadi sebenarnya hanya memberikan jawaban yang salah di sini. Sial, aku akan mencoba memperbaikinya.
isaacg
Perbaikan yang saya sarankan untuk Jelly adalah menyatukan string input dengan array input diratakan, mungkin Anda bisa melakukan hal yang sama?
Jonathan Allan
@ Jonathanathan Allan Saya melakukan sesuatu yang serupa, terima kasih.
isaacg
Kasing "", [""]dan "", []belum ditutup - jangan pergi ke sana :)
Jonathan Allan
2

PowerShell, 61 58 57 byte

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

Cobalah online!

Solusi lama:

{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};[int]!$s}
{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};0+!$s}  
Andrei Odegov
sumber
Yang ini hampir tidak bisa dibaca, jadi saya akan merekomendasikan untuk mengubahnya sedikit. Saya cukup yakin kebanyakan orang akan setuju.
Rɪᴋᴇʀ
Terima kasih atas penjelasan alasan koreksi solusi saya.
Andrei Odegov
1

Python 2, 64 byte

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

Coba ini secara online!

Neil
sumber
Saya pikir ini tidak sepenuhnya berhasil, cobalah ("aaaaaaa",["aa","aaa"]).
xnor
@ xnatau saya memperbaruinya. Ayo cari tahu, regex sangat cocok untuk ini.
Neil
4
Harus gagal ('x', '.'), kurasa, tapi tidak.
Joey
1
@nfnneil, kan? Hasil edit terakhir Anda adalah 10 jam yang lalu.
Dennis
1
... atau "Hello", ["\w"]dll.
Jonathan Allan
1

PowerShell, 78

$s,$l=$args;!($s-creplace(($l|sort -d length|%{[regex]::escape($_)})-join'|'))

Pendekatan berbasis regex cukup mudah.

Joey
sumber
1

CJam (16 byte)

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

Ini adalah blok anonim (fungsi) yang mengambil string dan array string pada stack. Demo online .

Ini menggunakan algoritma yang jelas:

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

Nilai kembali adalah array / string kosong (falsy) jika strtidak dapat dibuat, atau array yang berisi str(benar, bahkan jika stritu sendiri adalah string kosong) jika dapat dibuat.

Peter Taylor
sumber
@ RosLuP, saya tidak yakin apa yang Anda maksud. Test case khusus itu dieksekusi sangat cepat sehingga saya tidak bisa menghitungnya. Kasus uji lain memang membutuhkan waktu lama untuk dieksekusi, tetapi spek tidak menyertakan batasan waktu.
Peter Taylor
@RosLuP, demo online . Tapi saya tidak mengerti apa keluhan Anda.
Peter Taylor
1

C ++ (Bcc), 287 byte

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

karena saya tidak menulis atau menggunakan terlalu banyak next_permutation () saya tidak tahu apakah semua baik-baik saja. Saya tidak tahu 100% apakah itu solusi yang terlalu mungkin ini di luar kualitas ... Satu daftar string di sini adalah satu array pointer ke char; NULL diakhiri Algo itu mudah, ada satu algo yang linierinya coba jika semua string dalam daftar sesuai dengan argumen "a" string ada satu algo lain yang mengubah indeks daftar string sehingga mencoba semua kemungkinan kombinasi.

ungolf itu, tes kode dan hasilnya di sini

#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

ini akan dikompilasi dalam kompiler 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];}
RosLuP
sumber
Harus cinta C ++! :)
MEMark
1

Python, 66 byte

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

Tidak Disatukan:

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
RootTwo
sumber
0

Microsoft Sql Server, 353 byte

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

Uji secara online.

Versi yang dapat dibaca:

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
Andrei Odegov
sumber
0

C, 140 byte

Saya yakin ada cara yang lebih singkat untuk melakukan ini dalam C tetapi saya ingin membuat solusi yang menguji semua kombinasi yang mungkin dari substring daripada metode find / replace yang biasa.

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

Cobalah online

Tidak Disatukan:

#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));
}
Johan du Toit
sumber