Найдите все анаграммы!

16

Несмотря на 17 вопросов, помеченных , у нас все еще нет этого вопроса, так что вот он.

Твое задание

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

вход

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

Выход

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

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

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

счет

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

грифон
источник
Можем ли мы соблюдать нормальный стандарт «программа или функция»?
Джонатан Аллан
@JonathanAllan Я думаю, что если это не указано явно, вы можете отправить программу или функцию. Я обычно оставляю это безоговорочно в своих вопросах без проблем
Digital Trauma
Да, конечно, программа или функция будут работать нормально.
Грифон
Тесно связаны
FryAmTheEggman
@ Грифон, как ты редактируешь вещи
Фокси

Ответы:

9

05AB1E , 3 байта

œÙ¦

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

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

Как?

    - push input
œ   - pop and push a list of all permutations (input appears at the head)
 Ù  - pop and push a list of unique items (sorted by first appearance)
  ¦ - pop and push a dequeued list (removes the occurrence of the input)
    - As a full program: implicit print of the top of the stack
Джонатан Аллан
источник
Должен был предположить, что 05AB1E будет слишком коротким.
Грифон
4

Рубин , 45 байт

->x{(x.chars.permutation.map(&:join)-[x])|[]}

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

Несмотря на наличие встроенного, слово «перестановка» действительно длинное :(

ymbirtt
источник
|[]Кажется ненужным?
canhascodez
@ sethrin, не совсем. В спецификации сказано, что дубликаты должны быть удалены. |[]короче чем .uniq.
Ymbirtt
3

MATL , 7 байт

tY@1&X~

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

объяснение

t     % Implicitly input a string, say of length n. Duplicate
Y@    % All permutations. May contain duplicates. Gives a 2D char array of 
      % size n!×n with each permutation in a row
1&X~  % Set symmetric difference, row-wise. Automatically removes duplicates.
      % This takes the n!×n char array and the input string (1×n char array)
      % and produces an m×n char array containing the rows that are present 
      % in exactly one of the two arrays
      % Implicitly display
Луис Мендо
источник
3

Pyth , 8 4

-{.p

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

  .pQ     # all permutations of the (implicit) input string
 {        # de-duplicate
-    Q    # subtract (implicit) input
Цифровая травма
источник
Отличная работа в гольф. Поздравляю с завязыванием очень впечатляющего ответа 05AB1E.
Грифон
1
Извините, но это выдает одну и ту же строку дважды, если на входе два раза один и тот же символ. Пожалуйста, исправьте это.
Грифон
Спасибо за исправление. Слишком плохо об этом, увеличивая количество байтов, хотя.
Грифон
Я придумал тот же ответ, но также забыл дедублировать. Великие умы думают одинаково?
Торнадо547
3

Japt , 6 байт

á â kU

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

объяснение

 á â kU
Uá â kU   // Ungolfed
          // Implicit: U = input string
Uá        // Take all permutations of U.
   â      // Remove duplicates.
     kU   // Remove U itself from the result.
          // Implicit: output resulting array, separated by commas
ETHproductions
источник
Поздравляю с кражей победы. +1
Грифон
1
@ Грифон Не так быстро, я был бы шокирован, если бы это не было 3 байта в 05AB1E ...
ETHproductions
Я имел в виду сейчас. Не похоже, что я отмечаю тебя как принятую.
Грифон
Если @Dennis сделает это в Jelly, это будет примерно 2 байта. Один не просто обгоняет Денниса.
Грифон
1
3-байтовое предсказание было хорошим, но есть ли 2 ?!
Джонатан Аллан
3

Haskell, 48 40 байт

import Data.List
a=tail.nub.permutations

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

Сохранено 8 байтов благодаря tailподсказке Лео .

Кристиан Лупаску
источник
2
Вы можете использовать tailвместо delete x, так как исходная строка всегда будет первой в списке перестановок. Это позволит вам переключиться на бессмысленное решение, а затем на безымянную функцию, сохраняя много байтов!
Лев
@ Leo Отлично, спасибо!
Кристиан Лупаску
2

CJam , 8 байт

l_e!\a-p

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

объяснение

l    e# Read string from input
_    e# Duplicate
e!   e# Unique permutations. Gives a list of strings
\    e# Swap
a    e# Wrap in a singleton array
-    e# Set difference. This removes the input string
p    e# Pretty print the list
Луис Мендо
источник
@JonathanAllan Спасибо, исправлено
Луис Мендо
@Gryphon Хорошо, 7 после очень правильного исправления Джонатана ;-)
Луис Мендо
Теперь я ответил на этот вопрос.
Грифон
Хм, TIO все еще выводит исходную строку для меня?
Грифон
@Gryphon Извините, сейчас должно работать. Я явно слишком устал для этого; ложусь спать :-P
Луис Мендо
2

Mathematica, 47 байт

Drop[StringJoin/@Permutations[Characters@#],1]&
J42161217
источник
Я ждал одного из них, но я был почти уверен, что он не победит. Кинда удивилась, что там не только один встроенный.
Грифон
StringJoin/@Rest@Permutations@Characters@#&составляет 43 байта.
jcai
2

Желе , 4 байта

Œ!QḊ

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

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

Как?

Œ!QḊ - Link: list of characters     e.g. "text"
Œ!   - all permutations of the list      ["text","tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","extt","ettx","etxt","xtet","xtte","xett","xett","xtte","xtet","ttex","ttxe","tetx","text","txte","txet"]
  Q  - de-duplicate                      ["text","tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","xtet","xtte","xett"]
   Ḋ - dequeue (the first one = input)          ["tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","xtet","xtte","xett"]
Джонатан Аллан
источник
Впечатляет. Будет ли объяснение, потому что я не желе?
Грифон
Да, конечно!
Джонатан Аллан
Я снял его давным-давно, поэтому у меня в заголовке было "(4?)" И текст об удалении, Yесли функции были разрешены ... Я вижу, что вы только что отменили мое редактирование вопроса: /
Джонатан Аллан
2

Python 3, 85 76 63 байта

Как функция и возвращая строки в виде списка символов (спасибо @ pizzapants184 за сообщение, что это разрешено):

from itertools import*
lambda z:set(permutations(z))-{tuple(z)}

Как функция:

from itertools import*
lambda z:map("".join,set(permutations(z))-{tuple(z)})

85 байт как полная программа:

from itertools import*
z=input()
print(*map("".join,set(permutations(z))-{tuple(z)}))

Может быть немного уменьшен, если разрешен вывод строк как ('a', 'b', 'c') (я не уверен, что это так).

Нора
источник
Если бы только питон был языком игры в гольф, а?
Грифон
1
Вывод как ('a', 'b', 'c') должен быть в порядке, этот ответ Pyth делает (в основном).
pizzapants184
2

Java 8, 245 239 237 байт

import java.util.*;s->{Set l=new HashSet();p("",s,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,n),l));}

-6 байт благодаря @ OlivierGrégoire .

Типичная многословная Java .. Я вижу много <10-байтовых ответов, и вот я с 200+ байтами .. XD

Объяснение:

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

import java.util.*;         // Required import for the Set and HashSet

s->{                        // Method (1) with String parameter and no return-type
  Set l=new HashSet();      //  Set to save all permutations in (without duplicates)
  p("",s);                  //  Determine all permutations, and save them in the Set
  l.remove(s);              //  Remove the input from the Set
  l.forEach(                //  Loop over the Set
    System.out::println);   //   And print all the items
}                           // End of method (1)

// This method will determine all permutations, and save them in the Set:
void p(String p,String s,Set l){
  int n=s.length(),         //  Length of the first input String
      i=0;                  //  And a temp index-integer
  if(n<1)                   //  If the length is 0:
    l.add(p);               //   Add the permutation input-String to the Set
  else                      //  Else:
    for(;i<n;               //   Loop over the first input-String
      p(                    //    And do a recursive-call with:
        p+s.charAt(i),      //     Permutation + char
        s.substring(0,i)+s.substring(++i,n),l)
                            //     Everything except this char
      );                    //   End of loop
}                           // End of method (2)
Кевин Круйссен
источник
Используйте l.forEach(System.out::println);вместо вашего цикла печати. Кроме того, мне не нравится, когда меня Setопределяют на уровне класса без включающего его класса, лямбда-определитель никто не знает, где и метод. Это слишком много для меня. Я могу понять, что импорт отделен от остальных, но там нет ничего автономного, он больше похож на коллекцию фрагментов, чем на что-либо еще. Извините, но впервые в PCG я даю -1 :(
Оливье Грегуар
@ OlivierGrégoire Прежде всего, спасибо за совет для forEach. Что касается класса Set, что является альтернативой? Опубликовать весь класс, включая main-method? Опубликовать весь класс, исключая метод main, но включая сам класс, интерфейс и имя функции?
Кевин Круйссен
Я написал бы полный класс. Это самая маленькая отдельная вещь, которую я могу найти. Не нужно добавлять public static void main, просто скажите «метод ввода ...». Дело в том, что ваш ответ в его нынешнем виде нарушает все «автономные» правила. Я не против обязательных правил, но нарушать? Да, я возражаю :(
Оливье Грегуар
1
Другая идея: передать параметр Set as? Вспомогательная функция, я могу это полностью понять, но она определяет Set вне всего, что заставляет меня тикать.
Оливье Грегуар
@ OlivierGrégoire Хорошо, пошли за вашим вторым предложением. Действительно, имеет больше смысла, так что я буду использовать это отныне. Спасибо за честный отзыв.
Кевин Круйссен
1

Perl 6 ,  39  38 байт

*.comb.permutations».join.unique[1..*]

Попытайся

*.comb.permutations».join.unique.skip

Попытайся

расширенный

*               # WhateverCode lambda (this is the parameter)
.comb           # split into graphemes
.permutations\  # get all of the permutations
».join          # join each of them with a hyper method call
.unique         # make sure they are unique
.skip           # start after the first value (the input)
Брэд Гилберт b2gills
источник
1

C ++, 142 байта

#include<algorithm>
void p(std::string s){auto b=s;sort(begin(s),end(s));do if(s!=b)puts(s.data());while(next_permutation(begin(s),end(s)));}

ungolfed

#include <algorithm>

void p(std::string s)
{
    auto b = s;                    // use auto to avoid std::string
    sort(begin(s), end(s));        // start at first permutation
    do
      if (s != b)                  // only print permutation different than given string
        puts(s.data());
    while (next_permutation(begin(s), end(s))); // move to next permutation
}
Михель и Хет Брук
источник
1

K (ок) , 13 байтов

Решение:

1_?x@prm@!#x:

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

Объяснение:

Оценка выполняется справа налево.

1_?x@prm@!#x: / the solution
           x: / store input in variable x
          #   / count length of x, #"abc" => 3
         !    / range, !3 => 0 1 2
     prm@     / apply (@) function permutations (prm) to range
   x@         / apply (@) these pumuted indixes back to original input
  ?           / return distinct values
1_            / drop the first one (ie the original input)
streetster
источник