Мои [суб] строки скрываются!


21

Вступление

Некоторое время назад потерянный пользователь SO разместил здесь вопрос, и теперь он был удален, но я думаю, что это будет хорошим вызовом, так что вот так ...

Вызов

Напишите полную программу или функцию, которая принимает две строки и проверяет, является ли любая перестановка первой строки подстрокой второй строки.

вход

Две строки, строка и подстрока для проверки (вы можете выбрать порядок).

Выход:

Истинное значение, если строка содержит любую перестановку подстроки.
Значение Falsey, если строка не содержит перестановок подстроки.
Тест чувствителен к регистру.

Примеры / Тестовые случаи

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

Должно ли значение «истина и ложь» быть последовательным или просто правдивым или ложным?
Эрик 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
Это намного быстрее, чем версии, которые используют перестановки.
Дэвид Конрад

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.
Джонатан Аллан

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

Я не думаю, что вам нужно.
Эминья

Не уверен, что это мой телефон, но TIO кажется сломанным, говорит, что язык не найден.
Notts90

@ Notts90 Это TIO v2, а не TIO Nexus, попробуйте очистить кэш. Меня устраивает.
Эрик Outgolfer

@Emigna Видимо, «векторизация» означает второй аргумент, а не первый ...
Эрик Аутгольфер

2
Если бы только ты вычеркнул 4
Нил А.

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)метода рекурсивной-метода.
Кевин Круйссен


Я использовал Function<String, Predicate<String>>в моем.
Дэвид Конрад,


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все еще верно (не пусто), рекурсы с удаленным t(с использованием среза, t[1:]) , Если значение tстановится пустым, то andоно не выполняется и tвозвращается пустое значение .


Вы также можете использовать лямбду в качестве параметра: lambda u,t,s=sorted:для
Род

@cat назначение требуется, так как функция рекурсивная.
Джонатан Аллан

4

Pyth, 9 8 байт

sm}dQ.pE

-1 байт благодаря @Erik_the_Outgolfer

Принимает две строки в кавычках, вторая из которых является подстрокой.

Попытайся!


ОП сказал, что это может быть просто правда / ложь, не обязательно последовательная, поэтому вы можете использовать sвместо }1.
Эрик Outgolfer

3

Mathematica, 55 50 байт

-5 байт от пользователя 202729

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

Выход должен быть только «правдивым / фальсифицированным», а не буквальным 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?
Эрик Outgolfer

@EriktheOutgolfer Вы правы. Это должно быть> = 0 вместо> 0
FrodCube

1
Но вы можете сделать W>.
Эрик Outgolfer

@EriktheOutgolfer будет le!lf{\#)}:+считаться правильным решением? Он должен выводить, 0если строка не найдена, и некоторое положительное число в противном случае. Является ли ненулевое число допустимым truthy?
FrodCube

Вы можете использовать )вместо W>, согласно разъяснениям ОП.
Эрик 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 .
Дэвид Конрад,

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örg Hülsermann

@ JörgHülsermann, который работает, по умолчанию 7.0.3
Notts90

1

Haskell, 54 байта

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

Использование возможностей Data.List для обоих, isInfixOfа также permutations.




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.