Chuỗi [phụ] của tôi đang ẩn!


21

Giới thiệu

Cách đây một thời gian, một người dùng SO bị mất đã đăng một câu hỏi ở đây và bây giờ nó đã bị xóa nhưng tôi nghĩ nó sẽ tạo ra một thử thách tốt nên ở đây nó ...

Thử thách

Viết một chương trình hoặc hàm đầy đủ có hai chuỗi và kiểm tra xem bất kỳ hoán vị nào của chuỗi thứ nhất có phải là chuỗi con của chuỗi thứ hai không.

Đầu vào

Hai chuỗi, một chuỗi và một chuỗi con để kiểm tra (bạn có thể chọn thứ tự).

Đầu ra:

Một giá trị trung thực nếu chuỗi chứa bất kỳ hoán vị của chuỗi con.
Giá trị falsey nếu chuỗi không chứa bất kỳ hoán vị nào của chuỗi con.
Các xét nghiệm là trường hợp nhạy cảm.

Ví dụ / trường hợp thử nghiệm

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

Giá trị trung thực và chim ưng phải nhất quán hay chỉ là sự thật hay chim ưng?
Erik the Outgolfer

@EriktheOutgolfer chỉ cần thích hợp là ổn.
Notts90

Câu trả lời:



7

JavaScript (ES6), 77 byte

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

Trả về 1 hoặc 0.

Đoạn trích

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
Điều này nhanh hơn nhiều so với các phiên bản sử dụng hoán vị.
David Conrad

6

Python 2, 67 66 byte

Lấy đầu vào là hai chuỗi, chuỗi con đầu tiên.

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

1
Lưu một byte bằng cách đặt tên sorted.
Jonathan Allan

6

05AB1E , 3 byte

όZ

Hãy thử trực tuyến!

-1 byte nhờ Emigna .

Giải trình:

ό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

Tôi không nghĩ bạn cần.
Emigna

Không chắc đó có phải điện thoại của tôi không nhưng TIO có vẻ bị hỏng, nói rằng ngôn ngữ không được tìm thấy.
Notts90

@ Notts90 Đó là TIO v2 không phải TIO Nexus, hãy thử xóa bộ nhớ cache của bạn. Nó làm việc cho tôi.
Erik the Outgolfer

@Emigna Rõ ràng "vectorized" có nghĩa là đối số thứ hai không phải là lần đầu tiên ...
Erik the Outgolfer

2
Giá như bạn bỏ qua 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));}

Giải trình:

Hãy thử nó ở đây.

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)

Trong C # một khoảng trống lambda là Action<params>thay vì Func<params, returnVal>. Tôi cho rằng nó sẽ là một cái gì đó tương tự.
TheLethalCoder

1
@TheLethalCoder Bạn nói đúng. Nên sử dụng Consumeraccept(...)thay vì Functionapply(...)khi tôi muốn có lambda với tham số và không có kiểu trả về. Tôi hiện đang học Java 8. :) Nhưng kể từ khi tôi sẽ phải thay đổi void p(String p,String q), p("",p);p(p+q.ch...,q.sub...)đến p->q->, p.apply("").accept(p);p.apply(p+q.ch...).accept(q.sub...)nó là ngắn hơn để sử dụng một sự kết hợp của lambda cho phương pháp chính, và chỉ là một Java 7 void p(String p,String q)phương pháp cho đệ quy-method.
Kevin Cruijssen

Thật tuyệt, ít nhất bạn đã tìm ra nó
TheLethalCoder

Tôi đã sử dụng một Function<String, Predicate<String>>trong tôi.
David Conrad


5

Japt, 10 7 byte

á d!èV

Dùng thử trực tuyến


Giải trình

á 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

Một dạng thay đổi của câu trả lời của TFeld - hãy cho một số tín dụng!

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

Hàm đệ quy trả về boolean True(trung thực) hoặc một chuỗi rỗng (giả).

Hãy thử trực tuyến!

sắp xếp chuỗi con, uvà cùng độ dài của mặt trước của chuỗi, t(sử dụng một lát cắt t[:len(u)]) nếu chúng giống nhau thì Trueđược trả về, nếu không thì tvẫn còn trung thực (không trống) được lặp lại với một dequeued t(sử dụng một lát, t[1:]) . Nếu tkhông trở nên trống rỗng andthì không được thực thi và trống tnày được trả về.


Bạn cũng có thể có lambda làm tham số: lambda u,t,s=sorted:cho một lớp lót, mặc dù không có byte nào được lưu
Rod

@cat bài tập được yêu cầu vì hàm đệ quy.
Jonathan Allan

4

Bình thường, 9 8 byte

sm}dQ.pE

-1 byte nhờ @Erik_the_Outgolfer

Có hai chuỗi trích dẫn, chuỗi thứ hai là chuỗi con.

Thử nó!


OP nói rằng nó có thể chỉ là sự thật / falsey, không nhất thiết phải nhất quán, vì vậy bạn có thể sử dụng sthay vì }1.
Erik the Outgolfer

3

Toán học, 55 50 byte

-5 byte từ user202729

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

Trả về Falsenếu một hoán vị của đầu vào đầu tiên là trong chuỗi thứ hai. Trả về Truenếu một hoán vị của đầu vào đầu tiên không nằm trong chuỗi thứ hai.

Giải trình:

                                    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

Đầu ra chỉ cần là "truey / falsey" chứ không phải bằng chữ True/ False.
Ian Miller

Cảm ơn đã nhắc nhở về Characters.
Ian Miller

3

CJam , 13 12 byte

le!lf{\#)}:+

Hãy thử trực tuyến!

Tôi cảm thấy như CJam thực sự bị hạn chế so với các ngôn ngữ chơi gôn khác, nhưng có lẽ đó chỉ là tôi xấu ...

Tôi đang suy nghĩ về việc chuyển sang người khác. 05AB1E có vẻ vui.

Đã sửa lỗi nhỏ nhờ Erik the Outgolfer
Cắt một vết cắn vì các số khác không là số thật

Giải trình:

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

Tôi nghĩ rằng điều này là không hợp lệ, những gì về đầu vào aabc?
Erik the Outgolfer

@EriktheOutgolfer Bạn nói đúng. Nó phải là> = 0 thay vì> 0
FrodCube

1
Nhưng bạn có thể làm được W>.
Erik the Outgolfer

@EriktheOutgolfer sẽ le!lf{\#)}:+được coi là một giải pháp hợp lệ? Nó sẽ xuất ra 0nếu chuỗi không được tìm thấy và một số số dương khác. Là một số khác không là hợp lệ truthy?
FrodCube

Bạn có thể sử dụng )thay vì W>, làm rõ theo 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()))

(dòng mới được chèn để dễ đọc)

Hãy thử trực tuyến!

Lưu ý: JShell bao gồm một số nhập theo mặc định. Là một giải pháp Java 8 hoặc Java 9, cần phải nhập:

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

Để có thêm 45 byte, hoặc tổng cộng 205 byte. Liên kết TIO ở trên là chương trình Java 9 vì TIO hiện không có JShell (và tôi không rõ JShell sẽ hoạt động như thế nào trên TIO).


Java 9 là một điều bây giờ? : |
Máy

@CalculatorFeline Các bản dựng truy cập sớm đã có sẵn khá lâu, nhưng ngày phát hành chính thức là 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++);}}

Tôi chắc chắn tính toán hoán vị có thể ngắn hơn rất nhiều nhưng tôi không thể thấy làm thế nào vào lúc này.

Định dạng / Phiên bản đầy đủ:

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

vâng, không may sử dụng linq thường khiến mọi thứ dài hơn đơn giản đối với (..) {}
Ewan


2

Perl 6 , 48 byte

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

Trả về một hoặc điểm nối của sự hiện diện của mỗi hoán vị dưới dạng một chuỗi con. Ví dụ: với các đối số "Hello World!""d!l", trả về:

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

... Mà "sụp đổ" Truetrong bối cảnh boolean. Đó là, mối nối là giá trị trung thực.


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;

Tủ thử


1
Thử ~$p thay vì a&$p.
Tít

Khi tôi cố chạy mã của bạn bằng liên kết, nó báo không mong muốn ,
Notts90

@ Notts90 Vui lòng sử dụng Phiên bản PHP trên 7.1
Jörg Hülsermann

@ JörgHülsermann hoạt động, nó đã được mặc định là 7.0.3
Notts90

1

Haskell, 54 byte

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

Sử dụng sức mạnh của Data.List cho cả hai isInfixOfcũng như 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

Hãy thử trực tuyến!

Trả về TRUE cho sự thật vàNA cho falsey.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.