我的[sub]字符串隐藏了!


21

介绍

不久前,一个迷失的SO用户在这里发布了一个问题,现在将其删除了,但我认为这将是一个很好的挑战,所以就在这里...

挑战

编写一个包含两个字符串并检查第一个字符串的任何排列是否为第二个字符串的子字符串的完整程序或函数。

输入项

两个字符串,一个字符串和一个子字符串进行测试(您可以选择顺序)。

输出:

如果字符串包含子字符串的任何排列,则为真实值。
如果字符串不包含子字符串的任何排列,则为falsey值。
该测试区分大小写。

示例/测试用例

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

真假价值必须一致还是恰如其分?
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer刚刚合适就可以了。
Notts90 '17

Answers:


14

Brachylog,2个字节

sp

在线尝试!

说明

Input variable = "Hello World!", Output variable = "d!rl"

(?)s        Take a substring of the Input variable
    p(.)    It is a permutation of the Output variable

4
正确的工作工具。
isaacg

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字节

将输入作为两个字符串,首先是子字符串。

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

在线尝试!

-1字节感谢Emigna

说明:

ό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 '17

找不到语言,不确定是不是我的手机,但TIO似乎坏了。
Notts90 '17

@ Notts90不是TIO v2,而是TIO v2,请尝试清除缓存。这个对我有用。
暴民埃里克(Erik the Outgolfer)'17年

@Emigna显然是“向量化的”,意味着第二个参数而不是第一个参数……
Outgolfer的Erik

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#中,空lambda Action<params>代替Func<params, returnVal>。我认为这将是类似的事情。
TheLethalCoder

1
@TheLethalCoder你是对的。应使用Consumeraccept(...),而不是Functionapply(...)我想有一个参数和返回式拉姆达。目前,我正在学习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...)它是更短的使用拉姆达的组合为主要方法,而只是一个Java 7 void p(String p,String q)的递归方法的方法。
凯文·克鲁伊森

很好,至少您已经弄明白了
TheLethalCoder

Function<String, Predicate<String>>在我的身上用过。
戴维·康拉德

5

果冻,5个字节

Œ!ẇ€Ṁ

在线尝试!

-1感谢Emigna鼓励我重试高尔夫。

说明:

Œ!ẇ€Ṁ Main link, dyadic
Œ!               the permutations of the left argument
  ẇ€  Is each of                                      in the right argument?
    Ṁ Maximum of boolean values 

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作为参数:lambda u,t,s=sorted:对于单线,虽然没有保存字节
Rod

@cat分配是必需的,因为该函数是递归的。
乔纳森·艾伦


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/即可False
伊恩·米勒

感谢您的提醒Characters
伊恩·米勒

3

CJam13 12字节

le!lf{\#)}:+

在线尝试!

与其他高尔夫语言相比,我觉得CJam确实很受限制,但是也许这只是我不好。

我正在考虑搬到另一个地方。05AB1E似乎很有趣。

修复了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如何呢?
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer你说得对。它应该是> = 0而不是> 0
FrodCube


@EriktheOutgolfer将le!lf{\#)}:+被视为有效的解决方案?0如果找不到该字符串,则应输出,否则输出一些正数。非零数字有效truthy吗?
FrodCube

根据OP的说明,您可以使用)代替W>
暴民埃里克(Erik the Outgolfer)'17年

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链接指向Java 9程序,因为TIO当前没有JShell(我尚不清楚JShell如何在TIO上工作)。


Java 9现在是问题吗?:|
CalculatorFeline

@CalculatorFeline的早期访问建立已经使用了相当长一段时间,但官方发布日期是2017年7月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通常会使事情变得比for(..){}的简单化
。– Ewan


2

Perl 6,48个字节

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

以子字符串形式返回每个置换的存在或相交。例如,使用参数"Hello World!""d!l",返回:

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

... True在布尔上下文中“折叠”为。也就是说,结点是真实的值。



1

Haskell,54个字节

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

同时使用Data.List isInfixOfpermutations


1

R,103字节

function(w,x,y=u(w),z=u(x)){for(i in 1:n(w)){F=F|!sum(setdiff(y[1:n(x)+i-1],z))};F}
u=utf8ToInt
n=nchar

在线尝试!

返回TRUE的truthy和NA对falsey。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.