สตริง [sub] ของฉันซ่อนอยู่!


21

บทนำ

ไม่นานมานี้มีผู้ใช้ SO ที่หายไปโพสต์คำถามที่นี่และตอนนี้ถูกลบไปแล้ว แต่ฉันคิดว่ามันจะเป็นการท้าทายที่ดีดังนั้นที่นี่จะไป ...

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่รับสองสายและตรวจสอบว่าการเรียงสับเปลี่ยนของสตริงแรกใด ๆ เป็นสตริงย่อยของสตริงที่สอง

อินพุต

สองสตริง, สตริงและสตริงย่อยที่จะทดสอบ (คุณอาจเลือกคำสั่ง)

เอาท์พุท:

ค่าความจริงหากสตริงมีการเรียงสับเปลี่ยนของสตริงย่อยใด ๆ
ค่าเท็จถ้าสตริงไม่มีการเรียงสับเปลี่ยนของสตริงย่อย
การทดสอบเป็นกรณี ๆ ไป

ตัวอย่าง / กรณีทดสอบ

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

ค่าความจริงและเท็จจะต้องสอดคล้องกันหรือเพียงแค่ความจริงหรือเท็จอย่างเหมาะสม?
Erik the Outgolfer

@EriktheOutgolfer เหมาะสมเหมาะสมแล้ว
Notts90

คำตอบ:



7

JavaScript (ES6), 77 ไบต์

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

ส่งคืน 1 หรือ 0

เศษเล็กเศษน้อย

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
นี่คือเร็วกว่ารุ่นที่ใช้วิธีเรียงสับเปลี่ยน
David Conrad

6

Python 2, 67 66 ไบต์

รับอินพุตเป็นสองสตริง, สตริงย่อยก่อน

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

1
sortedบันทึกไบต์โดยการตั้งชื่อ
Jonathan Allan

6

05AB1E , 3 ไบต์

όZ

ลองออนไลน์!

-1 ขอบคุณไบต์Emigna

คำอธิบาย:

ό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

ฉันไม่คิดว่าคุณต้องการ.
Emigna

ไม่แน่ใจว่าเป็นโทรศัพท์ของฉันหรือไม่ แต่ TIO ดูเหมือนว่าไม่พบภาษา
Notts90

@ Notts90 มันคือ TIO v2 ไม่ใช่ TIO Nexus ลองล้างแคชของคุณ มันใช้งานได้สำหรับฉัน
Erik the Outgolfer

@Emigna Apparently "vectorized" หมายถึงการโต้แย้งครั้งที่สองไม่ใช่ครั้งแรก ...
Erik the Outgolfer

2
ถ้าเพียง แต่คุณจะใส่เครื่องหมายกากบาท 4
Neil A.

5

Java 8, 266 244 ไบต์

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

คำอธิบาย:

ลองที่นี่

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 # แลมบ์ดาเป็นโมฆะเป็นแทนAction<params> Func<params, returnVal>ฉันคิดว่ามันจะคล้ายกัน
TheLethalCoder

1
@TheLethalCoder คุณพูดถูก ควรใช้Consumerและaccept(...)แทนที่จะเป็นFunctionและapply(...)เมื่อฉันต้องการมีแลมบ์ดาพร้อมพารามิเตอร์และไม่มีประเภทส่งคืน ตอนนี้ฉันกำลังเรียนรู้ Java 8 :) แต่เนื่องจากฉันจะต้องเปลี่ยนvoid p(String p,String q), p("",p);และp(p+q.ch...,q.sub...)เป็นp->q->, p.apply("").accept(p);และp.apply(p+q.ch...).accept(q.sub...)มันสั้นกว่าที่จะใช้แลมบ์ดาสำหรับวิธีการหลัก, และเป็นเพียงวิธี Java 7 void p(String p,String q)สำหรับวิธีแบบเรียกซ้ำ
Kevin Cruijssen

ดีอย่างน้อยคุณก็คิดออก
TheLethalCoder

ฉันใช้Function<String, Predicate<String>>ของฉัน
David Conrad


5

Japt, 10 7 ไบต์

á d!èV

ลองออนไลน์


คำอธิบาย

á 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 ไบต์

รูปแบบที่เปลี่ยนแปลงของคำตอบของ TFeld - ไปให้เครดิต!

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

ฟังก์ชั่นวนซ้ำส่งคืนบูลีนTrue(ความจริง) หรือสตริงว่าง (เท็จ)

ลองออนไลน์!

เรียงสตริงย่อย, uและความยาวเดียวกันของด้านหน้าของสตริง,, t(ใช้ชิ้นt[:len(u)]) ถ้าพวกเขาเหมือนกันแล้วTrueจะถูกส่งกลับมิฉะนั้นถ้าtยังคงเป็นความจริง (ไม่ว่าง) recurses กับ dequeued t(ใช้ชิ้นt[1:]) . หากtไม่ว่างเปล่าandจะไม่ถูกดำเนินการและtส่งคืนค่าว่างนี้


นอกจากนี้คุณยังสามารถมีแลมบ์ดาเป็นพารามิเตอร์: lambda u,t,s=sorted:สำหรับหนึ่งซับไม่มีไบต์บันทึกแม้ว่า
ร็อด

@cat ต้องการการมอบหมายเนื่องจากฟังก์ชันนี้เรียกซ้ำ
Jonathan Allan

4

Pyth, 9 8 ไบต์

sm}dQ.pE

-1 ไบต์ขอบคุณ @Erik_the_Outgolfer

รับสายที่ยกมาสองสายตัวที่สองคือสตริงย่อย

ลองมัน!


OP บอกว่ามันอาจจะเป็นแค่ truthy / falsey ไม่จำเป็นต้องสอดคล้องกันเพื่อให้คุณสามารถใช้แทนs }1
Erik the Outgolfer

3

Mathematica, 55 50 ไบต์

-5 ไบต์จาก user202729

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

ส่งคืนFalseถ้าการเรียงสับเปลี่ยนของอินพุตแรกอยู่ในสตริงที่สอง ส่งคืนTrueถ้าการเรียงสับเปลี่ยนของอินพุตแรกไม่ได้อยู่ในสตริงที่สอง

คำอธิบาย:

                                    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

การส่งออกเพียงต้องการที่จะเป็น "truthy / falsey" ไม่ได้ตัวอักษร/True False
เอียนมิลเลอร์

Charactersขอขอบคุณสำหรับการแจ้งเตือนเกี่ยวกับ
เอียนมิลเลอร์

3

CJam , 13 12 ไบต์

le!lf{\#)}:+

ลองออนไลน์!

ฉันรู้สึกว่า CJam นั้นมีข้อ จำกัด จริง ๆ เมื่อเทียบกับภาษากอล์ฟอื่น ๆ แต่บางทีฉันแค่ไม่ดี ...

ฉันกำลังคิดที่จะย้ายไปที่อื่น 05AB1E ดูสนุก

แก้ไขข้อบกพร่องเล็ก ๆ ด้วย Erik the Outgolfer
Cut หนึ่งกัดเพราะตัวเลขที่ไม่เป็นศูนย์นั้นเป็นความจริง

คำอธิบาย:

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

ฉันคิดว่ามันไม่ถูกต้องสิ่งที่เกี่ยวกับอินพุตaและabc?
Erik the Outgolfer

@EriktheOutgolfer คุณพูดถูก ควรเป็น> = 0 แทน> 0
FrodCube

1
W>แต่คุณสามารถทำ
Erik the Outgolfer

@EriktheOutgolfer จะle!lf{\#)}:+ถือว่าเป็นโซลูชันที่ถูกต้องหรือไม่ มันควรจะส่งออก0ถ้าไม่พบสตริงและจำนวนบวกเป็นอย่างอื่น หมายเลขที่ไม่ใช่ศูนย์นั้นถูกต้องtruthyหรือไม่
FrodCube

คุณสามารถใช้)แทนW>การชี้แจงของ OP
Erik the Outgolfer

3

Java 9 JShellขนาด 160 ไบต์

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

(ขึ้นบรรทัดใหม่เพื่อให้สามารถอ่านได้)

ลองออนไลน์!

หมายเหตุ: JShell มีการนำเข้าจำนวนหนึ่งตามค่าเริ่มต้น ในฐานะที่เป็นโซลูชั่น Java 8 หรือ Java 9 มันจะต้องนำเข้า:

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

สำหรับการเพิ่มพิเศษ 45 ไบต์หรือผลรวม 205 ไบต์ ลิงก์ TIO ด้านบนเป็นโปรแกรม Java 9 เนื่องจาก TIO ในปัจจุบันไม่มี JShell (และยังไม่ชัดเจนสำหรับฉันว่า JShell จะใช้งาน TIO ได้อย่างไร)


Java 9 ตอนนี้เป็นอย่างไร : |
CalculatorFeline

@CalculatorFeline เข้าถึงก่อนสร้างได้รับการบริการสำหรับค่อนข้างบางเวลา แต่อย่างเป็นทางการในวันที่ปล่อยเป็น 2017/07/27
David Conrad

2

C #, 320 ไบต์

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

ฉันแน่ใจว่าการคำนวณการเรียงสับเปลี่ยนอาจสั้นกว่านี้มาก แต่ฉันไม่สามารถเห็นได้ว่าในขณะนี้

ฟอร์แมต / เวอร์ชันเต็ม:

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

ใช่การใช้ linq บ่อยครั้งทำให้สิ่งต่าง ๆ ง่ายกว่าสำหรับ (.. ) {}
Ewan


2

Perl 6 , 48 ไบต์

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

ส่งคืนหรือจุดเชื่อมต่อของการเปลี่ยนแปลงของแต่ละการเปลี่ยนแปลงเป็นสตริงย่อย ตัวอย่างเช่นด้วยข้อโต้แย้ง"Hello World!"และ"d!l"ผลตอบแทน:

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

... ที่ "ยุบ" ไปTrueในบริบทบูลีน นั่นคือทางแยกเป็นค่าความจริง


2

PHP> = 7.1, 91 ไบต์

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

Testcases


1
ลองแทน~$p a&$p
ติตัส

เมื่อฉันพยายามเรียกใช้รหัสของคุณโดยใช้ลิงก์มันจะบอกว่าไม่คาดคิด,
Notts90

@ Notts90 โปรดใช้ PHP เวอร์ชันมากกว่า 7.1
JörgHülsermann

@ JörgHülsermannที่ใช้งานได้ค่าเริ่มต้นเป็น 7.0.3
Notts90

1

Haskell, 54 ไบต์

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

การใช้อำนาจของ Data.List สำหรับทั้งสองเช่นเดียวกับisInfixOfpermutations




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.