내 [서브] 줄이 숨어 있습니다!


21

소개

얼마 전에 잃어버린 SO 사용자가 여기에 질문을 게시했으며 지금은 삭제되었지만 좋은 도전을 할 것이라고 생각합니다.

도전

두 개의 문자열을 사용하고 첫 번째 문자열의 순열이 두 번째 문자열의 하위 문자열인지 확인하는 전체 프로그램 또는 함수를 작성하십시오.

입력

테스트 할 두 개의 문자열, 문자열 및 하위 문자열 (순서를 선택할 수 있음).

산출:

문자열에 하위 문자열의 순열이 포함되어 있으면 참된 값입니다.
문자열에 하위 문자열의 순열이 포함되어 있지 않으면 거짓 값입니다.
테스트는 대소 문자를 구분합니다.

예제 / 테스트 사례

         sub-string    string          
input    d!rl          Hello World!
output   truthy

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

진실과 허위 가치는 일관성이 있어야하거나 적절하게 진실하거나 허위이어야합니까?
Outgolfer Erik

@EriktheOutgolfer가 적절합니다.
Notts90

답변:



7

자바 스크립트 (ES6), 77 바이트

(s,t)=>t&&[...t.slice(0,s.length)].sort()+''==[...s].sort()|f(s,t.slice(1))

1 또는 0을 반환합니다.

단편

f=

(s,t)=>t&&[...t.slice(0,s.length)].sort()+''==[...s].sort()|f(s,t.slice(1))

console.log(f('d!rl','Hello World!'))                   //1
console.log(f('Pog','Programming Puzzles & Code Golf')) //0
console.log(f('ghjuyt','asdfhytgju1234'))               //1


2
순열을 사용하는 버전보다 훨씬 빠릅니다.
David Conrad

6

파이썬 2, 67 66 바이트

입력을 두 개의 문자열 (하위 문자열부터)로 취합니다.

a=sorted
lambda s,S:a(s)in[a(S[n:n+len(s)])for n in range(len(S))]

1
이름을 지정하여 바이트를 저장하십시오 sorted.
Jonathan Allan

6

05AB1E , 3 바이트

όZ

온라인으로 사용해보십시오!

Emigna 덕분에 -1 바이트 .

설명:

όZ 2 inputs
œ                  permutations of the first input
 å  Is each of the                                 in the second input?
  Z Take the maximum of the resulting boolean list

나는 당신이 필요하다고 생각하지 않습니다.
Emigna

내 전화인지 확실하지 않지만 TIO가 고장난 것 같습니다.
Notts90

@ Notts90 TIO Nexus가 아닌 TIO v2입니다. 캐시를 지우십시오. 그것은 나를 위해 작동합니다.
Outgolfer Erik

@Emigna 분명히 "벡터화"수단 두 번째 인수하지 첫 번째 ...
에릭 Outgolfer

2
만약 당신이 크로스 아웃
Neil A.

5

자바 8, 266244 바이트

import java.util.*;Set l=new HashSet();s->p->{p("",p);for(Object x:l)if(s.contains(x+""))return 1>0;return 0>1;}void p(String p,String q){int n=q.length(),i=0;if(n<1)l.add(p);else for(;i<n;)p(p+q.charAt(i),q.substring(0,i)+q.substring(++i,n));}

설명:

여기에서 시도하십시오.

java.util.*;                   // Required import for Set and HashSet

Set l=new HashSet();           // Class-level Set

s->p->{                        // Method (1) with two String parameters and boolean return-type
  p("",p);                     //  Put all permutations in the class-level Set
  for(Object x:l)              //  Loop over the permutations:
    if(s.contains(x+""))       //   If the input String contains one of the permutations:
      return 1>0;//true        //    Return true
                               //  End of loop (implicit / single-line body)
  return 0>1;//false           //  Return false
}                              // End of method (1)

void p(String p,String q){     // Method (2) with two String parameters and no return-type
  int n=q.length(),i=0;        //  Two temp integers
  if(n<1)                      //  If `n` is zero:
    l.add(p);                  //   Add this permutation of the String to the Set
  else                         //  Else:
    for(;i<n;                  //   Loop over `n`
      p(p+q.charAt(i),q.substring(0,i)+q.substring(++i,n))
                               //    Recursive-call with permutation parts
    );                         //   End of loop (no body)
}                              // End of method (2)

C #에서 void 람다는 Action<params>대신에 사용 Func<params, returnVal>됩니다. 나는 그것이 비슷한 것이라고 가정합니다.
TheLethalCoder

1
@TheLethalCoder 당신이 맞아요. 사용해야 Consumeraccept(...)대신 Functionapply(...)내가 매개 변수없이 리턴 유형 람다를하고자 할 때. 저는 현재 자바 8 배우고 :)하지만 변경해야하기 때문에 void p(String p,String q), p("",p);p(p+q.ch...,q.sub...)p->q->, p.apply("").accept(p);그리고 p.apply(p+q.ch...).accept(q.sub...)그것의 주요 방법에 대한 람다의 조합을 사용하는 짧은, 단지 자바 7 void p(String p,String q)재귀-방법에 대한 방법.
Kevin Cruijssen

적어도, 당신은 알아 냈습니다
TheLethalCoder

나는 Function<String, Predicate<String>>내에서 사용했다 .
David Conrad


5

apt, 10 7 바이트

á d!èV

온라인으로 사용해보십시오


설명

á d@VèX  
         :Implicit input of (sub)string U
á        :Create an array of all possible permutations of U
  d      :Map over the array, checking if any element returns true for...
   @     :the function that checks..
     è   :the number of matches...
      X  :of current element (permutation) X...
    V    :in main string V.
         :(0 is falsey, anything else is truthy)
         :Implicit output of result

4

파이썬 , 60 바이트

TFeld의 답변 의 변경된 형태 -약간의 크레딧을주십시오!

s=sorted
f=lambda u,t:s(u)==s(t[:len(u)])or t and f(u,t[1:])

부울 True(거짓) 또는 빈 문자열 (거짓)을 반환하는 재귀 함수

온라인으로 사용해보십시오!

문자열, 정렬 u하고, 문자열의 앞의 같은 길이 것은 t, (조각을 사용하여 t[:len(u)]그들이 다음 같은 경우) True, 반환, 그렇지 않은 경우는 t여전히 truthy (비어 있지 않은)로 재귀하는 대기열 t(조각을 사용하여 t[1:]) . t비어 있으면 이 and실행되지 않고이 비어 t있습니다.


람다를 매개 변수로 사용할 수도 있습니다 lambda u,t,s=sorted:. 한 줄짜리의 경우 바이트가 저장되지 않음
Rod

@cat 함수는 재귀 적이므로 할당이 필요합니다.
Jonathan Allan

4

Pyth, 9 8 바이트

sm}dQ.pE

@Erik_the_Outgolfer 덕분에 -1 바이트

두 개의 따옴표로 묶인 문자열을 가져옵니다. 두 번째 문자열은 하위 문자열입니다.

시도 해봐!


OP는 그것이 진실성 / 거짓 일 수 있으며 반드시 일관성이있는 것은 아니기 때문에 s대신 사용할 수 있다고 말했다 }1.
Outgolfer Erik

3

Mathematica, 55 50 바이트

user202729에서 -5 바이트

StringFreeQ[#2,""<>#&/@Permutations@Characters@#]&

False첫 번째 입력의 순열이 두 번째 문자열에 있는지 여부를 반환 합니다. True첫 번째 입력의 순열이 두 번째 문자열에없는 경우를 반환 합니다.

설명:

                                    Characters@#   - split first string into array of characters
                       Permutations@               - make all permutations
               ""<>#&/@                            - join each array of characters together to form a single string
StringFreeQ[#2,                                 ]& - Check if any of these string is in the second input string

출력은 리터럴 True/이 아닌 "truthy / falsey"여야 False합니다.
Ian Miller

에 대해 알려 주셔서 감사합니다 Characters.
Ian Miller

3

CJam , 13 12 바이트

le!lf{\#)}:+

온라인으로 사용해보십시오!

CJam이 다른 골프 언어와 비교할 때 실제로 제한적이라고 생각하지만, 나만 나쁜 것 같습니다 ...

나는 다른 곳으로 이사하는 것에 대해 생각하고 있습니다. 05AB1E가 재미있어 보입니다.

0이 아닌 숫자가 진실이기 때문에 Outgolfer Erik 한 번만 물어서 작은 버그가 수정
되었습니다.

설명:

l                 Read substring
 e!               Generate all permutations
   l              Read string
    f{            For each permutation
      \#            Check if it is in the string (returns -1 if not found)
        )           Add one
         }        End for
          :+      Sum the whole found/not found array

나는 이것이 무엇 입력에 대한 잘못된 생각 aabc?
Outgolfer Erik

@EriktheOutgolfer 당신이 맞아요. > 0 대신> = 0이어야합니다.
FrodCube

1
그러나 당신은 할 수 있습니다 W>.
Outgolfer Erik

@EriktheOutgolfer는 le!lf{\#)}:+유효한 솔루션으로 간주됩니까? 0문자열을 찾을 수 없으면 출력 하고 그렇지 않으면 양수를 출력 해야합니다. 0이 아닌 숫자가 유효 truthy합니까?
FrodCube

OP의 설명에 따라 )대신 대신 사용할 수 있습니다 W>.
Outgolfer Erik

3

Java 9 JShell , 160 바이트

p->q->IntStream.range(0,q.length()-p.length()+1).anyMatch(
    i->Arrays.equals(
        q.substring(i,i+p.length()).chars().sorted().toArray(),
        p.chars().sorted().toArray()))

(가독성을 위해 줄 바꿈 삽입)

온라인으로 사용해보십시오!

참고 : JShell에는 기본적으로 많은 가져 오기가 포함되어 있습니다. Java 8 또는 Java 9 솔루션으로서 다음을 가져와야합니다.

import java.util.*;import java.util.stream.*;

추가 45 바이트 또는 총 205 바이트 위의 TIO 링크는 TIO에 현재 JShell이 ​​없기 때문에 Java 9 프로그램에 대한 링크입니다 (그리고 JShell이 ​​TIO에서 어떻게 작동하는지는 명확하지 않습니다).


Java 9는 지금인가? : |
CalculatorFeline

@CalculatorFeline 초기 액세스 빌드 는 꽤 오랫동안 사용 가능했지만 공식 릴리스 날짜는 2017-07-27 입니다.
David Conrad

2

C #, 320 바이트

using System.Linq;s=>u=>p(u.ToArray(),0,u.Length-1).Any(p=>s.Contains(p));w=(c,a,b)=>{if (a!=b)(var t=c[a];c[a]=c[b];c[b]=t;)};System.Collections.Generic.IEnumerable<string>p(char[]l,int k,int m){if(k==m)yield return new string(l);else for(int i=k;i<=m;){w(l,k,i);foreach(var c in p(l,k+1,m))yield return c;w(l,k,i++);}}

순열을 계산하는 것이 훨씬 더 짧을 수는 있지만 지금은 방법을 알 수 없습니다.

포맷 / 풀 버전 :

void test()
{
    Func<string, Func<string, bool>> f = s => u =>
        p(u.ToArray(), 0, u.Length - 1).Any(p => s.Contains(p));

    Console.WriteLine(f("Hello World!")("d!rl"));
    Console.WriteLine(f("Programming Puzzles & Code Golf")("Pog"));
    Console.WriteLine(f("asdfhytgju1234")("ghjuyt"));
}

System.Collections.Generic.IEnumerable<string>p(char[] l, int k, int m)
{
    Action<char[], int, int> w = (c, a, b) =>
    {
        if (a != b)
        {
            var t = c[a];
            c[a] = c[b];
            c[b] = t;
        }
    };

    if (k == m)
        yield return new string(l);

    else
        for (int i = k; i <= m;)
        {
            w(l, k, i);

            foreach (var c in p(l, k + 1, m))
                yield return c;

            w(l, k, i++);
        }
}

예, 안타깝게도 linq를 사용하면 일을 단순하게하는 것 (..) {}보다 길어집니다.
Ewan


2

펄 6 , 48 바이트

{$^a.contains(any $^b.comb.permutations».join)}

각 순열의 존재에 대한 or-junction을 하위 문자열로 반환합니다. 예를 들어, 인수 "Hello World!"및과 함께 "d!l"다음을 반환합니다.

any(False, False, False, False, True, False)

... True부울 컨텍스트에서 "붕괴"합니다 . 즉, 정션은 진실한 가치입니다.


2

PHP> = 7.1, 91 바이트

for([,$x,$y]=$argv;~$p=substr($y,$i++,strlen($x));)$t|=($c=count_chars)($x)==$c($p);echo$t;

테스트 케이스


1
~$p대신 사용해보십시오 a&$p.
Titus

링크를 사용하여 코드를 실행하려고하면 예기치 않은 메시지가 표시됩니다,
Notts90

@ Notts90 7.1 이상의 PHP 버전을 사용하십시오
Jörg Hülsermann

@ JörgHülsermann 작동하지만 기본값은 7.0.3입니다.
Notts90

1

하스켈, 54 바이트

import Data.List
s#t=any(`isInfixOf`s)$permutations t

isInfixOf뿐만 아니라 Data.List의 힘을 사용합니다 permutations.




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