Minhas [sub] cordas estão escondidas!


21

Introdução

Há um tempo atrás, um usuário de SO perdido postou uma pergunta aqui e agora foi excluída, mas acho que seria um bom desafio, então aqui vai ...

Desafio

Escreva um programa ou função completo que use duas cadeias e verifique se alguma permutação da primeira cadeia é uma sub-cadeia da segunda cadeia.

Entrada

Duas strings, uma string e uma sub-string para testar (você pode escolher a ordem).

Saída:

Um valor verdadeiro se a sequência contiver alguma permutação da sub-sequência.
Um valor falsey se a sequência não contiver permutações da sub-sequência.
O teste diferencia maiúsculas de minúsculas.

Exemplos / casos de teste

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

O valor da verdade e da falsey deve ser consistente ou apenas adequadamente da verdade ou da falsey?
Erik the Outgolfer

@EriktheOutgolfer apenas apropriado está bem.
Notts90

Respostas:


14

Braquilog , 2 bytes

sp

Experimente online!

Explicação

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
Ferramenta certa para o trabalho.
Isaacg

7

JavaScript (ES6), 77 bytes

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

Retorna 1 ou 0.

Snippet

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
Isso é muito mais rápido que as versões que usam permutações.
David Conrad

6

Python 2, 67 66 bytes

Recebe entrada como duas seqüências, primeiro a substring.

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

1
Salve um byte nomeando sorted.
27617 Jonathan Allan

6

05AB1E , 3 bytes

όZ

Experimente online!

-1 byte graças a Emigna .

Explicação:

ό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

Eu não acho que você precisa.
Emigna

Não tenho certeza se é o meu telefone, mas o TIO parece quebrado, diz o idioma não encontrado.
Notts90

@ Notts90 É o TIO v2 e não o TIO Nexus, tente limpar o cache. Funciona para mim.
Erik the Outgolfer

@Emigna Aparentemente "vectorized" significa o segundo argumento não é a primeira ...
Erik o Outgolfer

2
Se você colocasse o riscado 4
Neil A.

5

Java 8, 266 244 bytes

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));}

Explicação:

Experimente aqui.

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)

Em C #, um lambda vazio é em Action<params>vez de Func<params, returnVal>. Suponho que seria algo semelhante.
TheLethalCoder

1
@TheLethalCoder Você está certo. Deve usar Consumere em accept(...)vez de Functione apply(...)quando eu quero ter um lambda com um parâmetro e nenhum tipo de retorno. Atualmente, estou aprendendo Java 8. :) Mas como terei que mudar void p(String p,String q), p("",p);e p(p+q.ch...,q.sub...)para p->q->, p.apply("").accept(p);e p.apply(p+q.ch...).accept(q.sub...)é mais curto usar uma combinação de lambda para o método principal e apenas um void p(String p,String q)método Java 7 para o método recursivo.
Kevin Cruijssen

Bom, pelo menos você descobri-lo
TheLethalCoder

Eu usei um Function<String, Predicate<String>>no meu.
David Conrad

5

Geléia , 5 bytes

Œ!ẇ€Ṁ

Experimente online!

-1 obrigado a Emigna por me encorajar a tentar jogar golfe novamente.

Explicação:

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

5

Japonês, 10 7 bytes

á d!èV

Experimente online


Explicação

á 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 bytes

Uma forma alterada da resposta do TFeld - vá dar algum crédito!

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

Função recursiva retornando o booleano True(truthy) ou uma string vazia (falsy).

Experimente online!

classifica a subcadeia, ue o mesmo comprimento da frente da cadeia, t(usando uma fatia t[:len(u)]) se forem iguais, então Trueé retornado; caso contrário, se tainda é verdade (não está vazio), retorna com uma desenfileirada t(usando uma fatia t[1:]) . Se tficar vazio, ele andnão será executado e esse vazio tserá retornado.


Você também pode ter lambda como parâmetro: lambda u,t,s=sorted:para um one-liner, nenhum byte salvo embora
Rod

@cat a atribuição é necessária, pois a função é recursiva.
Jonathan Allan

4

Pitão, 9 8 bytes

sm}dQ.pE

-1 byte graças a @Erik_the_Outgolfer

Leva duas seqüências de caracteres entre aspas, a segunda das quais é a substring.

Tente!


A OP disse que pode ser apenas verdade / falsey, não necessariamente consistente, para que você possa usar em svez de }1.
Erik the Outgolfer

3

Mathematica, 55 50 bytes

-5 bytes do usuário202729

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

Retorna Falsese uma permutação da primeira entrada estiver na segunda sequência. Retorna Truese uma permutação da primeira entrada não estiver na segunda sequência.

Explicação:

                                    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

A saída precisa ser "verdade / falsey" e não literal True/ False.
Ian Miller

Obrigado por lembrar sobre Characters.
Ian Miller

3

CJam , 13 12 bytes

le!lf{\#)}:+

Experimente online!

Sinto que o CJam é realmente limitado em comparação com outras línguas do golfe, mas talvez seja apenas eu sendo ruim ...

Estou pensando em mudar para outro. 05AB1E parece divertido.

Corrigido um pequeno erro graças a Erik, o Outgolfer.
Corte uma mordida porque números diferentes de zero são verdadeiros

Explicação:

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

Eu acho que isso é inválido, e quanto a entradas ae abc?
Erik the Outgolfer

@EriktheOutgolfer Você está certo. Deve ser um> = 0 em vez de> 0
FrodCube 26/05

1
Mas você pode fazer W>.
Erik the Outgolfer

@EriktheOutgolfer seria le!lf{\#)}:+considerado uma solução válida? Deverá produzir 0se a string não for encontrada e algum número positivo, caso contrário. Um número diferente de zero é válido truthy?
FrodCube

Você pode usar em )vez de W>, conforme o esclarecimento do OP.
Erik the Outgolfer

3

Java 9 JShell , 160 bytes

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()))

(novas linhas inseridas para facilitar a leitura)

Experimente online!

Nota: O JShell inclui várias importações por padrão. Como uma solução Java 8 ou Java 9, seria necessário importar:

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

Para 45 bytes extras ou 205 bytes no total. O link do TIO acima é para um programa Java 9, já que o TIO atualmente não possui o JShell (e não está claro para mim como o JShell funcionaria no TIO).


Java 9 é uma coisa agora? : |
CalculatorFeline

@CalculatorFeline As versões de acesso antecipado já estão disponíveis há algum tempo, mas a data oficial de lançamento é 27/07/2017 .
David Conrad

2

C #, 320 bytes

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++);}}

Tenho certeza de que o cálculo das permutações pode ser muito menor, mas não vejo como no momento.

Versão formatada / completa:

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++);
        }
}

sim, infelizmente, usando linq muitas vezes torna as coisas mais do que simples para (..) {}
Ewan


2

Perl 6 , 48 bytes

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

Retorna uma junção ou da presença de cada permutação como uma substring. Por exemplo, com argumentos "Hello World!"e "d!l", retorna:

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

... que "é recolhido" Trueem um contexto booleano. Ou seja, junções são valores verdadeiros.



1

Haskell, 54 bytes

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

Usando o poder do Data.List para ambos isInfixOf, bem como permutations.


1

R , 103 bytes

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

Experimente online!

Retorna TRUEpara verdade e NApara falsey.



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.