Encontre todos os anagramas!


16

Apesar de ter 17 perguntas marcadas com , ainda não temos essa pergunta, então aqui está.

Sua tarefa

Você deve escrever um programa ou função que, ao receber uma string, imprima todos os anagramas possíveis. Para os fins desta pergunta, um anagrama é uma sequência que contém o mesmo caractere que a sequência original, mas não é uma cópia exata da sequência original. Um anagrama não precisa ser ou conter palavras reais.

Entrada

Você pode aceitar a sequência, que pode ter qualquer comprimento> 0, por qualquer método de entrada padrão. Pode conter caracteres ASCII.

Resultado

Você pode emitir todos os anagramas possíveis da string inserida de qualquer maneira padrão. Você não deve produzir a mesma sequência duas vezes ou produzir uma sequência igual à entrada.

Outras regras

As brechas padrão não são permitidas

Pontuação

Isso é , menos bytes ganhos.


Podemos respeitar o padrão normal de "programa ou função"?
Jonathan Allan

@ JonathanAllan Acho que, se não for mencionado explicitamente, você poderá enviar um programa ou uma função. Eu geralmente deixado que está implícito nas minhas perguntas sem problemas
Trauma Digital

Sim, é claro que um programa ou uma função funcionará bem.
Gryphon - Restabelece Monica


@gryphon como você está editando as coisas
Foxy

Respostas:


9

05AB1E , 3 bytes

œÙ¦

Uma função que deixa a pilha com uma lista dos anagramas no topo (e como seu único item). Como um programa completo, imprime uma representação dessa lista.

Experimente online!

Quão?

    - 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

Deveria ter imaginado que 05AB1E seria excessivamente curto.
Gryphon - Restabelece Monica

4

Ruby , 45 bytes

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

Experimente online!

Apesar de ter um built-in, a palavra "permutação" é realmente longa :(


O |[]parece desnecessário?
canhascodez

@sethrin, não exatamente. A especificação diz que duplicatas devem ser removidas. |[]é mais curto que .uniq.
ymbirtt

3

MATL , 7 bytes

tY@1&X~

Experimente online!

Explicação

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

Teste online .

  .pQ     # all permutations of the (implicit) input string
 {        # de-duplicate
-    Q    # subtract (implicit) input

Ótimo trabalho de golfe. Parabéns por amarrar a impressionante resposta 05AB1E.
Gryphon - Restabelece Monica

1
Desculpe, mas isso gera a mesma string duas vezes se houver o mesmo caractere na entrada duas vezes. Por favor, conserte isso.
Gryphon - Restabelece Monica

Obrigado por corrigir isso. Pena que aumenta a contagem de bytes.
Gryphon - Restabelece Monica

Eu vim com a mesma resposta, mas também esqueci de duplicar. Mentes brilhantes pensam igual?
Tornado547

3

Japonês , 6 bytes

á â kU

Experimente online!

Explicação

 á â 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

Parabéns por roubar a vitória. +1
Gryphon - Restabelecer Monica

1
@Gryphon Não tão rápido, eu ficaria chocado se isso não é 3 bytes de 05AB1E ...
ETHproductions

Eu quis dizer por enquanto. Não é como se eu estivesse marcando você como aceito ainda.
Gryphon - Restabelece Monica

Se o @Dennis fizer isso no Jelly, provavelmente será de 2 bytes. Não se supera simplesmente Dennis.
Gryphon - Restabelece Monica

1
A previsão de 3 bytes foi boa, mas há 2 ?!
Jonathan Allan

3

Haskell, 48 40 bytes

import Data.List
a=tail.nub.permutations

Experimente online!

Economizou 8 bytes graças à taildica de Leo .


2
Você pode usar em tailvez de delete x, pois a string original sempre será a primeira na lista de permutações. Isso permitirá que você mude para uma solução sem pontos e, em seguida, para uma função sem nome, muitos bytes a serem salvos!
Leo

@ Leo Ótimo, obrigado!
Cristian Lupascu

2

CJam , 8 bytes

l_e!\a-p

Experimente online!

Explicação

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 Thanks, corrected
Luis Mendo

@Gryphon Well, 7 after Jonathan's very appropripate correction ;-)
Luis Mendo

I have now answered that question.
Gryphon - Reinstate Monica

Umm, the TIO is still outputting the original string for me?
Gryphon - Reinstate Monica

@Gryphon Sorry, it should be working now. I'm clearly too tired for this; going to bed :-P
Luis Mendo

2

Mathematica, 47 bytes

Drop[StringJoin/@Permutations[Characters@#],1]&

I was waiting for one of these, but I was pretty sure it wasn't going to win. Kinda surprised there isn't just one built in.
Gryphon - Reinstate Monica

StringJoin/@Rest@Permutations@Characters@#& is 43 bytes.
jcai

2

Jelly, 4 bytes

Œ!QḊ

A monadic link taking a list of characters and returning a list of lists of characters - all distinct anagrams that are not equal to the input.

Try it online! (the footer forms a program that joins the list by newlines and prints to avoid the otherwise smashed representation).

How?

Œ!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"]

Impressive. Will there be an explanation, because I don't Jelly?
Gryphon - Reinstate Monica

Yes, of course!
Jonathan Allan

I took it off ages ago, hence why I had the "(4?)" in the header and the text about removing Y if functions were allowed... I see you just reversed my edit to the question though :/
Jonathan Allan

2

Python 3, 85 76 63 bytes

As a function, and returning strings as list of characters (thanks to @pizzapants184 for telling me it is allowed):

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

As a function:

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

85 bytes as a full program:

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

Could be reduced a bit if outputting strings as ('a', 'b', 'c') is allowed (I am not sure it is).


If only python was a golfing language, eh.
Gryphon - Reinstate Monica

1
Outputting as ('a', 'b', 'c') should be fine, this pyth answer does (basically).
pizzapants184

2

Java 8, 245 239 237 bytes

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 bytes thanks to @OlivierGrégoire.

Typical verbose Java.. I see a lot of <10 byte answers, and here I am with 200+ bytes.. XD

Explanation:

Try it here.

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)

Use l.forEach(System.out::println); instead of your printing loop. Also, I don't like Set being defined at the class level without its enclosing class, a lambda defined no one knows where and a method. This just too much for me. I can understand the imports being separated from the rest, but there is nothing self-contained there, it looks more like a collection of snippets than anything else. I'm sorry, but for the first time in PCG, I give -1 :(
Olivier Grégoire

@OlivierGrégoire First of all thanks for the tip for the forEach. As for the class-level Set, what is the alternative? Post the entire class including main-method? Post the entire class excluding the main-method, but including the class itself, interface and function name?
Kevin Cruijssen

I'd write a full class. That's the smallest self-contained I can find. No need to add the public static void main, just say "the entry method is...". The thing is that your answer as it currently is breaks all the "self-contained" rules. I'm not against binding the rules, but breaking? Yeah, I mind :(
Olivier Grégoire

1
Another idea: pass the Set as parameter? The helper function, I can totally understand that, but it's defining the Set outside of everything that makes me tick.
Olivier Grégoire

@OlivierGrégoire Ok, went for your second suggestion. Indeed makes more sense as well, so I will use that from now on. Thanks for the honest feedback.
Kevin Cruijssen

1

Perl 6,  39  38 bytes

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

Try it

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

Try it

Expanded

*               # 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)

1

C++, 142 bytes

#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 (oK), 13 bytes

Solution:

1_?x@prm@!#x:

Try it online!

Explanation:

Evaluation is performed right-to-left.

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)

0

JavaScript (ES6), 101 bytes

Adopted from a past answer of mine.

S=>(R=new Set,p=(s,m='')=>s[0]?s.map((_,i)=>p(a=[...s],m+a.splice(i,1))):R.add(m),_=p([...S]),[...R])


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.