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.