Mes [sous] chaînes se cachent!

21

introduction

Il y a quelque temps, un utilisateur perdu de SO a posté une question ici et elle a maintenant été supprimée, mais je pense que ce serait un bon défi, alors c'est parti ...

Défi

Écrivez un programme ou une fonction complète qui prend deux chaînes et vérifie si une permutation de la première chaîne est une sous-chaîne de la deuxième chaîne.

Contribution

Deux chaînes, une chaîne et une sous-chaîne à tester (vous pouvez choisir l'ordre).

Sortie:

Une valeur vraie si la chaîne contient une permutation de la sous-chaîne.
Une valeur de falsey si la chaîne ne contient aucune permutation de la sous-chaîne.
Le test est sensible à la casse.

Exemples / cas de test

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy
Notts90
la source
La valeur de la vérité et de la falsey doit-elle être cohérente ou juste correctement la vérité ou la falsey?
Erik the Outgolfer
@EriktheOutgolfer juste approprié est très bien.
Notts90

Réponses:

14

Brachylog , 2 octets

sp

Essayez-le en ligne!

Explication

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
Fatalize
la source
4
Le bon outil pour le travail.
isaacg
7

JavaScript (ES6), 77 octets

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

Renvoie 1 ou 0.

Fragment

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

Rick Hitchcock
la source
2
C'est beaucoup plus rapide que les versions qui utilisent des permutations.
David Conrad
6

Python 2, 67 66 octets

Prend l'entrée sous forme de deux chaînes, la sous-chaîne en premier.

a=sorted
lambda s,S:a(s)in[a(S[n:n+len(s)])for n in range(len(S))]
TFeld
la source
1
Enregistrez un octet en le nommant sorted.
Jonathan Allan
6

05AB1E , 3 octets

όZ

Essayez-le en ligne!

-1 octet grâce à Emigna .

Explication:

ό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
Erik le Outgolfer
la source
Je ne pense pas que vous ayez besoin.
Emigna
Je ne sais pas si c'est mon téléphone mais TIO semble cassé, dit la langue introuvable.
Notts90
@ Notts90 C'est TIO v2 et non TIO Nexus, essayez de vider votre cache. Ça marche pour moi.
Erik the Outgolfer
@Emigna Apparemment "vectorisé" signifie le deuxième argument et non le premier ...
Erik the Outgolfer
2
Si seulement vous mettiez le barré 4
Neil A.
5

Java 8, 266 244 octets

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

Explication:

Essayez-le ici.

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)
Kevin Cruijssen
la source
En C #, un lambda vide est à la Action<params>place de Func<params, returnVal>. Je suppose que ce serait quelque chose de similaire.
TheLethalCoder
1
@TheLethalCoder Vous avez raison. Devrait utiliser Consumeret accept(...)au lieu de Functionet apply(...)quand je veux avoir un lambda avec un paramètre et pas de type de retour. Je suis actuellement apprendre Java 8. :) Mais depuis que je vais devoir changer void p(String p,String q), p("",p);et p(p+q.ch...,q.sub...)à p->q->, p.apply("").accept(p);et p.apply(p+q.ch...).accept(q.sub...)il est plus court d'utiliser une combinaison de lambda pour la méthode principale, et juste un Java 7 void p(String p,String q)méthode pour la méthode récursive.
Kevin Cruijssen
Bien
J'en ai utilisé un Function<String, Predicate<String>>dans le mien.
David Conrad
5

Gelée , 5 octets

Œ!ẇ€Ṁ

Essayez-le en ligne!

-1 merci à Emigna de m'avoir encouragé à réessayer le golf.

Explication:

Œ!ẇ€Ṁ Main link, dyadic
Œ!               the permutations of the left argument
  ẇ€  Is each of                                      in the right argument?
    Ṁ Maximum of boolean values 
Erik le Outgolfer
la source
5

Japt, 10 7 octets

á d!èV

Essayez-le en ligne


Explication

á 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
Hirsute
la source
4

Python , 60 octets

Une forme modifiée de la réponse de TFeld - allez donner un crédit!

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

Fonction récursive renvoyant le booléen True(vérité) ou une chaîne vide (fausse).

Essayez-le en ligne!

trie la sous-chaîne,, uet la même longueur de l'avant de la chaîne ,, (en tutilisant une tranche t[:len(u)]) si elles sont les mêmes, puis Trueest renvoyée, sinon si elle test toujours véridique (non vide) revient avec une mise en file d'attente t(en utilisant une tranche, t[1:]) . Si tdevient vide, le andn'est pas exécuté et ce vide test renvoyé.

Jonathan Allan
la source
Vous pouvez également avoir lambda comme paramètre: lambda u,t,s=sorted:pour un
Rod
@cat l'affectation est requise car la fonction est récursive.
Jonathan Allan
4

Pyth, 9 8 octets

sm}dQ.pE

-1 octet grâce à @Erik_the_Outgolfer

Prend deux chaînes entre guillemets, dont la seconde est la sous-chaîne.

Essayez!

KarlKastor
la source
OP a déclaré que cela peut être juste véridique / falsey, pas nécessairement cohérent, vous pouvez donc l'utiliser à la splace de }1.
Erik the Outgolfer
3

Mathematica, 55 50 octets

-5 octets de user202729

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

Résultats False si une permutation de la première entrée se trouve dans la deuxième chaîne. Renvoie Truesi une permutation de la première entrée n'est pas dans la deuxième chaîne.

Explication:

                                    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
Ian Miller
la source
La sortie doit seulement être "truey / falsey" et non littérale True/ False.
Ian Miller
Merci pour le rappel Characters.
Ian Miller
3

CJam , 13 12 octets

le!lf{\#)}:+

Essayez-le en ligne!

J'ai l'impression que CJam est vraiment limité par rapport aux autres langues de golf, mais c'est peut-être juste moi qui suis mauvais ...

Je pense à passer à un autre. 05AB1E semble amusant.

Correction d'un petit bug grâce à Erik l'Outgolfer
Coupez une bouchée car les nombres non nuls sont véridiques

Explication:

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
FrodCube
la source
Je pense que ce n'est pas valide, qu'en est-il des entrées aet abc?
Erik the Outgolfer
@EriktheOutgolfer Vous avez raison. Ce devrait être un> = 0 au lieu de> 0
FrodCube
1
Mais tu peux le faire W>.
Erik the Outgolfer
@EriktheOutgolfer serait le!lf{\#)}:+considéré comme une solution valable? Il devrait sortir 0si la chaîne n'est pas trouvée et un certain nombre positif sinon. Un nombre non nul est-il valide truthy?
FrodCube
Vous pouvez utiliser à la )place de W>, selon la clarification du PO.
Erik the Outgolfer
3

Java 9 JShell , 160 octets

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

(nouvelles lignes insérées pour plus de lisibilité)

Essayez-le en ligne!

Remarque: JShell inclut un certain nombre d'importations par défaut. En tant que solution Java 8 ou Java 9, il serait nécessaire d'importer:

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

Pour 45 octets supplémentaires, soit 205 octets au total. Le lien TIO ci-dessus est vers un programme Java 9 car TIO n'a pas actuellement JShell (et je ne sais pas comment JShell fonctionnerait sur TIO).

David Conrad
la source
Java 9 est une chose maintenant? : |
CalculatorFeline
@CalculatorFeline Les versions à accès anticipé sont disponibles depuis un certain temps, mais la date de sortie officielle est le 2017-07-27 .
David Conrad
2

C #, 320 octets

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

Je suis sûr que le calcul des permutations peut être beaucoup plus court mais je ne vois pas comment pour le moment.

Version formatée / complète:

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++);
        }
}
TheLethalCoder
la source
ouais, malheureusement, utiliser linq rend souvent les choses plus longues que simple pour (..) {}
Ewan
2

Rubis , 69 octets

->a,b{r=nil;a.chars.each_cons(b.size){|q|r||=q.sort==b.chars.sort};r}

Essayez-le en ligne!

Alex
la source
2

Perl 6 , 48 octets

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

Renvoie une jonction or de la présence de chaque permutation en tant que sous-chaîne. Par exemple, avec les arguments "Hello World!"et "d!l", renvoie:

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

... qui "s'effondre" Truedans un contexte booléen. Autrement dit, les jonctions sont des valeurs véridiques.

Sean
la source
2

PHP> = 7.1, 91 octets

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

Cas de test

Jörg Hülsermann
la source
1
Essayez ~$pau lieu de a&$p.
Titus
Lorsque j'essaie d'exécuter votre code en utilisant le lien, il dit inattendu,
Notts90
@ Notts90 Veuillez utiliser une version PHP sur 7.1
Jörg Hülsermann
@ JörgHülsermann qui fonctionne, il était par défaut à 7.0.3
Notts90
1

Haskell, 54 octets

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

Utiliser la puissance de Data.List pour les deux isInfixOf ainsi que permutations.

maple_shaft
la source
1

R , 103 octets

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

Essayez-le en ligne!

Retourne TRUEpour véridique et NApour falsey.

ngm
la source