Meine [Unter] Saiten verstecken sich!


21

Einführung

Vor einiger Zeit hat ein verlorener SO-Benutzer hier eine Frage gestellt und diese wurde nun gelöscht, aber ich denke, dass sie eine gute Herausforderung darstellen würde.

Herausforderung

Schreiben Sie ein vollständiges Programm oder eine vollständige Funktion, die zwei Zeichenfolgen verwendet und prüft, ob eine Permutation der ersten Zeichenfolge eine Unterzeichenfolge der zweiten Zeichenfolge ist.

Eingang

Zwei Zeichenfolgen, eine Zeichenfolge und eine Unterzeichenfolge zum Testen (Sie können die Reihenfolge auswählen).

Ausgabe:

Ein wahrer Wert, wenn die Zeichenfolge eine Permutation der Teilzeichenfolge enthält.
Ein Falsey-Wert, wenn die Zeichenfolge keine Permutationen der Unterzeichenfolge enthält.
Der Test unterscheidet zwischen Groß- und Kleinschreibung.

Beispiele / Testfälle

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

Muss der Wert von Wahrhaftigkeit und Falschheit konsistent sein oder nur der Wert von Wahrhaftigkeit oder Falschheit entsprechen?
Erik der Outgolfer

@EriktheOutgolfer nur angemessen ist in Ordnung.
Notts90

Antworten:



7

JavaScript (ES6), 77 Byte

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

Gibt 1 oder 0 zurück.

Ausschnitt

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
Dies ist viel schneller als die Versionen, die Permutationen verwenden.
David Conrad

6

Python 2, 67 66 Bytes

Nimmt die Eingabe als zwei Zeichenfolgen, wobei die Teilzeichenfolge an erster Stelle steht.

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

1
Speichern Sie ein Byte, indem Sie einen Namen vergeben sorted.
Jonathan Allan

6

05AB1E , 3 Bytes

όZ

Probieren Sie es online!

-1 Byte dank Emigna .

Erläuterung:

ό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

Ich glaube nicht, dass Sie brauchen.
Emigna

Ich bin nicht sicher, ob es mein Telefon ist, aber TIO scheint kaputt zu sein, sagt, dass die Sprache nicht gefunden wurde.
Notts90

@ Notts90 Es ist TIO v2, nicht TIO Nexus. Versuchen Sie, den Cache zu leeren. Für mich geht das.
Erik der Outgolfer

@Emigna Anscheinend "vektorisiert" bedeutet das zweite Argument nicht das erste ...
Erik der Outgolfer


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

Erläuterung:

Probieren Sie es hier aus.

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 # steht ein void Lambda Action<params>statt Func<params, returnVal>. Ich gehe davon aus, dass es ähnlich wäre.
TheLethalCoder

1
@TheLethalCoder Du hast recht. Sollte Consumerund accept(...)anstelle von Functionund verwenden, apply(...)wenn ich ein Lambda mit einem Parameter und keinem Rückgabetyp haben möchte. Ich lerne zur Zeit Java 8. :) Aber da werde ich ändern müssen void p(String p,String q), p("",p);und p(p+q.ch...,q.sub...)zu p->q->, p.apply("").accept(p);und p.apply(p+q.ch...).accept(q.sub...)es ist kürzer eine Kombination von Lambda für das Hauptverfahren zu verwenden, und nur ein Java 7 void p(String p,String q)Verfahren für die rekursive-Methode.
Kevin Cruijssen

Schön, zumindest hast du es herausgefunden
TheLethalCoder

Ich habe einen Function<String, Predicate<String>>in meinem benutzt.
David Conrad

5

Gelee , 5 Bytes

Œ!ẇ€Ṁ

Probieren Sie es online!

-1 Dank an Emigna, die mich ermutigt hat, noch einmal Golf zu spielen.

Erläuterung:

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

5

Japt, 10 7 Bytes

á d!èV

Probieren Sie es online aus


Erläuterung

á 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

Eine veränderte Form von TFelds Antwort - geben Sie etwas Anerkennung!

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

Rekursive Funktion, die den Booleschen TrueWert (truthy) oder einen leeren String (falsy) zurückgibt.

Probieren Sie es online!

sortiert die Teilkette , uund die gleiche Länge von der Vorderseite der Saite t, (eine Scheibe verwendet t[:len(u)]) , wenn sie gleich sind , dann Truezurückgegeben, andernfalls , wenn tnoch truthy (nicht leer) recurses mit einer aus der Warteschlange entfernt t(unter Verwendung eine Scheibe, t[1:]) . Wenn tleer wird, wird das andnicht ausgeführt und dieses leer twird zurückgegeben.


Sie können auch Lambda als Parameter verwenden: lambda u,t,s=sorted:Für einen
Rod

@cat Die Zuweisung ist erforderlich, da die Funktion rekursiv ist.
Jonathan Allan

4

Pyth, 9 8 Bytes

sm}dQ.pE

-1 Byte danke an @Erik_the_Outgolfer

Nimmt zwei Strings in Anführungszeichen, von denen der zweite der Teilstring ist.

Versuch es!


OP sagte, dass es nur Truthy / Falsey sein kann, nicht unbedingt konsistent, so dass Sie sanstelle von verwenden können }1.
Erik der Outgolfer

3

Mathematica, 55-50 Bytes

-5 Bytes von user202729

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

Gibt zurück, Falseob sich eine Permutation der ersten Eingabe in der zweiten Zeichenfolge befindet. Gibt zurück, Truewenn sich eine Permutation der ersten Eingabe nicht in der zweiten Zeichenfolge befindet.

Erläuterung:

                                    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

Die Ausgabe muss nur "truthy / falsey" sein, nicht wörtlich True/False .
Ian Miller

Vielen Dank für die Erinnerung an Characters.
Ian Miller

3

CJam , 13 12 Bytes

le!lf{\#)}:+

Probieren Sie es online!

Ich habe das Gefühl, dass CJam im Vergleich zu anderen Golfsprachen sehr eingeschränkt ist, aber vielleicht bin ich nur schlecht ...

Ich denke darüber nach, zu einem anderen zu ziehen. 05AB1E scheint Spaß zu machen.

Kleiner Fehler behoben, der Erik dem Outgolfer
zu verdanken war

Erläuterung:

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

Ich denke das ist ungültig, was ist mit Eingaben aund abc?
Erik der Outgolfer

@EriktheOutgolfer Du hast recht. Es sollte ein> = 0 anstelle von> 0 sein
FrodCube

1
Aber du kannst es tun W>.
Erik der Outgolfer

@EriktheOutgolfer wäre le!lf{\#)}:+eine gültige Lösung? Es sollte ausgegeben werden, 0wenn die Zeichenfolge nicht gefunden wird, und ansonsten eine positive Zahl. Ist eine Zahl ungleich Null gültig truthy?
FrodCube

Sie können )anstelle von W>OPs Klarstellung verwenden.
Erik der 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()))

(Zeilenumbrüche zur besseren Lesbarkeit eingefügt)

Probieren Sie es online!

Hinweis: JShell enthält standardmäßig eine Reihe von Importen. Als Java 8- oder Java 9-Lösung müsste Folgendes importiert werden:

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

Für zusätzliche 45 Bytes oder 205 Bytes insgesamt. Der obige TIO-Link bezieht sich auf ein Java 9-Programm, da TIO derzeit nicht über JShell verfügt (und mir nicht klar ist, wie JShell unter TIO funktionieren würde).


Java 9 ist jetzt eine Sache? : |
CalculatorFeline

@CalculatorFeline Die frühen Builds für den Zugriff sind seit geraumer Zeit verfügbar, das offizielle Veröffentlichungsdatum ist jedoch der 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++);}}

Ich bin sicher, dass die Berechnung der Permutationen viel kürzer sein kann, aber ich kann im Moment nicht sehen, wie.

Formatiert / Vollversion:

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

Ja, leider macht die Verwendung von Linq die Dinge oft länger als einfach für (..) {}
Ewan


2

Perl 6 , 48 Bytes

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

Gibt eine Oder-Verknüpfung des Vorhandenseins jeder Permutation als Teilzeichenfolge zurück. Zum Beispiel gibt mit Argumenten "Hello World!"und "d!l"Folgendes zurück:

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

... was Truein einem booleschen Kontext "zusammenbricht" . Das heißt, Junctions sind wahrheitsgemäße Werte.


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;

Testfälle


1
Versuchen Sie es ~$pstatt a&$p.
Titus

Wenn ich versuche, Ihren Code über den Link auszuführen, heißt es unerwartet,
Notts90

@ Notts90 Bitte verwenden Sie eine PHP-Version über 7.1
Jörg Hülsermann

@ JörgHülsermann das klappt, es hatte standardmäßig 7.0.3
Notts90

1

Haskell, 54 Bytes

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

Nutzen Sie die Möglichkeiten von Data.List sowohl für isInfixOfals auch für 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

Probieren Sie es online!

Returns TRUEfür truthy und NAfür Falsey.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.