[Alt] dizgilerim saklanıyor!


21

Giriş

Bir süre önce kaybolan bir SO kullanıcısı burada bir soru gönderdi ve şimdi silindi ancak bence iyi bir meydan okuma olacağını düşünüyorum, işte böyle gidiyor ...

Meydan okuma

İki dize alan tam bir program veya işlev yazın ve ilk dizenin herhangi bir permütasyonunun ikinci dizenin bir alt dizesi olup olmadığını kontrol eder.

Giriş

İki dize, bir dize ve test edilecek bir alt dize (sırayı seçebilirsiniz).

Çıktı:

Dize, alt dizenin herhangi bir permütasyonunu içeriyorsa, gerçek bir değer.
Dize, alt dizenin izinlerini içermiyorsa, bir falsey değeri.
Test büyük / küçük harf duyarlıdır.

Örnekler / Test durumları

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

Truthy ve falsey değeri tutarlı mı yoksa sadece uygun şekilde truthy veya falsey mi olmalı?
Outgolfer Erik,

@EriktheOutgolfer sadece uygun iyidir.
Notts90

Yanıtlar:


14

Brachylog , 2 bayt

sp

Çevrimiçi deneyin!

açıklama

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
İş için doğru alet.
isaacg

7

JavaScript (ES6), 77 bayt

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

1 veya 0 döndürür.

Pasaj

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
Bu, permütasyon kullanan versiyonlardan çok daha hızlı.
David Conrad

6

Python 2, 67 66 bayt

Girdiyi iki karakter olarak alır, önce alt dizgi.

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

1
Adlandırarak bir bayt kaydedin sorted.
Jonathan Allan

6

05AB1E , 3 bayt

όZ

Çevrimiçi deneyin!

Emigna sayesinde -1 bayt .

Açıklama:

ό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

İhtiyacın olduğunu sanmıyorum.
Emigna

Telefonum olup olmadığından emin değilim, ancak TIO bozuk görünüyor, dilin bulunamadığını söylüyor.
Notts90

@ Notts90 Bu TIO v2 değil TIO Nexus, önbelleğinizi temizlemeye çalışın. Benim için çalışıyor.
Outgolfer Erik,

@Emigna Görünüşe göre "vectorized", ikinci değil argüman anlamına gelir ...
Outgolfer Erik

2

5

Java 8, 266 244 bayt

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

Açıklama:

Burada dene.

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)

C # 'da boşluk Action<params>yerine lambda bulunur Func<params, returnVal>. Benzer bir şey olacağını varsayıyorum.
TheLethalCoder

1
@TheLethalCoder Haklısın. Kullanmalı Consumerve accept(...)yerine Functionve apply(...)parametresi olan ve geri dönüş tipi olmayan bir lambda istiyorum. Şu anda Java 8. öğreniyorum :) Ama değişim gerekecek çünkü void p(String p,String q), p("",p);ve p(p+q.ch...,q.sub...)karşı p->q->, p.apply("").accept(p);ve p.apply(p+q.ch...).accept(q.sub...)o ana yöntem için lambda bir arada kullanmak daha kısadır ve sadece bir Java 7 void p(String p,String q)özyinelemeli-yöntemi için yöntem.
Kevin Cruijssen

Güzel, en azından sen
anladın

Ben bir Function<String, Predicate<String>>madende kullandım.
David Conrad


5

Japt, 10 7 bayt

á d!èV

Çevrimiçi deneyin


açıklama

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

TFeld'in cevabının değiştirilmiş şekli - gidip biraz kredi ver!

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

Tekrarlayan işlev, boole True(truthy) veya boş bir dize (sahte) döndürür.

Çevrimiçi deneyin!

alt dizeyi, sıralar uve dize önünde aynı uzunluğa, t(bir dilim kullanarak t[:len(u)]onlar daha sonra aynı değilse) True, döndürülür aksi takdirde tyine truthy (boş değil) ile recurses bir dequeued t(bir dilim kullanarak t[1:]) . Eğer tboş hale gelmez andyürütülmez ve bu boş tdöndürülür.


Parametre olarak lambda da alabilirsiniz: lambda u,t,s=sorted:bir liner için, kaydedilmiş hiçbir byte yok
Rod

@ cat işlevi, fonksiyon özyinelemeli olduğundan atama gereklidir.
Jonathan Allan

4

Pyth, 9 8 bayt

sm}dQ.pE

@Erik_the_Outgolfer sayesinde -1 bayt

İkincisi alt dize olan iki alıntı dizge alır.

Dene!


OP bunun sadece tutarlı / falsey olabileceğini, mutlaka tutarlı olmadığını, sbunun yerine kullanabileceğinizi söyledi }1.
Outgolfer Erik,

3

Mathematica, 55 50 bayt

Kullanıcısından -5 bayt

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

İade Falseilk girişin bir permütasyon ikinci dizede ise. İade Trueilk girişin bir permütasyon ikinci dizede değilse.

Açıklama:

                                    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

Çıkış sadece "truthy / Falsey" değil edebi olması gerekir True/ False.
Ian Miller

Hatırlattığın için teşekkürler Characters.
Ian Miller

3

CJam , 13 12 bayt

le!lf{\#)}:+

Çevrimiçi deneyin!

CJam'nin diğer golf dillerine göre çok sınırlı olduğunu hissediyorum, ama belki de sadece kötü biriyim ...

Başka birine taşınmayı düşünüyorum. 05AB1E eğlenceli görünüyor.

Sıfır olmayan sayılar acımasız olduğundan , Outgolfer Erik sayesinde
bir ısırık kesildi düzeltildi

Açıklama:

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

Ben bu nedir girdiler hakkında, geçersiz olduğunu düşünüyorum ave abc?
Outgolfer Erik,

@EriktheOutgolfer Haklısın.
26:17

1
Ama yapabilirsin W>.
Outgolfer Erik,

@EriktheOutgolfer le!lf{\#)}:+geçerli bir çözüm olarak kabul edilir mi? Bu çıkış gerektiği 0dize bulunmazsa ve bazı pozitif sayı aksi. Sıfır olmayan bir sayı geçerli truthymidir?
FrodCube

OP’nin açıklamasına göre )yerine kullanabilirsiniz W>.
Outgolfer Erik,

3

Java 9 JShell , 160 bayt

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

(okunabilirlik için eklenen yeni satırlar)

Çevrimiçi deneyin!

Not: JShell, varsayılan olarak birkaç içe aktarma içerir. Bir Java 8 veya Java 9 çözümü olarak, aşağıdakileri içe aktarmanız gerekir:

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

Fazladan 45 bayt veya toplam 205 bayt için. Yukarıdaki TIO bağlantısı bir Java 9 programına aittir, çünkü TIO şu anda JShell'e sahip değildir (ve JShell'in TIO'da nasıl çalışacağı açık değildir).


Java 9 şimdi bir şey mi? : |
Hesap MakinesiFeline

@CalculatorFeline Erken erişim oluşturmaları bir süredir kullanılabilir, ancak resmi çıkış tarihi 2017-07-27 .
David Conrad,

2

C #, 320 bayt

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

Permütasyonların hesaplanmasının çok daha kısa olacağına eminim ama şu anda nasıl olduğunu göremiyorum.

Biçimlendirilmiş / Tam sürüm:

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

evet, ne yazık ki linq kullanmak sık sık işleri daha basit hale getirir (..) {}
Ewan


2

Perl 6 , 48 bayt

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

Her permütasyonun bir alt-halka olarak varlığının bir ya da birleşimini döndürür. Örneğin, ve argümanları "Hello World!"ile "d!l"döner:

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

... Trueboolean bağlamda "çöktü" . Yani, kavşaklar truthy değerleridir.


2

PHP> = 7.1, 91 Bayt

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

testcases


1
Deneyin ~$pyerine a&$p.
Titus

Bağlantıyı kullanarak kodunuzu çalıştırmaya çalıştığımda beklenmeyen diyor,
Notts90

@ Notts90 Lütfen PHP’nin 7.1 sürümünü kullanın
Jörg Hülsermann

İşleyen @ JörgHülsermann, varsayılan olarak 7.0.3
Notts90

1

Haskell, 54 bayt

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

Data.List'in gücünü hem isInfixOfolduğu kadar hem de kullanmak için permutations.


1

R , 103 bayt

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

Çevrimiçi deneyin!

TRUETruthy ve falsey NAiçin döndürür .



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.