Encuentra todos los anagramas!

16

A pesar de tener 17 preguntas etiquetadas , todavía no tenemos esta pregunta, así que aquí está.

Tu tarea

Debe escribir un programa o función que, al recibir una cadena, imprima todos los anagramas posibles de la misma. A los fines de esta pregunta, un anagrama es una cadena que contiene el mismo carácter que la cadena original, pero no es una copia exacta de la cadena original. Un anagrama no tiene que ser o contener palabras reales.

Entrada

Puede aceptar la cadena, que puede ser de cualquier longitud> 0, por cualquier método de entrada estándar. Puede contener caracteres ASCII.

Salida

Puede generar todos los anagramas posibles de la cadena ingresada de cualquier manera estándar. No debe generar la misma cadena dos veces, ni generar una cadena igual a la entrada.

Otras reglas

Las lagunas estándar no están permitidas

Puntuación

Este es el , gana menos bytes.

Grifo
fuente
¿Podemos cumplir con el estándar normal de "programa o función"?
Jonathan Allan
@ JonathanAllan Creo que si no se menciona explícitamente, puede enviar un programa o una función. En general, dejé eso implícito en mis preguntas sin problemas
Digital Trauma
Sí, por supuesto, un programa o una función funcionarán bien.
Gryphon
Muy relacionado
FryAmTheEggman
@gryphon cómo estás editando cosas
Foxy

Respuestas:

9

05AB1E , 3 bytes

œÙ¦

Una función que deja la pila con una lista de los anagramas en la parte superior (y como su único elemento). Como un programa completo imprime una representación de esa lista.

Pruébalo en línea!

¿Cómo?

    - 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
Jonathan Allan
fuente
Debería haber adivinado que 05AB1E sería excesivamente corto.
Gryphon
4

Ruby , 45 bytes

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

Pruébalo en línea!

A pesar de tener una función incorporada, la palabra "permutación" es realmente larga :(

ymbirtt
fuente
El |[]parece innecesario?
canhascodez
@sethrin, no del todo. La especificación dice que los duplicados deben eliminarse. |[]es más corto que .uniq.
ymbirtt
3

MATL , 7 bytes

tY@1&X~

Pruébalo en línea!

Explicación

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
Luis Mendo
fuente
3

pyth , 8 4

-{.p

Prueba en línea .

  .pQ     # all permutations of the (implicit) input string
 {        # de-duplicate
-    Q    # subtract (implicit) input
Trauma digital
fuente
Gran trabajo de golf. Felicidades por atar la impresionante respuesta 05AB1E.
Gryphon
1
Lo sentimos, pero esto genera la misma cadena dos veces si hay el mismo carácter en la entrada dos veces. Por favor arregla eso.
Gryphon
Gracias por arreglar eso. Sin embargo, es una pena que aumente tu recuento de bytes.
Gryphon
Se me ocurrió la misma respuesta, pero también olvidé eliminar la duplicación. ¿Grandes mentes piensan igual?
Tornado547
3

Japt , 6 bytes

á â kU

Pruébalo en línea!

Explicación

 á â 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
ETHproducciones
fuente
Felicidades por robar la victoria. +1
Gryphon
1
@Gryphon No tan rápido, me sorprendería si no son 3 bytes en 05AB1E ...
ETHproductions
Quise decir por ahora. No es como si te estuviera marcando como aceptado todavía.
Gryphon
Si @Dennis hace esto en Jelly, probablemente será como 2 bytes. Uno no simplemente supera a Dennis.
Gryphon
1
La predicción de 3 bytes fue buena, pero ¿hay un 2 ?
Jonathan Allan
3

Haskell, 48 40 bytes

import Data.List
a=tail.nub.permutations

Pruébalo en línea!

Guardado 8 bytes gracias a la tailsugerencia de Leo .

Cristian Lupascu
fuente
2
Puede usarlo en taillugar de delete x, ya que la cadena original siempre aparecerá primero en la lista de permutaciones. Esto le permitirá cambiar a una solución sin puntos, y luego a una función sin nombre, ¡muchos bytes para guardar!
Leo
@Leo Genial, gracias!
Cristian Lupascu
2

CJam , 8 bytes

l_e!\a-p

Pruébalo en línea!

Explicación

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
Luis Mendo
fuente
@JonathanAllan Gracias, corregido
Luis Mendo
@Gryphon Bueno, 7 después de la corrección muy apropiada de Jonathan ;-)
Luis Mendo
Ahora he respondido esa pregunta.
Gryphon
Umm, ¿el TIO sigue emitiendo la cadena original para mí?
Gryphon
@Gryphon Lo siento, debería estar funcionando ahora. Claramente estoy demasiado cansado para esto; yendo a la cama :-P
Luis Mendo
2

Mathematica, 47 bytes

Drop[StringJoin/@Permutations[Characters@#],1]&
J42161217
fuente
Estaba esperando uno de estos, pero estaba bastante seguro de que no iba a ganar. Un poco sorprendido de que no haya uno incorporado.
Gryphon
StringJoin/@Rest@Permutations@Characters@#&es de 43 bytes.
jcai
2

Jalea , 4 bytes

Œ!QḊ

Un enlace monádico que toma una lista de caracteres y devuelve una lista de listas de caracteres, todos anagramas distintos que no son iguales a la entrada.

Pruébalo en línea! (el pie de página forma un programa que se une a la lista mediante nuevas líneas e impresiones para evitar la representación destrozada).

¿Cómo?

Œ!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"]
Jonathan Allan
fuente
Impresionante. ¿Habrá una explicación, porque yo no gelatina?
Gryphon
¡Sí, por supuesto!
Jonathan Allan
Me lo quité hace mucho tiempo, de ahí por qué tenía el "(4?)" En el encabezado y el texto sobre la eliminación Ysi se permitían las funciones ... Sin embargo, veo que simplemente invirtió mi edición a la pregunta: /
Jonathan Allan
2

Python 3, 85 76 63 bytes

Como una función, y devolviendo cadenas como una lista de caracteres (gracias a @ pizzapants184 por decirme que está permitido):

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

Como una función:

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

85 bytes como un programa completo:

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

Podría reducirse un poco si la salida de cadenas como ('a', 'b', 'c') está permitida (no estoy seguro de que lo sea).

nore
fuente
Si solo Python fuera un lenguaje de golf, eh.
Gryphon
1
La salida como ('a', 'b', 'c') debería estar bien, esta respuesta de pyth sí (básicamente).
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 gracias a @ OlivierGrégoire .

Java verbosa típica. Veo muchas respuestas de <10 bytes, y aquí estoy con más de 200 bytes. XD

Explicación:

Pruébalo aquí

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)
Kevin Cruijssen
fuente
Use en l.forEach(System.out::println);lugar de su bucle de impresión. Además, no me gusta Setque me definan a nivel de clase sin su clase adjunta, una lambda definida que nadie sabe dónde y un método. Esto es demasiado para mí. Puedo entender que las importaciones se separen del resto, pero no hay nada autónomo allí, parece más una colección de fragmentos que cualquier otra cosa. Lo siento, pero por primera vez en PCG, doy -1 :(
Olivier Grégoire
@ OlivierGrégoire En primer lugar, gracias por el consejo para el forEach. En cuanto al nivel de clase Set, ¿cuál es la alternativa? ¿Publicar toda la clase, incluido el método principal? ¿Publicar toda la clase excluyendo el método principal, pero incluyendo la clase en sí, la interfaz y el nombre de la función?
Kevin Cruijssen
Escribiría una clase completa. Ese es el más pequeño autocontenido que puedo encontrar. No es necesario agregar el public static void main, solo diga "el método de entrada es ...". La cuestión es que su respuesta tal como es actualmente rompe todas las reglas "autónomas". No estoy en contra de atar las reglas, sino ¿romperlas? Sí, me importa :(
Olivier Grégoire
1
Otra idea: pasar el conjunto como parámetro? La función de ayuda, lo entiendo totalmente, pero está definiendo el conjunto fuera de todo lo que me hace funcionar.
Olivier Grégoire
@ OlivierGrégoire Ok, fui por su segunda sugerencia. De hecho, también tiene más sentido, así que lo usaré de ahora en adelante. Gracias por los comentarios sinceros.
Kevin Cruijssen
1

Perl 6 ,  39  38 bytes

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

Intentalo

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

Intentalo

Expandido

*               # 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)
Brad Gilbert b2gills
fuente
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)));}

sin golf

#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
}
Michiel uit het Broek
fuente
1

K (oK) , 13 bytes

Solución:

1_?x@prm@!#x:

Pruébalo en línea!

Explicación:

La evaluación se realiza de derecha a izquierda.

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)
callejero
fuente
0

JavaScript (ES6), 101 bytes

Adoptado de una respuesta anterior mía .

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])

Darrylyeo
fuente
0

Perl 5 , 89 + 2 ( -F) = 91 bytes

$,=$_;$"=",";map{say if!$k{$_}++&&$,ne$_&&(join"",sort@F)eq join"",sort/./g}glob"{@F}"x@F

Pruébalo en línea!

Xcali
fuente
Es posible que desee agregar una explicación.
Gryphon