Finde alle Anagramme!


16

Obwohl wir 17 Fragen mit , haben wir diese Frage immer noch nicht, also hier ist sie.

Deine Aufgabe

Sie müssen ein Programm oder eine Funktion schreiben, die beim Empfang eines Strings alle möglichen Anagramme davon ausgibt. Für die Zwecke dieser Frage ist ein Anagramm eine Zeichenfolge, die dasselbe Zeichen wie die ursprüngliche Zeichenfolge enthält, jedoch keine exakte Kopie der ursprünglichen Zeichenfolge ist. Ein Anagramm muss keine tatsächlichen Wörter sein oder enthalten.

Eingang

Sie können die Zeichenfolge, die eine beliebige Länge> 0 haben kann, mit einer beliebigen Standardeingabemethode akzeptieren. Es kann beliebige ASCII-Zeichen enthalten.

Ausgabe

Sie können alle möglichen Anagramme des eingegebenen Strings auf jede Standardweise ausgeben. Sie dürfen dieselbe Zeichenfolge nicht zweimal ausgeben oder eine der Eingabe entsprechende Zeichenfolge ausgeben.

Andere Regeln

Standard-Regelungslücken sind nicht zulässig

Wertung

Das ist , die wenigsten Bytes gewinnen.


Dürfen wir uns an den normalen "Programm- oder Funktions" -Standard halten?
Jonathan Allan

@ JonathanAllan Ich denke, wenn es nicht ausdrücklich erwähnt wird, können Sie ein Programm oder eine Funktion einreichen. Ich habe das in meinen Fragen im Allgemeinen ohne Probleme gelassen
Digitales Trauma

Ja, natürlich funktioniert entweder ein Programm oder eine Funktion.
Gryphon - Reinstate Monica


@ gryphon wie geht es dir Bearbeitung Dinge
Foxy

Antworten:


9

05AB1E , 3 Bytes

œÙ¦

Eine Funktion, die den Stapel mit einer Liste der Anagramme oben (und als einziges Element) verlässt. Als vollständiges Programm wird eine Darstellung dieser Liste gedruckt.

Probieren Sie es online!

Wie?

    - 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

Hätte erraten sollen, 05AB1E wäre zu kurz.
Gryphon - Reinstate Monica

4

Ruby , 45 Bytes

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

Probieren Sie es online!

Trotz eingebautem Code ist das Wort "Permutation" sehr lang :(


Das |[]scheint unnötig?
Canhascodez

@sethrin, nicht ganz. Die Spezifikation besagt, dass Duplikate entfernt werden sollten. |[]ist kürzer als .uniq.
Ymbirtt

3

MATL , 7 Bytes

tY@1&X~

Probieren Sie es online!

Erläuterung

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

Online-Test .

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

Großartiger Golf-Job. Herzlichen Glückwunsch zum Unentschieden der sehr eindrucksvollen 05AB1E-Antwort.
Gryphon - Reinstate Monica

1
Es tut uns leid, aber dies gibt dieselbe Zeichenfolge zweimal aus, wenn die Eingabe zweimal dasselbe Zeichen enthält. Bitte beheben Sie das.
Gryphon - Reinstate Monica

Danke, dass du das behoben hast. Schade, dass es Ihre Byteanzahl erhöht.
Gryphon - Reinstate Monica

Ich fand die gleiche Antwort, vergaß aber auch, die Duplikate zu entfernen. Große Köpfe denken ähnlich?
Tornado547

3

Japt , 6 Bytes

á â kU

Probieren Sie es online!

Erläuterung

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

Herzlichen Glückwunsch zum Diebstahl des Gewinns. +1
Gryphon - Wiedereinsetzung von Monica

1
@Gryphon Nicht so schnell, ich wäre schockiert, wenn das nicht 3 Bytes in 05AB1E sind ...
ETHproductions

Ich meinte für jetzt. Es ist nicht so, als würde ich dich noch als akzeptiert markieren.
Gryphon - Wiedereinsetzung von Monica am

Wenn @Dennis dies in Jelly tut, werden es wahrscheinlich 2 Bytes sein. Man übertrifft Dennis nicht einfach.
Gryphon - Wiedereinsetzung von Monica am

1
Die 3-Byte-Vorhersage war gut, aber gibt es eine 2 ?!
Jonathan Allan

3

Haskell, 48 40 Bytes

import Data.List
a=tail.nub.permutations

Probieren Sie es online!

8 Bytes gespart dank Leos tailTipp.


2
Sie können tailanstelle von verwenden delete x, da die ursprüngliche Zeichenfolge in der Liste der Permutationen immer an erster Stelle steht. Auf diese Weise können Sie zu einer punktfreien Lösung wechseln und dann zu einer unbenannten Funktion, bei der viele Bytes gespeichert werden müssen!
Leo

@Leo Großartig, danke!
Cristian Lupascu

2

CJam , 8 Bytes

l_e!\a-p

Probieren Sie es online!

Erläuterung

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 Danke, korrigiert
Luis Mendo

@Gryphon Nun, 7 nach Jonathan sehr angemessene Korrektur ;-)
Luis Mendo

Ich habe diese Frage jetzt beantwortet.
Gryphon - Reinstate Monica

Ähm, der TIO gibt immer noch die ursprüngliche Zeichenfolge für mich aus?
Gryphon - Reinstate Monica

@Gryphon Sorry, es sollte jetzt funktionieren. Ich bin eindeutig zu müde dafür; ins Bett gehen :-P
Luis Mendo

2

Mathematica, 47 Bytes

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

Ich habe auf eine davon gewartet, aber ich war mir ziemlich sicher, dass sie nicht gewinnen würde. Ein bisschen überrascht, dass nicht nur eines eingebaut ist.
Gryphon - Reinstate Monica

StringJoin/@Rest@Permutations@Characters@#&ist 43 Bytes.
JCAI

2

Gelee , 4 Bytes

Œ!QḊ

Ein monadischer Link, der eine Liste von Zeichen aufnimmt und eine Liste von Listen von Zeichen zurückgibt - alle unterschiedlichen Anagramme, die nicht mit der Eingabe übereinstimmen.

Probieren Sie es online! (Die Fußzeile bildet ein Programm, das die Liste durch Zeilenumbrüche verbindet und druckt, um die sonst zertrümmerte Darstellung zu vermeiden.)

Wie?

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

Beeindruckend. Wird es eine Erklärung geben, weil ich kein Gelee habe?
Gryphon - Reinstate Monica

Ja natürlich!
Jonathan Allan

Ich nahm es aus vor Jahren, also warum hatte ich die „(4?)“ In der Kopfzeile und der Text über das Entfernen , Ywenn Funktionen erlaubt wurden ... Ich sehe , Sie umgekehrt nur meine Bearbeitung auf die Frage aber: /
Jonathan Allan

2

Python 3, 85 76 63 Bytes

Als Funktion und Rückgabe von Strings als Liste von Zeichen (danke an @ pizzapants184 für den Hinweis, dass dies zulässig ist):

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

Als eine Funktion:

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

85 Bytes als volles Programm:

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

Könnte ein wenig reduziert werden, wenn die Ausgabe von Strings als ('a', 'b', 'c') erlaubt ist (ich bin mir nicht sicher, ob dies der Fall ist).


Wenn nur Python eine Golfsprache wäre, was?
Gryphon - Reinstate Monica

1
Die Ausgabe als ('a', 'b', 'c') sollte in Ordnung sein, diese Pyth-Antwort (im Grunde genommen).
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 dank @ OlivierGrégoire .

Typisch ausführliches Java. Ich sehe viele <10-Byte-Antworten, und hier bin ich mit mehr als 200 Bytes. XD

Erläuterung:

Probieren Sie es hier aus.

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)

Verwenden Sie l.forEach(System.out::println);anstelle Ihrer Druckschlaufe. Außerdem mag ich es nicht Set, auf der Klassenebene definiert zu werden, ohne dass eine Klasse eingeschlossen ist, ein Lambda, das niemand kennt, und eine Methode. Das ist einfach zu viel für mich. Ich kann verstehen, dass die Importe vom Rest getrennt sind, aber es gibt dort nichts Eigenständiges, es sieht eher aus wie eine Sammlung von Schnipsel als irgendetwas anderes. Es tut mir leid, aber zum ersten Mal in PCG gebe ich -1 :(
Olivier Grégoire

@ OlivierGrégoire Erstmal danke für den Tipp für die forEach. SetWas ist die Alternative für die Klassenstufe ? Die gesamte Klasse inklusive Hauptmethode posten? Posten Sie die gesamte Klasse ohne die main-Methode, aber einschließlich der Klasse selbst, der Schnittstelle und des Funktionsnamens.
Kevin Cruijssen

Ich würde eine ganze Klasse schreiben. Das ist die kleinste in sich geschlossene, die ich finden kann. Das muss nicht hinzugefügt public static void mainwerden. Sagen Sie einfach "Die Eingabemethode ist ...". Die Sache ist, dass Ihre Antwort, wie es derzeit ist, alle "in sich geschlossenen" Regeln bricht. Ich bin nicht dagegen, die Regeln zu binden, aber zu brechen? Ja, es stört mich :(
Olivier Grégoire

1
Noch eine Idee: Set als Parameter übergeben? Die Hilfsfunktion kann ich durchaus verstehen, aber sie definiert das Set außerhalb von allem, was mich zum Ticken bringt.
Olivier Grégoire

@ OlivierGrégoire Ok, bin für deinen zweiten Vorschlag gegangen. In der Tat macht es auch mehr Sinn, also werde ich das von nun an nutzen. Danke für das ehrliche Feedback.
Kevin Cruijssen

1

Perl 6 ,  39  38 Bytes

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

Versuch es

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

Versuch es

Erweitert

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

Lösung:

1_?x@prm@!#x:

Probieren Sie es online!

Erläuterung:

Die Auswertung erfolgt von rechts nach links.

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)


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.