Senar [sub] saya bersembunyi!

21

pengantar

Beberapa waktu yang lalu seorang pengguna SO yang hilang memposting pertanyaan di sini dan sekarang sudah dihapus tapi saya pikir itu akan menjadi tantangan yang bagus jadi begini ...

Tantangan

Tulis program atau fungsi lengkap yang membutuhkan dua string dan periksa apakah permutasi string pertama adalah sub-string dari string kedua.

Memasukkan

Dua string, string dan sub-string untuk diuji (Anda dapat memilih urutannya).

Keluaran:

Nilai kebenaran jika string berisi permutasi dari sub-string.
Nilai falsey jika string tidak mengandung permutasi dari sub-string.
Tes ini peka terhadap huruf besar-kecil.

Contoh / Uji kasus

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy
Notts90
sumber
Haruskah nilai kebenaran dan falsey konsisten atau hanya kebenaran atau falsey?
Erik the Outgolfer
@EriktheOutgolfer hanya sesuai baik-baik saja.
Notts90

Jawaban:

14

Brachylog , 2 byte

sp

Cobalah online!

Penjelasan

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
Fatalisasi
sumber
4
Alat yang tepat untuk pekerjaan itu.
isaacg
7

JavaScript (ES6), 77 byte

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

Mengembalikan 1 atau 0.

Potongan

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
sumber
2
Ini jauh lebih cepat daripada versi yang menggunakan permutasi.
David Conrad
6

Python 2, 67 66 byte

Mengambil input sebagai dua string, substring terlebih dahulu.

a=sorted
lambda s,S:a(s)in[a(S[n:n+len(s)])for n in range(len(S))]
TFeld
sumber
1
Simpan satu byte dengan penamaan sorted.
Jonathan Allan
6

05AB1E , 3 byte

όZ

Cobalah online!

-1 byte terima kasih kepada Emigna .

Penjelasan:

ό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 the Outgolfer
sumber
Saya rasa Anda tidak perlu.
Emigna
Tidak yakin apakah itu ponsel saya tetapi TIO tampaknya rusak, kata bahasa tidak ditemukan.
Notts90
@ Notts90 Ini TIO v2 bukan TIO Nexus, coba hapus cache Anda. Ini bekerja untuk saya.
Erik the Outgolfer
@ Emigna Rupanya "vectorized" berarti argumen kedua, bukan argumen pertama ...
Erik the Outgolfer
2
Andai saja Anda mengeluarkan tanda silang 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));}

Penjelasan:

Coba di sini.

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
sumber
Dalam C # a void lambda Action<params>bukan Func<params, returnVal>. Saya menganggap itu akan menjadi sesuatu yang serupa.
TheLethalCoder
1
@TheLethalCoder Anda benar. Harus menggunakan Consumerdan accept(...)bukannya Functiondan apply(...)ketika saya ingin memiliki lambda dengan parameter dan tanpa tipe kembali. Saya sedang belajar Java 8. :) Tapi karena saya harus berubah void p(String p,String q), p("",p);dan p(p+q.ch...,q.sub...)untuk p->q->, p.apply("").accept(p);dan p.apply(p+q.ch...).accept(q.sub...)itu lebih pendek untuk menggunakan kombinasi lambda untuk metode utama, dan hanya metode Java 7 void p(String p,String q)untuk metode rekursif.
Kevin Cruijssen
Bagus, setidaknya Anda sudah menemukannya
TheLethalCoder
Saya menggunakan Function<String, Predicate<String>>di tambang.
David Conrad
5

Jelly , 5 byte

Œ!ẇ€Ṁ

Cobalah online!

-1 terima kasih kepada Emigna karena mendorong saya untuk mencoba lagi bermain golf.

Penjelasan:

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

Japt, 10 7 byte

á d!èV

Cobalah online


Penjelasan

á 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
Shaggy
sumber
4

Python , 60 byte

Bentuk jawaban TFeld yang berubah - berikan kredit!

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

Fungsi rekursif mengembalikan boolean True(truey) atau string kosong (falsy).

Cobalah online!

mengurutkan substring,, udan panjang yang sama dari bagian depan string,, t(menggunakan slice t[:len(u)]) jika mereka sama maka Truedikembalikan, jika ttidak masih benar (tidak kosong) berulang dengan dequeued t(menggunakan slice, t[1:]) . Jika tmenjadi kosong maka andtidak dieksekusi dan ini kosong tdikembalikan.

Jonathan Allan
sumber
Anda juga dapat memiliki lambda sebagai parameter: lambda u,t,s=sorted:untuk one-liner, tidak ada byte yang disimpan
Rod
@ kucing penugasan diperlukan karena fungsi ini bersifat rekursif.
Jonathan Allan
4

Pyth, 9 8 byte

sm}dQ.pE

-1 byte terima kasih kepada @Erik_the_Outgolfer

Mengambil dua string yang dikutip, yang kedua adalah substring.

Cobalah!

KarlKastor
sumber
OP mengatakan bahwa hal itu dapat saja truthy / falsey, tidak selalu konsisten, sehingga Anda dapat menggunakan sbukan }1.
Erik the Outgolfer
3

Mathematica, 55 50 byte

-5 byte dari user202729

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

Kembali Falsejika permutasi input pertama ada di string kedua. Kembali Truejika permutasi input pertama tidak dalam string kedua.

Penjelasan:

                                    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
sumber
Keluaran hanya perlu "benar / salah" bukan literal True/ False.
Ian Miller
Terima kasih atas pengingatnya Characters.
Ian Miller
3

CJam , 13 12 byte

le!lf{\#)}:+

Cobalah online!

Saya merasa CJam benar-benar terbatas dibandingkan dengan bahasa golf lainnya, tapi mungkin hanya saya saja yang buruk ...

Saya sedang berpikir untuk pindah ke yang lain. 05AB1E sepertinya menyenangkan.

Memperbaiki bug kecil berkat Erik the Outgolfer
Cut satu gigitan karena angka yang bukan nol adalah benar

Penjelasan:

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
sumber
Saya pikir ini tidak valid, bagaimana dengan input adan abc?
Erik the Outgolfer
@EriktheOutgolfer Anda benar. Seharusnya a> = 0 bukan> 0
FrodCube
1
Tapi kamu bisa melakukannya W>.
Erik the Outgolfer
@EriktheOutgolfer akan le!lf{\#)}:+dianggap sebagai solusi yang valid? Seharusnya output 0jika string tidak ditemukan dan beberapa angka positif sebaliknya. Apakah angka yang bukan nol valid truthy?
FrodCube
Anda dapat menggunakan )alih-alih W>, sesuai klarifikasi OP.
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()))

(baris baru disisipkan untuk dibaca)

Cobalah online!

Catatan: JShell menyertakan sejumlah impor secara default. Sebagai solusi Java 8 atau Java 9, perlu mengimpor:

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

Untuk tambahan 45 byte, atau total 205 byte. TIO link di atas adalah untuk program Java 9 karena TIO saat ini tidak memiliki JShell (dan tidak jelas bagi saya bagaimana JShell akan bekerja pada TIO).

David Conrad
sumber
Java 9 adalah sesuatu sekarang? : |
CalculatorFeline
@ CalculatorFeline Membangun akses awal telah tersedia untuk beberapa waktu, tetapi tanggal rilis resmi adalah 2017-07-27 .
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++);}}

Saya yakin menghitung permutasi bisa jauh lebih pendek tapi saya tidak bisa melihat bagaimana saat ini.

Versi yang diformat / Lengkap:

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
sumber
ya, sayangnya menggunakan LINQ sering membuat hal-hal lebih lama daripada sederhana untuk (..) {}
Ewan
2

Ruby , 69 byte

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

Cobalah online!

Alex
sumber
2

Perl 6 , 48 byte

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

Mengembalikan persimpangan atau-setiap kehadiran permutasi sebagai substring. Misalnya, dengan argumen "Hello World!"dan "d!l", mengembalikan:

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

... yang "runtuh" ​​ke Truedalam konteks boolean. Artinya, persimpangan adalah nilai kebenaran.

Sean
sumber
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;

Testcases

Jörg Hülsermann
sumber
1
Coba ~$palih-alih a&$p.
Titus
Ketika saya mencoba menjalankan kode Anda menggunakan tautan yang katanya tidak terduga,
Notts90
@ Notts90 Silakan gunakan Versi PHP lebih dari 7.1
Jörg Hülsermann
@ JörgHülsermann yang berfungsi, defaultnya adalah 7.0.3
Notts90
1

Haskell, 54 byte

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

Menggunakan kekuatan Data.List untuk keduanya isInfixOfdan juga permutations.

maple_shaft
sumber
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

Cobalah online!

Kembali TRUEuntuk kebenaran dan NAkepalsuan.

ngm
sumber
0

MATL, 10 byte

Y@Z{w&Xfma

Cobalah di MATL Online

sundar - Pasang kembali Monica
sumber