[サブ]文字列が隠れています。


21

前書き

しばらく前に、失われたSOユーザーがここに質問を投稿し、現在削除されていますが、良い挑戦になると思うので、ここに行きます...

チャレンジ

2つの文字列を取り、最初の文字列の順列が2番目の文字列のサブ文字列であるかどうかをチェックする完全なプログラムまたは関数を作成します。

入力

テストする文字列とサブ文字列の2つの文字列(順序を選択できます)。

出力:

文字列に部分文字列の順列が含まれる場合の真の値。
ストリングにサブストリングの順列が含まれていない場合はfalse値。
テストでは大文字と小文字が区別されます。

例/テストケース

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

真実と偽の値は一貫している必要がありますか?
エリックアウトゴルファー

@EriktheOutgolferだけが適切です。
Notts90

回答:



7

JavaScript(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
これは、順列を使用するバージョンよりもはるかに高速です。
デビッドコンラッド

6

Python 2、67 66バイト

入力を2つの文字列として、サブストリングが最初になります。

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

1
という名前でバイトを保存しますsorted
ジョナサンアラン

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

あなたが必要だとは思わない.
エミグナ

電話かどうかはわかりませんが、TIOは壊れているようです。
Notts90

@ Notts90 TIO NexusではなくTIO v2です。キャッシュをクリアしてください。わたしにはできる。
エリックアウトゴルファー

@Emignaどうやら「ベクトル化」は、最初の引数ではなく、2番目の引数を意味します...
Erik the Outgolfer

2
あなただけが入れたい場合は消さ4
ニールA.

5

Java 8、266 244バイト

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(...)代わりにFunctionandを使用する必要がありapply(...)ます。私は現在のJava 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...)mainメソッドのためのラムダの組み合わせを使用することが短く、ちょうどJavaの7 void p(String p,String q)再帰法のための方法。
ケビンCruijssen

ニース、少なくともあなたはそれを考え出した
-TheLethalCoder

Function<String, Predicate<String>>は鉱山で使用しました。
デビッドコンラッド


5

Japt、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

Python、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:。1ライナーの場合、バイトは保存されません
Rod

@cat関数は再帰的であるため、割り当てが必要です。
ジョナサンアラン


3

Mathematica、55 50バイト

user202729から-5バイト

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

False最初の入力の順列が2番目の文字列にあるかどうかを返します。True最初の入力の順列が2番目の文字列にない場合に返します。

説明:

                                    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/ ではなく、「真/偽​​」である必要がありますFalse
イアンミラー

についてのリマインダーをありがとうCharacters
イアンミラー

3

CJam 13 12バイト

le!lf{\#)}:+

オンラインでお試しください!

CJamは他のゴルフ言語に比べて本当に制限されているように感じますが、おそらく私が悪いだけなのかもしれません...

私は別の場所に移ることを考えています。05AB1Eは楽しいようです。

Erik the Outgolferのおかげで小さなバグが修正されました
ゼロ以外の数字は真実であるため Cutの1回の噛み傷の

説明:

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
エリックアウトゴルファー

@EriktheOutgolferあなたは正しいです。> 0ではなく> = 0でなければなりません
-FrodCube

1
しかし、あなたはできるW>
エリックアウトゴルファー

@EriktheOutgolferはle!lf{\#)}:+有効なソリューションと見なされますか?0文字列が見つからない場合は出力し、それ以外の場合は正の数を出力する必要があります。ゼロ以外の数値は有効ですtruthyか?
FrodCube

OPの説明に従って、の)代わりに使用できますW>
エリックアウトゴルファー

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には現在JShellがないため、上記のTIOリンクはJava 9プログラムへのリンクです(JShellがTIOでどのように機能するかは明確ではありません)。


Java 9は今のものですか?:|
CalculatorFeline

@CalculatorFeline アーリーアクセスビルドはかなり前から利用できましたが、公式リリース日は2017-07-27です。
デビッドコンラッド

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は、多くの場合、(..)のためのシンプルよりも長いものを作る{}
ユアン・


2

Perl 6、48バイト

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

各置換の存在の論理和を部分文字列として返します。たとえば、引数"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
タイタス

リンクを使用してコードを実行しようとすると、予期しないことを示しています,
-Notts90

@ Notts90 7.1上でPHPのバージョンを使用してください
イェルクHülsermann

動作する@JörgHülsermannは、デフォルトで7.0.3
Notts90

1

Haskell、54バイト

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

Data.Listの機能をisInfixOfだけでなく両方に使用しpermutationsます。




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.