Впорядкування слів, щоб вони вмістилися в заданий рядок


10

Враховуючи рядок літер і набір слів, виведіть впорядкування слів, щоб їх можна було знайти в рядку, видаляючи літери, які не потрібні. Слова можуть зустрічатися не раз у наборі слів. Вхідний рядок і всі слова будуть складатися з 1 до 1000 малих літер кожна. Букви, які потрібно відпустити, можуть виникати всередині слів або між словами

Ваша програма або функція може сприймати буквений рядок і слова як списки, рядки або зі STDIN, і повинна виводити всі слова у правильному порядку у вигляді списку або виведення рядка. Якщо правильне рішення більше, виведіть лише одне з них. Якщо немає можливого правильного рішення, виведіть порожній список або порожній рядок.

Приклади:

dogcatfrog cat frog dog
-> dog cat frog

xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat

dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd

flea antelope
->
(no solution)

Це код гольфу. Найменша кількість виграних байтів.

Редагувати: Поясни, що зайві символи можуть бути всередині слів.


Чи може формат введення бути одним рядком, а потім іншим списком решти рядків?
Дверна ручка

@Doorknob, так, це добре. Вхідні та вихідні структури гнучкі. Додано до виклику.
Логічний лицар

З тестових випадків випливає, що виписані літери завжди знаходяться між словами. Невже це так? Слід зазначити, що у виклику або включити тестовий випадок із літерами, відкинутими в межах слова
Луїс Мендо

Я не розумію цього третього тестового випадку; Ваш відповідь ставить ccперед тим, bbале bbі ccподстрок з'являються тільки один раз і bbподстрока з'являється першим.
Ніл

@Neil, у ccbcbчастині рядка ми виводимо ccтоді вихід bbпісля відкидання середини c.
Логічний лицар

Відповіді:


5

Pyth, 20 24 байти

Моя перша спроба на Pyth :)

Jcw;FG.ptJI:hJj".*"G0jdG

Як це працює:

Jcw;FG.ptJI:hJj".*"G0jdG
Jcw                         assign("J",chop(input()))
    FG.ptJ                  for G in permutations(tail(J)):
          I:hJj".*"G0        if match(head(J),join(".*",G)):
                     jdG      print(join(" ",G))

Примітки: у третьому прикладі ( dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc) триває багато часу .


5

Pyth, 10 байт

h@s./Myz.p

Демонстрація

Ця програма дуже жорстока сила. Спочатку будується кожен підмножина вводу, потім кожен розділ підмножини, а потім перевіряється на перший, який є переупорядкуванням списку слів. Ніякі можливості не обробляються через помилки, без виводу в stdout, що дозволено мета-консенсусом. Помилку можна усунути для 2-х зайвих байтів.

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


Ви пропустили другу перевірку.
Leaky Nun

@KennyLau Коли я спробую цей випадок, він просто не повертається за розумний проміжок часу. Однак це не дає неправильної відповіді. Я думаю, що це працює. Чи є у вас тестовий випадок, коли він дає відповідь, і ця відповідь неправильна?
isaacg

Дійсно приємний метод.
Лина монашка

Ти перемогла мене.
Лина монашка

Чи можете ви додати це до відповіді?
Лина монашка

1

JavaScript (ES6), 119 байт

(s,a,t=``,...r)=>a[0]?a.find((w,i)=>(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)))&&q:~s.search(t.split``.join`.*`)&&(q=r)

Приймає рядок і масив слів і повертає масив слів або undefinedпісля відмови. Додайте 2 байти, якщо він повинен повернути порожній рядок при відмові ( ?q:``), в цьому випадку ця альтернативна версія становить лише 120 байт і повертає порожню рядок при відмові, і навіть може зберегти 2 байти, якщо дозволено повернути 0 при відмові:

(s,a,t=``,...r)=>a[0]?a.reduce((q,w,i)=>q||(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)),0):~s.search([...t].join`.*`)?r:``

(Написавши це, я помітив, що алгоритм в основному такий же, як і відповідь Pyth @ KennyLau.)

Відредаговано редагування: оновлено після уточнення питання, але зараз третій тест справді повільний; Я відклав це в ніч до останнього, і сьогодні вранці я лише помітив, що він насправді знайшов рішення, десь між 30 і 40 годинами пізніше. Я дійсно мав на увазі, хоча і подав рішення до нього (він найкраще працює із зворотним рішенням, яке він перевірить миттєво).


1

Java 7, 256 байт

import java.util.*;String c(String...a){Map s=new HashMap();int j,i=1,l=a[0].length();for(;i<a.length;i++)if((j=a[0].indexOf(a[i]))>-1)s.put(j,s.get(j)!=null?s.get(j)+" "+a[i]:a[i]);a[0]="";for(j=0;j<l;j++)a[0]+=s.get(j)!=null?s.get(j)+" ":"";return a[0];}

Однозначно можна було б більше грати в гольф, використовуючи інший підхід, але це буде робити зараз.

Невикористаний і тестовий код:

Спробуйте тут.

import java.util.*;
class M{
  static String c(String... a){
    Map s = new HashMap();
    int j,
        i = 1,
        l = a[0].length();
    for(; i < a.length; i++){
      if((j = a[0].indexOf(a[i])) > -1){
        s.put(j, s.get(j) != null
                  ? s.get(j) + " " + a[i]
                  : a[i]);
      }
    }
    a[0] = "";
    for(j = 0; j < l; j++){
      a[0] += s.get(j) != null
               ? s.get(j) + " "
               : "";
    }
    return a[0];
  }

  public static void main(String[] a){
    System.out.println(c("dogcatfrog", "cat", "frog", "dog"));
    System.out.println(c("xxcatfixsxhingonxgrapexxxfishingcxat", "cat", "grape", "catfish", "fishing"));
    System.out.println(
        c("dababbabadbaccbcbaaacdacdbdd ", "aa", "bb", "cc", "dd", "ba", "ba", "ba", "ab", "ac", "da", "db", "dc"));
    System.out.println(c("flea", "antelope"));
  }
}

Вихід:

dog cat frog 
cat grape fishing 
da ab ba ba ba bb db ac cc aa dd 

1

Groovy (44 байт)

Я не можу повірити, що ніхто більше не використовував для цього реджекси ...

{a,b->a.findAll(/${b.join('|')}/).join(" ")}

Пояснення

/${b.join('|')}/- Створіть регулярний вираз, щоб знайти будь-яке слово в рядку.
.findAll(...)- Знайдіть і збирайте всі події в рядку в масив.
.join(" ")- Приєднуйтесь до масиву разом з пробілами.

В основному, якщо жодних подій немає, масив порожній і повертає порожній рядок неявно. Якщо він виявляє події, він повертає об’єкт масиву з входженнями, а потім згладжує його в рядок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.