주어진 문자열에 맞는 단어 순서


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

@Doorknob, 예, 좋습니다. 입력 및 출력 구조는 유연합니다. 도전에 추가되었습니다.
로직 나이트

테스트 사례에서 떨어진 문자는 항상 단어 사이에있는 것으로 보입니다. 그렇습니까? 당신은 도전에서, 또는 단어 내에서 편지를 떨어 뜨린 테스트 사례를 포함해야합니다
Luis Mendo

그 세 번째 테스트 사례를 이해하지 못합니다. 당신의 대답은 cc앞에 두고 bb있지만 bbcc하위 문자열은 한 번만 bb나타나고 하위 문자열이 먼저 나타납니다.
Neil

@Neil, ccbcb문자열 부분 에서 middle을 떨어 뜨린 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

정말 좋은 방법입니다.
Leaky Nun

당신은 나를 물리 쳤다.
Leaky Nun

답변에 추가해 주시겠습니까?
Leaky Nun

1

자바 스크립트 (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실패시 반환합니다 . 실패시 빈 문자열 ( ?q:``)을 반환해야하는 경우 2 바이트를 추가합니다. 이 경우이 대체 버전은 120 바이트이고 실패시 빈 문자열을 반환하며 실패시 0을 반환하도록 허용 된 경우 2 바이트를 저장할 수도 있습니다.

(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:``

(이 글을 쓰고 난 후 알고리즘은 기본적으로 @KennyLau의 Pyth 답변과 동일하다는 것을 알았습니다.)

편집 된 편집 : 질문을 명확히 한 후에 업데이트되었지만 이제 세 번째 테스트 사례에서 실제로 느립니다. 전날 밤에 시작했고 오늘 아침에 30 ~ 40 시간 후에 실제로 해결책을 찾았 음을 알았습니다. 나는 정말로 의미가 있었고 솔루션을 공급했습니다 (역방향 솔루션과 가장 잘 작동하며 즉시 확인됩니다).


1

자바 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

그루비 (44 바이트)

다른 사람이 이것을 위해 정규 표현식을 사용하지 않았다는 것을 믿을 수 없습니다 ...

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

설명

/${b.join('|')}/-문자열에서 단어를 찾으려면 정규식을 만드십시오.
.findAll(...)-문자열의 모든 항목을 찾아서 배열로 수집하십시오.
.join(" ")-배열을 공백과 함께 결합하십시오.

기본적으로 발생이 없으면 배열은 비어 있고 빈 문자열을 암시 적으로 반환합니다. 어커런스가 발견되면 어커런스가있는 배열 객체를 반환 한 다음 문자열로 병합합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.