Знайдіть усі Анаграми і Субанаграми теж!


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 версії галузевого журналу, для цього використовується 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)


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

1
Ви навіть керували Å теж.
Грифон

1

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

Спробуй це

Розширено:

{                    # 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)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.