¡Mis [sub] cuerdas se esconden!


21

Introducción

Hace un tiempo, un usuario SO perdido publicó una pregunta aquí y ahora se ha eliminado, pero creo que sería un buen desafío, así que aquí va ...

Reto

Escriba un programa o función completa que tome dos cadenas y verifique si alguna permutación de la primera cadena es una subcadena de la segunda cadena.

Entrada

Dos cadenas, una cadena y una subcadena para probar (puede elegir el orden).

Salida:

Un valor verdadero si la cadena contiene alguna permutación de la subcadena.
Un valor falso si la cadena no contiene permutaciones de la subcadena.
La prueba distingue entre mayúsculas y minúsculas.

Ejemplos / casos de prueba

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

¿Deben ser consistentes los valores de veracidad y falsey o simplemente de verdad o falsey?
Erik the Outgolfer

@EriktheOutgolfer simplemente apropiado está bien.
Notts90

Respuestas:


14

Brachylog , 2 bytes

sp

Pruébalo en línea!

Explicación

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

44
Herramienta adecuada para el trabajo.
isaacg

7

JavaScript (ES6), 77 bytes

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

Devuelve 1 o 0.

Retazo

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
Esto es mucho más rápido que las versiones que usan permutaciones.
David Conrad

6

Python 2, 67 66 bytes

Toma la entrada como dos cadenas, la subcadena primero.

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

1
Guarde un byte nombrando sorted.
Jonathan Allan

6

05AB1E , 3 bytes

όZ

Pruébalo en línea!

-1 byte gracias a Emigna .

Explicación:

ό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

No creo que lo necesites.
Emigna

No estoy seguro de si es mi teléfono, pero TIO parece roto, dice el idioma no encontrado.
Notts90

@ Notts90 Es TIO v2 no TIO Nexus, intente borrar su caché. Esto funciona para mi.
Erik the Outgolfer

@Emigna Aparentemente "vectorizado" significa el segundo argumento, no el primero ...
Erik the Outgolfer

2
Si tan solo pusieras el tachado 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));}

Explicación:

Pruébalo aquí

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)

En C # un vacío lambda es en Action<params>lugar de Func<params, returnVal>. Supongo que sería algo similar.
TheLethalCoder

1
@TheLethalCoder Tienes razón. Debería usar Consumery en accept(...)lugar de Functiony apply(...)cuando quiero tener una lambda con un parámetro y sin tipo de retorno. Actualmente estoy aprendiendo Java 8. :) Pero como tendré que cambiar void p(String p,String q), p("",p);y p(p+q.ch...,q.sub...)para p->q->, p.apply("").accept(p);y p.apply(p+q.ch...).accept(q.sub...)es más corto usar una combinación de lambda para el método principal, y solo un void p(String p,String q)método Java 7 para el método recursivo.
Kevin Cruijssen

Bien

Usé un Function<String, Predicate<String>>en el mío.
David Conrad


5

Japt, 10 7 bytes

á d!èV

Pruébalo en línea


Explicación

á 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

Una forma alterada de la respuesta de TFeld : ¡ve a dar algo de crédito!

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

Función recursiva que devuelve el booleano True(verdadero) o una cadena vacía (falso).

Pruébalo en línea!

clasifica la subcadena, uy la misma longitud del frente de la cadena, t(usando un corte t[:len(u)]) si son iguales y luego Truese devuelve, de lo contrario si taún es verdadero (no está vacío) se repite con un dequeued t(usando un corte t[1:]) . Si tse vacía, andno se ejecuta y tse devuelve este vacío .


También puede tener lambda como parámetro: lambda u,t,s=sorted:para una línea, sin embargo, no se guarda ningún byte
Rod

@cat la asignación es necesaria ya que la función es recursiva.
Jonathan Allan

4

Pyth, 9 8 bytes

sm}dQ.pE

-1 byte gracias a @Erik_the_Outgolfer

Toma dos cadenas citadas, la segunda de las cuales es la subcadena.

¡Intentalo!


OP dijo que puede ser simplemente verdadero / falso, no necesariamente consistente, por lo que puede usarlo en slugar de }1.
Erik the Outgolfer

3

Mathematica, 55 50 bytes

-5 bytes del usuario202729

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

Devuelve Falsesi una permutación de la primera entrada está en la segunda cadena. Devuelve Truesi una permutación de la primera entrada no está en la segunda cadena.

Explicación:

                                    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

El resultado solo debe ser "verdadero / falso", no literal True/ False.
Ian Miller

Gracias por recordarlo Characters.
Ian Miller

3

CJam , 13 12 bytes

le!lf{\#)}:+

Pruébalo en línea!

Siento que CJam es realmente limitado en comparación con otros idiomas de golf, pero tal vez solo soy yo siendo malo ...

Estoy pensando en mudarme a otro. 05AB1E parece divertido.

Se corrigió un pequeño error gracias a Erik the Outgolfer.
Cortó una mordida porque los números que no son cero son verdaderos

Explicación:

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

Creo que esto no es válido, ¿qué pasa con las entradas ay abc?
Erik the Outgolfer

@EriktheOutgolfer Tienes razón. Debería ser un> = 0 en lugar de> 0
FrodCube

1
Pero puedes hacer W>.
Erik the Outgolfer

¿@EriktheOutgolfer se le!lf{\#)}:+consideraría una solución válida? Debería salir 0si la cadena no se encuentra y algún número positivo de lo contrario. ¿Es válido un número distinto de cero truthy?
FrodCube

Puede usar en )lugar de W>, según la aclaración de 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()))

(líneas nuevas insertadas para facilitar la lectura)

Pruébalo en línea!

Nota: JShell incluye varias importaciones por defecto. Como una solución Java 8 o Java 9, sería necesario importar:

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

Para 45 bytes adicionales, o 205 bytes en total. El enlace TIO anterior es a un programa Java 9 ya que TIO actualmente no tiene JShell (y no tengo claro cómo JShell funcionaría en TIO).


Java 9 es una cosa ahora? : |
CalculatorFeline

@CalculatorFeline Las compilaciones de acceso temprano han estado disponibles durante bastante tiempo, pero la fecha de lanzamiento oficial es 2017-07-27 .
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++);}}

Estoy seguro de que calcular las permutaciones puede ser mucho más corto, pero no puedo ver cómo en este momento.

Versión formateada / 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++);
        }
}

sí, desafortunadamente, usar linq a menudo hace las cosas más largas que simples para (..) {}
Ewan


2

Perl 6 , 48 bytes

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

Devuelve una unión o de la presencia de cada permutación como una subcadena. Por ejemplo, con argumentos "Hello World!"y "d!l", devuelve:

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

... que "colapsa" Trueen un contexto booleano. Es decir, las uniones son valores verdaderos.


2

PHP> = 7.1, 91 bytes

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

Casos de prueba


1
Intenta en ~$plugar de a&$p.
Titus

Cuando intento ejecutar su código usando el enlace dice inesperado ,
Notts90

@ Notts90 Utilice una versión de PHP superior a la 7.1
Jörg Hülsermann

@ JörgHülsermann que funciona, había predeterminado a
7.0.3

1

Haskell, 54 bytes

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

Usando el poder de Data.List para ambos isInfixOf, así 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

Pruébalo en línea!

Vuelve TRUEpor veracidad y NApor falsey.



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.