Мої [під] струни ховаються!


21

Вступ

Деякий час тому загублений користувач SO опублікував тут питання, і його тепер було видалено, але я думаю, що це зробило б хороший виклик, так що ось воно йде ...

Виклик

Напишіть повну програму або функцію, яка займає два рядки і перевіряє, чи будь-яка перестановка першого рядка є підрядком другого рядка.

Вхідні дані

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

Вихід:

Значення truthy, якщо рядок містить будь-яку перестановку підрядка.
Значення фальси, якщо рядок не містить перестановок підрядків.
Тест враховує регістри.

Приклади / Тестові приклади

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

input    Pog           Programming Puzzles & Code Golf
output   falsey

input    ghjuyt        asdfhytgju1234
output   truthy

Повинні чи повинні бути значення послідовності фальси та фальси послідовними чи просто належним чином фальси чи фальси?
Ерік Атголфер

@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

Пітон 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 байт завдяки Еміньї .

Пояснення:

ό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, спробуйте очистити кеш. Це працює для мене.
Ерік Аутгольфер

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

Приємно, принаймні ви це зрозуміли
TheLethalCoder

Я використовував 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

Пітон , 60 байт

Змінена форма відповіді TFeld - іди, дай трохи кредиту!

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

Рекурсивна функція, що повертає булеву True(truthy) або порожню рядок (хибний).

Спробуйте в Інтернеті!

сортує підрядок, uі однакова довжина передньої частини рядка, t(використовуючи фрагмент t[:len(u)]), якщо вони однакові, то Trueповертається, інакше, якщо tвсе-таки truthy (не порожній) повторюється з вилученим t(використовуючи фрагмент, t[1:]) . Якщо tвоно стає порожнім, andвоно не виконується, і це порожнє tповертається.


Також можна вказати лямбда як параметр: lambda u,t,s=sorted:для
Rod

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

4

Pyth, 9 8 байт

sm}dQ.pE

-1 байт завдяки @Erik_the_Outgolfer

Бере дві цитовані рядки, друга з яких - підрядка.

Спробуй це!


ОП заявила, що це може бути просто truthy / falsey, не обов'язково послідовно, тому ви можете використовувати sзамість цього }1.
Ерік Аутгольфер

3

Математика, 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

Вихід повинен бути лише "truthy / falsey", а не буквальний True/ False.
Ян Міллер

Дякуємо за нагадування про Characters.
Ян Міллер

3

CJam , 13 12 байт

le!lf{\#)}:+

Спробуйте в Інтернеті!

Я відчуваю, що CJam насправді обмежений порівняно з іншими мовами для гольфу, але, можливо, мені просто погано ...

Я думаю про перехід до іншого. 05AB1E здається веселим.

Виправлена ​​маленька помилка завдяки Еріку Аутгольферу
один укус, оскільки ненульові цифри є правдою

Пояснення:

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?
Ерік Аутгольфер

@EriktheOutgolfer Ви праві. Це має бути а> = 0 замість> 0
FrodCube

1
Але ти можеш зробити W>.
Ерік Аутгольфер

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

Ви можете використовувати )замість W>уточнення ОП.
Ерік Атголфер

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 - це річ зараз? : |
КалькуляторFeline

@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;

Тестові шафи


1
Спробуйте ~$pзамість a&$p.
Тит

Коли я намагаюся запустити ваш код за посиланням, воно говорить несподівано,
Notts90

@ Notts90 Будь ласка, використовуйте версію PHP понад 7.1
Йорг Хюльсерманн,

@ 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.