Перевірте, чи можна створювати рядок із підрядками!


23

Враховуючи рядок sта масив / список l, визначте, чи sможна робити чи ні з частинами з l.

Наприклад, якщо рядок є, "Hello, world!"а список є [' world!', 'Hello,'], то програма / функція повинна повернути триєдне значення, оскільки ви можете упорядкувати список для формування рядка. Наступний список буде також повертати значення truthy: ['l', 'He', 'o, wor', 'd!']. Тільки уявіть собі 'l'заповнення там, де це потрібно в рядок. Так що так, ви можете повторити елементи списку, щоб сформувати рядок. Якщо він не може сформувати рядок, він повинен повернути хибне значення. Застосовуються стандартні методи ІО, стандартні лазівки.

Тестові приклади:

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 Truthy. Якщо є додаткові, то струна може бути побудована з усіма не зайвими частинами. Додам тестовий випадок.
Товариш SparklePony

3
Рекомендую додати цей тестовий випадок:"ababab", ["a","ba","ab"]
математика наркоман

3
Я б запропонував вам додати тестовий випадок, що містить метасимволи regex.
Джої

Відповіді:


11

Брахілог , 8 байт

~c¬{∋¬∈}

Спробуйте в Інтернеті!

Це справді повільно. На тему "Привіт, світ!" Пішло близько 37 секунд. тестовий випадок на моєму ПК та вичерпаний на 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 секунд ...
RosLuP

1
@RosLuP За допомогою цього введення та ["la", " l", "al "]списку він закінчився на моєму комп’ютері і правильно відповів false.через 6800 секунд і "лише" 113 мільярдів висновків.
Фаталізувати

Я відчуваю, що написання будь-якої мови цією мовою призведе до того, що програма, яку не можна виконати на TIO haha.
Magic Octopus Urn

@carusocomputing Для більшості програм мова не така повільна, це просто те, що в деяких випадках через декларативність програми це призводить до дуже повільних
термінів

@Fatalize errr ... Я мав на увазі сказати, що гольф не пише, схоже, що менше інструкцій, чим ширшим стає "питання" і чим більше потрібно розрахунків. Здається, дивним мовою для теоретичних задач з математики.
Чарівна восьминога урна

7

Математика, 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 список, що містить що-небудь, навіть нульовий рядок ( ['']), оцінюється як істинний.

Спробуйте в Інтернеті!

Пояснення:

                             | 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']]після кожної ітерації циклу while, це ми отримаємо:

['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!|(завдяки цьому метахарактори уникнули \Q..\E, а потім виглядає, чи відповідає перший рядок цьому шаблону /^($v)*$/.

На TryItOnline зауважте, що повинен бути зворотний новий рядок.


"Привіт, світ! L Він о, Wor d!" цей вхід з пробілом після "l" не дає результату
RosLuP

@RosLuP Чи можете ви мені надати посилання TryItOnline? (Я не розумію, що саме ви маєте на увазі. Зауважте, що "false" насправді нічого не друкує, оскільки це Perl)
Dada

Так що за фальшивий друк нічого? У цьому випадку вибачте, але це значення без виходу не здається мені надто корисним ...
RosLuP

@RosLuP Правильно. У Perl undef- це хибне значення, яке повертає більшість вбудованих. А друкуючи його, насправді нічого не друкується. І саме цим я займаюся. Друк "1/0" є природним для мов, подібних до С, але для Perl "1 / undef" - це природний спосіб.
Дада

Жоден вихід не має однозначності: "він працює або програма закінчується помилково?"
RosLuP

4

PHP, 69 байт

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

Тестові шафи


Дуже розумний, зайняв мені хвилинку, щоб зрозуміти, що ти робиш. +1 для роздумів поза межами
Martijn

Помилковий негатив для цього прикрого краю["", ["The string can be constructed with nothing!"]]
Джонатан Аллан

@JonathanAllan - це порожній рядок?
Йорг Гюльсерманн

Так, проблема порожнього розділення є проблемою в багатьох рішеннях.
Джонатан Аллан


3

JavaScript (ES6), 59 байт

Займає масив підрядків aта рядка sв синтаксисі currying (a)(s). Повернення false/ true.

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

Хаскелл , 35 байт

#бере a Stringі список Strings і повертає a Bool.

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

Спробуйте в Інтернеті!

Тільки не заперечуйте тестовий випадок, який я залишив, бо він розбив мій мізерний ноутбук, навіть із -O2. Я підозрюю, що GHC не змикає цей проміжний список елементів 30517578125, він має занадто багато спільного доступу, щоб швидко зібрати сміття, і оскільки тестовий випадок помилковий, програма повинна генерувати все це ... не соромтеся спробувати, якщо зможете впорайтеся з цим.

mapM("":)(l<$s)- це список усіх способів складання length sсписку елементів, з яких або порожні рядки, або рядки l.


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!"]
Джонатан Аллан

Це буде набагато повільніше, але ;FŒṖḟ⁹$€Ạ¬це виправить.
Джонатан Аллан

... і ви можете використовувати неявний правильний аргумент для , так що вам не потрібні $або : ;FŒṖḟ€Ạ¬.
Джонатан Аллан

Грр, ось що я отримую за тестування не кожної окремої шкали. Можливо, я зможу підтримувати 8 байт, замінивши ¬операцію, яка завжди повертає true з правильним аргументом "".
fireflame241

^ добре, я повернувся до 8 :)
Джонатан Аллан


2

Pyth, 10 8 байт

f!-TQ./+zh

Тестовий набір

Це займає список у першому рядку STDIN, а рядок (без лапок) у другому.

Для початку список зберігається у Q, а рядок - у z. Далі формуємо всі можливі розділи z. Кожен розділ буде відфільтрований ( f), щоб перевірити, чи він використовує лише шматки Q. Для цього ми видаляємо всі елементи Qз T, розділу, на який ми розбиваємо, і логічно заперечуємо результат !, так що лише розділи, де кожен елемент знаходивсяQ зберігається.

Щоб виправити проблему, що ''не має розділів, ми додаємо перше слово словника до z, щоб воно не було порожнім рядком.


У тестовому наборі пропущено нижній рядок (порожній рядок) - Чи потрібно цитування? З порожнім рядком або, ""здається, цей випадок не вдається.
Джонатан Аллан

У порожньому рядку немає розділів, тому він фактично просто дає неправильну відповідь. Дарн, я спробую це виправити.
isaacg

Виправлення, яке я запропонував для Jelly, полягало в тому, щоб об'єднати вхідний рядок із вхідним масивом сплющеним, можливо, ви можете зробити те саме?
Джонатан Аллан

@JonathanAllan Я зробив щось подібне, дякую.
isaacg

Випадки "", [""]і "", []не висвітлювалися - не їдьмо туди :)
Джонатан Аллан

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ɪᴋᴇʀ

Дякую за пояснення причини вашого виправлення мого рішення.
Андрій Одегов

1

Python 2, 64 байти

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

Спробуйте це в Інтернеті!


Я думаю, що це зовсім не працює, спробуйте ("aaaaaaa",["aa","aaa"]).
xnor

@xnor Я оновив його. Приходьте, щоб дізнатися, регулярно підходить для цього регулярний гекс.
Ніл

4
Мабуть, не вдається ('x', '.'), я думаю, але ні.
Джої

1
@nfnneil Ти це зробив? Ваша остання редакція була 10 годин тому.
Денніс

1
... або "Hello", ["\w"]т.д.
Джонатан Аллан

1

PowerShell, 78

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

Досить прямолінійний підхід на основі регулярних виразів.


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(truthy, навіть якщо strсам порожній рядок), якщо він може бути створений.


@RosLuP, я не впевнений, що ти маєш на увазі. Цей конкретний тестовий випадок виконується так швидко, що я фактично не можу його встигнути. Інші тестові випадки потребують тривалого часу для виконання, але специфікація не містить жодних часових обмежень.
Пітер Тейлор

@RosLuP, демонстрація в Інтернеті . Але я не розумію, яка у вас скарга.
Пітер Тейлор

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%, чи це занадто рішення, можливо, це не в якості ... Один список рядків - це один масив покажчиків на char; Закінчується NULL. Algo є простим, є одне algo, що лінійність спробуйте, якщо вся рядок у списку відповідає аргументу "a" рядок, є ще один algo, який перестановлює індекс списку рядків, щоб спробувати всі можливі комбінації.

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 ++! :)
ПАМ'ЯТЬ

1

Пітон, 66 байт

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

Безголівки:

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

Сервер Microsoft 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 існує коротший спосіб зробити це, але я хотів створити рішення, яке тестує всі можливі комбінації підрядків замість звичайного методу пошуку / заміни.

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

Спробуйте в Інтернеті

Безголівки:

#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));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.