Найдите все Анаграммы и Субанаграммы тоже!

13

Этот вопрос в значительной степени основан на этом вопросе , но должен создать ряд дополнительных трудностей.

Твое задание

Вы должны написать программу или функцию, которая при получении строки распечатывает все возможные ее анаграммы. Для целей этого вопроса анаграмма - это строка, которая содержит тот же символ, что и исходная строка, но не является исходной строкой. Поданаграмма - это анаграмма подстроки введенной строки. Анаграммы и субанаграммы не должны быть или содержать реальные слова.

вход

Вы можете принять строку, которая может иметь любую длину> 0, любым стандартным методом ввода. Он может содержать любые символы ASCII.

Выход

Вы можете вывести все возможные анаграммы и субанаграммы введенной строки любым стандартным способом. Вы не должны выводить одну и ту же строку дважды или выводить строку, равную вводу.

Другие правила

Стандартные лазейки запрещены

счет

Это , выигрывает минимум байтов.

грифон
источник
Является ли пустая строка возможной анаграммой?
Цифровая травма
Разрешен ли вывод исходной строки / строк?
CalculatorFeline
@CalculatorFeline "Вы не должны выводить одну и ту же строку дважды или выводить строку, равную вводу."
Джонатан Аллан
@DigitalTrauma, «Вы можете принять строку любой длины> 0 любым стандартным методом ввода». (выделение добавлено)
Грифон
4
Некоторые тестовые случаи были бы полезны
г-н Xcoder

Ответы:

8

05AB1E , 7 байтов

Œ€œ˜Ù¹K

Функция, которая принимает строку из ввода и оставляет список строк в стеке. В качестве полной программы выводится список списка.

Попробуйте онлайн!

Как?

        - push input
Œ       - all substrings
 €œ     - for €ach: all permutations
   ˜    - flatten
    Ù   - de-duplicate
     ¹  - push 1st input onto top of stack
      K - pop a,b; push a without any b's (remove the copy of the input from the list)
        - as a full program: implicit print of the top of the stack
Джонатан Аллан
источник
И ... тебе удалось что-то еще короче.
Грифон
Это тот же алгоритм, только меньше байтов.
Джонатан Аллан
Да, смена языка была всем, но все равно впечатляет.
Грифон
@ ais523 Похоже, я ошибся!
Джонатан Аллан
@ ais523 Я думаю, что это исправлено.
Джонатан Аллан
9

Брахилог (2), 7 байт

{sp}ᶠdb

Попробуйте онлайн!

объяснение

{sp}ᶠdb
{  }ᶠ    Find all
  p        permutations of
 s         a substring of {the input}
     d   Remove duplicates (leaving the list otherwise in the same order)
      b  Remove the first (the input itself)

источник
Что означает (2)?
Грифон
@Gryphon (afaik) есть 2 версии Branchylog, это использует V2.
Джон Гамильтон
1
Хорошо, не был уверен, был ли это номер версии или возможное количество байтов, используя другой, и, возможно, недопустимый метод.
Грифон
1
Это второй раз, когда меня спросили. Я думаю, мне придется начать писать как (v2).
7

Желе , 9 байт

ẆŒ!€;/QḟW

Монадическая ссылка, принимающая список и возвращающая список всех отдельных субанаграмм, кроме самого ввода.

Попробуйте онлайн! (нижний колонтитул довольно печатает результирующий список, соединяясь с новыми строками.)

Как?

ẆŒ!€;/QḟW - Link: list of characters, s
Ẇ         - all contiguous sublists of s
 Œ!€      - all permutations for €ach sublist now a list of lists of lists)
     /    - reduce by:
    ;     -   concatenation (flattens the list by one level)
      Q   - de-duplicate (gets the unique entries)
        W - wrap s in a list (otherwise filtering will attempt to remove characters)
       ḟ  - filter discard from left if in right (remove the one equal to the input)
Джонатан Аллан
источник
4

Пиф, 12

-{.n.pM.:Q)]

Интернет тест .

         Q       # input
       .: )      # all substrings
    .pM          # all permutations of all substrings
  .n             # flatten
 {               # deduplicate
-          ]Q    # subtract (list of) (implicit) input
Цифровая травма
источник
@ ais523 Redone - я думаю, что сейчас это правильно.
Цифровая травма
3

Japt , 10 байт

à má c â Å

Попробуйте онлайн!

Я должен использовать à, áи âвсе в одном ответе, по порядку тоже. Какое совпадение...

объяснение

 à má c â Å
Uà má c â s1  // Ungolfed
              // Implicit: U = input string
Uà            // Take all combinations of characters in the input string.
   má         // Map each combination to all of its permutations.
      c       // Flatten into a single array.
        â     // Uniquify; remove all duplicates.
          s1  // Remove the first item (the input) from the resulting array.
              // Implicit: output resulting array, separated by commas
ETHproductions
источник
1
Ты даже умудрился Å тоже.
Грифон
1

Mathematica, 60 байт

DeleteCases[""<>#&/@Permutations[c=Characters@#,Tr[1^c]],#]&

Permutationsпринимает необязательный числовой аргумент, который сообщает ему, сколько входных значений использовать для перестановок. Если мы дадим ему длину ввода, он сгенерирует перестановки для всех подмножеств ввода без дубликатов. Все, что нам нужно сделать, это удалить вход.

Мартин Эндер
источник
1

Java 8, 313 312 306 байт

import java.util.*;s->{Set l=new HashSet();for(int z=s.length(),i=0,j;i<z;i++)for(j=i;j<z;p("",s.substring(i,j+++1),l));l.remove(s);l.forEach(System.out::println);}void p(String p,String s,Set l){int n=s.length(),i=0;if(n<1)l.add(p);else for(;i<n;p(p+s.charAt(i),s.substring(0,i)+s.substring(i+++1,n),l));}

Модифицированная версия моего ответа здесь , где p("",s,l);была заменена наfor(int z=s.length(),i=0,j;i<z;i++)for(j=i;j<z;p("",s.substring(i,j+++1),l));

-6 байт благодаря @ OlivierGrégoire в моем связанном ответе.

Объяснение этой части:

Попробуй это здесь.

for(int l=s.length(),i=0,j;i<l;i++)
                               // Loop (1) from 0 to the length of the String (exclusive)
  for(j=i+1;j<=l;              //  Loop (2) from 1 to the length of the String (exclusive)
    p("",                      //   Call the permutation-method,
    s.substring(i,j+++1),l));  //   with a substring from `i` to `j` (inclusive)
                               //  End of loop (2) (implicit / single-line body)
                               // End of loop (1) (implicit / single-line body)
Кевин Круйссен
источник
0

Perl 6 , 75 байт

{unique(flat $_,.comb.combinations.skip».permutations.map(*».join)).skip}

Попытайся

Expanded:

{                    # bare block lambda with implicit parameter 「$_」

  unique(            # return each (sub)anagram once

    flat             # unstructure the following (List of Lists into flat List)
      $_,            # the input (so we can skip it at the end)

      .comb          # split the input into graphemes
      .combinations  # get all the combinations
      .skip\         # skip the first empty combination
      ».permutations # get all the permutations of each combination
      .map(*».join)  # join the inner permutations

  ).skip             # skip the first value (the input)
}
Брэд Гилберт b2gills
источник