Le mie [sotto] stringhe si nascondono!


21

introduzione

Qualche tempo fa un utente SO perso ha pubblicato una domanda qui e ora è stato eliminato, ma penso che sarebbe una bella sfida, quindi eccola ...

Sfida

Scrivi un programma o una funzione completa che accetta due stringhe e controlla se qualsiasi permutazione della prima stringa è una sottostringa della seconda stringa.

Ingresso

Due stringhe, una stringa e una sottostringa da verificare (è possibile scegliere l'ordine).

Produzione:

Un valore veritiero se la stringa contiene qualsiasi permutazione della sottostringa.
Un valore false se la stringa non contiene permutazioni della sottostringa.
Il test fa distinzione tra maiuscole e minuscole.

Esempi / casi di test

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

Il valore di verità e falsità deve essere coerente o solo verità o falsità appropriatamente?
— Erik the Outgolfer,

@EriktheOutgolfer è appropriato.
— Notts90,

Risposte:


14

Brachylog , 2 byte

sp

Provalo online!

Spiegazione

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
Strumento giusto per il lavoro.
— isaacg,

7

JavaScript (ES6), 77 byte

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

Restituisce 1 o 0.

Frammento

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
Questo è molto più veloce rispetto alle versioni che usano permutazioni.
— David Conrad,

6

Python 2, 67 66 byte

Accetta l'input come due stringhe, prima la sottostringa.

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

1
Salva un byte nominando sorted.
— Jonathan Allan,

6

05AB1E , 3 byte

όZ

Provalo online!

-1 byte grazie a Emigna .

Spiegazione:

ό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

Non credo che ti serva.
— Emigna

Non sono sicuro che sia il mio telefono, ma TIO sembra rotto, dice la lingua non trovata.
— Notts90,

@ Notts90 È TIO v2 non TIO Nexus, prova a svuotare la cache. Per me funziona.
— Erik the Outgolfer,

@Emigna Apparentemente "vettorializzato" significa che il secondo argomento non è il primo ...
— Erik the Outgolfer,

2
Se solo avessi messo il barrato 4
— Neil A.

5

Java 8, 266 244 byte

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

Spiegazione:

Provalo qui.

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)

In C # è Action<params>invece un vuoto lambda Func<params, returnVal>. Presumo che sarebbe qualcosa di simile.
— TheLethalCoder

1
@TheLethalCoder Hai ragione. Dovrei usare Consumere accept(...)invece di Functione apply(...)quando voglio avere una lambda con un parametro e nessun tipo di ritorno. Attualmente sto imparando Java 8. :) Ma dal momento che dovrò cambiare void p(String p,String q), p("",p);e p(p+q.ch...,q.sub...)in p->q->, p.apply("").accept(p);ed p.apply(p+q.ch...).accept(q.sub...)è più breve usare una combinazione di lambda per il metodo principale e solo un void p(String p,String q)metodo Java 7 per il metodo ricorsivo.
— Kevin Cruijssen,

— Bene

Ho usato un Function<String, Predicate<String>>nel mio.
— David Conrad,

5

Gelatina , 5 byte

Œ!ẇ€Ṁ

Provalo online!

-1 grazie a Emigna per avermi incoraggiato a riprovare a giocare a golf.

Spiegazione:

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

5

Japt, 10 7 byte

á d!èV

Provalo online


Spiegazione

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

Una forma alterata della risposta di TFeld : vai a dare credito!

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

Funzione ricorsiva che restituisce il booleano True(verità) o una stringa vuota (falsa).

Provalo online!

ordina la sottostringa, ue la stessa lunghezza della parte anteriore della stringa, t(usando una sezione t[:len(u)]) se sono uguali, Trueviene restituita, altrimenti se tè ancora veritiera (non vuota) si ricorre con un dequeued t(usando una sezione, t[1:]) . Se tdiventa vuoto andnon viene eseguito e questo vuoto tviene restituito.


Puoi anche avere lambda come parametro: lambda u,t,s=sorted:per un liner, nessun byte salvato però
— Rod

@cat l'assegnazione è obbligatoria poiché la funzione è ricorsiva.
— Jonathan Allan,

4

Pyth, 9 8 byte

sm}dQ.pE

-1 byte grazie a @Erik_the_Outgolfer

Accetta due stringhe tra virgolette, la seconda delle quali è la sottostringa.

Provalo!


OP ha detto che può essere solo verità / falsità, non necessariamente coerente, quindi puoi usare sinvece di }1.
— Erik the Outgolfer,

3

Mathematica, 55 50 byte

-5 byte dall'utente202729

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

Restituisce Falsese una permutazione del primo input è nella seconda stringa. Restituisce Truese una permutazione del primo input non è nella seconda stringa.

Spiegazione:

                                    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

L'output deve essere solo "verità / falsità" non letterale True/ False.
— Ian Miller,

Grazie per il promemoria in merito Characters.
— Ian Miller,

3

CJam , 13 12 byte

le!lf{\#)}:+

Provalo online!

Sento che CJam è davvero limitato rispetto ad altre lingue del golf, ma forse sono solo io a essere cattivo ...

Sto pensando di trasferirmi in un altro. 05AB1E sembra divertente.

Risolto un piccolo bug grazie a Erik the Outgolfer
Taglia un morso perché i numeri diversi da zero sono veritieri

Spiegazione:

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

Penso che questo non sia valido, che dire degli input ae abc?
— Erik the Outgolfer,

@EriktheOutgolfer Hai ragione. Dovrebbe essere un> = 0 invece di> 0
— FrodCube

1
Ma puoi farlo W>.
— Erik the Outgolfer,

@EriktheOutgolfer sarebbe le!lf{\#)}:+considerata una soluzione valida? Dovrebbe essere emesso 0se la stringa non viene trovata e un numero positivo in caso contrario. Un numero diverso da zero è valido truthy?
— FrodCube,

È possibile utilizzare )invece di W>, per chiarimento del PO.
— Erik the Outgolfer,

3

Java 9 JShell , 160 byte

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

(newline inserite per leggibilità)

Provalo online!

Nota: JShell include una serie di importazioni per impostazione predefinita. Come soluzione Java 8 o Java 9, sarebbe necessario importare:

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

Per ulteriori 45 byte o 205 byte in totale. Il link TIO sopra è a un programma Java 9 poiché TIO non ha attualmente JShell (e non mi è chiaro come JShell funzionerebbe su TIO).


Java 9 è una cosa adesso? : |
— CalculatorFeline

@CalculatorFeline Le build di accesso anticipato sono disponibili da un po 'di tempo, ma la data di rilascio ufficiale è 27/07/2017 .
— David Conrad,

2

C #, 320 byte

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

Sono sicuro che il calcolo delle permutazioni può essere molto più breve ma al momento non riesco a capire come.

Versione formattata / 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ì, sfortunatamente l'uso di linq spesso rende le cose più lunghe che semplici per (..) {}
— Ewan


2

Perl 6 , 48 byte

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

Restituisce una giunzione or della presenza di ogni permutazione come sottostringa. Ad esempio, con argomenti "Hello World!"e "d!l", restituisce:

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

... che "collassa" Truein un contesto booleano. Cioè, le giunzioni sono valori veritieri.


2

PHP> = 7.1, 91 byte

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

Casi test


1
Prova ~$pinvece di a&$p.
— Tito,

Quando provo a eseguire il tuo codice usando il link, dice inaspettato,
— Notts90,

@ Notts90 Utilizzare una versione di PHP oltre 7.1
— Jörg Hülsermann,

@ JörgHülsermann che funziona, il valore predefinito era 7.0.3
— Notts90,

1

Haskell, 54 byte

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

Utilizzando la potenza di Data.List per entrambi isInfixOfe permutations.


1

R , 103 byte

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

Provalo online!

Ritorna TRUEper la verità e NAper la falsità.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.