Alphabetisch permutieren eine Zeichenfolge

27

Aufgabe

Ihr Ziel ist es, ein Programm zu schreiben, das bei gegebener Eingabezeichenfolge (oder einem Array von Zeichen) jede mögliche Permutation der Buchstaben in dieser Zeichenfolge ausgibt. Ich bin pingelig mit meiner Ausgabe, daher sollte sie alphabetisch sortiert sein, ohne Duplikate.

Beispiel:

Eingang: buzz

Ausgabe:

buzz
bzuz
bzzu
ubzz
uzbz
uzzb
zbuz
zbzu
zubz
zuzb
zzbu
zzub

Regeln

  • Das ist also gewinnt der kürzeste Code.
  • Nachgestellte Leerzeichen in jeder Zeile sind in Ordnung
  • Eine einzelne Zeile nach der letzten Zeile ist zulässig (aber nicht mehr).
Brian Gradin
quelle
Kann Ausgabeformat sein ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]?
Luis Mendo
Entschuldigung, wie gesagt, ich bin pingelig;) Die Ausgabe muss in separaten Zeilen erfolgen, nicht in einem Listenformat
Brian Gradin
Ja, das macht Sinn. Ich wollte nur sehen, ob ich ein Byte aus meiner CJam-Antwort ( N*zu p) entfernen könnte :-)
Luis Mendo
2
Eine solide erste Herausforderung!
16.
1
So viele eingebaute!
Dan

Antworten:

23

Gelee , 5 Bytes

ṢŒ!QY

Probieren Sie es online!

Erläuterung

Ṣ         Sort
 Œ!       All permutations
   Q      Unique
    Y     Join by linefeeds
Luis Mendo
quelle
26
Und ... wir haben 100000 Beiträge! Glückwunsch!
ETHproductions
1
@ETHproductions Heh! Vielen Dank! :-)
Luis Mendo
1
Herzlichen Glückwunsch auch von meiner Seite :) @ETHproductions wie bist du zu diesem Ergebnis gekommen? Ich bin nur neugierig ...
geisterfurz007 Stoppt dieses Chaos
5
@ geisterfurz007 Klicken Sie unten im Beitrag auf den Link "Teilen". Das hat ID des Beitrags in der URL.
Martin Ender
1
Ach so, es ist der 100000. Post von ppcg! Ich dachte, Luis Mendo wäre schon bei dieser Nummer. Mein Fehler. Danke für die Erklärung!
geisterfurz007 Stoppen Sie dieses Chaos
12

05AB1E ,  4  3 Bytes

Aktualisiert, da ein Update auf œdie alte Version,
die auch ein Byte wie von Magic Octopus Urn vorgeschlagen gespeichert brach .

œê»

Probieren Sie es online!

Erläuterung

œ     # get all permutations of input
 ê    # sort and remove duplicates
  »   # join list by newlines
Emigna
quelle
œê»ist in Ordnung für Nicht-Vermächtnis.
Magic Octopus Urn
@MagicOctopusUrn: Wird für beide Versionen benötigt, da œjetzt eine Liste der Zeichenfolgen in beiden zurückgegeben wird.
Emigna
10

MATL , 4 Bytes

Y@Xu

Probieren Sie es online!

Erläuterung

Y@    % Implicit input. Push 2D array of all permutations, each on a row, sorted
Xu    % Unique rows. Implicitly display
Luis Mendo
quelle
10

Python 3.5, 79 Bytes

def f(s,w=''):
 s or print(w)
 for c in sorted({*s}):t=s*1;t.remove(c);f(t,w+c)

Eine Funktion, die Eingaben als Liste von Zeichen und Ausgaben beim Drucken annimmt.

Erstellt rekursiv jede eindeutige Permutation, indem jedes mögliche nächste Zeichen alphabetisch aus den verbleibenden eindeutigen Zeichen herausgenommen und an die laufende Ausgabe angehängt wird w. Dann wiederholen wir den Vorgang, wobei dieses Zeichen entfernt wurde. Sobald die Eingabe geleert ist, drucken wir w.

xnor
quelle
Geben Sie eine Liste von Zeichen ein, keine Zeichenfolge.
Xnor
8

Pyth - 5 Bytes

jS{.p

Probieren Sie es hier online aus .

j        Join. Implictly joins on newlines.
 S       Sort
  {      Uniquify
   .p    All permutations, implicitly run on input.
Maltysen
quelle
Wird das Swirklich gebraucht?
Luis Mendo
@LuisMendo Wird benötigt, wenn die Eingabe noch nicht sortiert ist.
Isaacg
1
@isaacg Danke! Mir ist nur aufgefallen, dass ich das auch in meiner Gelee-Antwort brauche
Luis Mendo,
@ LuisMendo whoops.
Maltysen
6

Haskell, 46 Bytes

import Data.List;unlines.sort.nub.permutations

2 Bytes gespart dank nimi

poi830
quelle
1
Sie brauchen keinen Namen für die Funktion, also können Sie die löschen f=.
nimi
5

J, 19 Bytes

/:~@~.@:{~!@#A.&i.#

Testfall

   f =: /:~@~.@:{~!@#A.&i.#
   f 'buzz'
buzz
bzuz
bzzu
ubzz
uzbz
uzzb
zbuz
zbzu
zubz
zuzb
zzbu
zzub

Erläuterung

Dies ist ein 4-Zug:

                     /- ~ --- /:
               /- @ -^- ~.
  /- ~ --- @: -^- {
  |
  |            /- !
--<     /- @ --^- #
  |     |
  \-----<      /- A.
        >- & --^- i.
        \- #

Grundsätzlich gilt:

/:~@~.@:{~!@#A.&i.#
          !  A.&     get permutations
           @#   i.#  of range (0..length)
        {~           map indices to chars in string
      @:             then
    ~.               unique
   @                 then
/:~                  sort
Conor O'Brien
quelle
Ich denke [:~.i.@!@#A./:~, Sie sollten ein paar Bytes sparen
Meilen
4

JavaScript (Firefox 30+), 129 124 Bytes

f=(a,i=-1)=>a[1]?[for(x of a.sort())if(a.indexOf(x)==++i)f([...a.slice(0,i),...a.slice(i+1)]).replace(/^/gm,x)].join`
`:a[0]

Nicht schlecht für eine Sprache ohne eingebaute Permutation ...

ETHproductions
quelle
Ich habe dies konvertiert, um Strings zu bearbeiten. Trotz 23 Bytes, nur um die Zeichen in der richtigen Reihenfolge zu sortieren, habe ich die Aufgabe immer noch in 120 Bytes erledigt.
Neil
3

Python 3.5, 81 Bytes:

from itertools import*;lambda i:'\n'.join(sorted({*map(''.join,permutations(i))}))

Wirklich ... 81 Bytes, wenn die nächstlängste Antwort 48 Bytes ist ... seufz . Nun, ich werde dieses Golfspiel so oft wie möglich ausprobieren, aber Golftipps werden immer noch sehr geschätzt.

Auch hier ist die kürzeste Lösung, die ich in Python 2 mit 86 Bytes bekommen konnte :

from itertools import*;lambda f:'\n'.join(sorted({''.join(i)for i in permutations(f)}))

Offenbar in Python 2, [*...]kehrt ein Syntax Error, und da permutationskehrt itertools.permutations object at 0x...der nächste kürzeste Weg (die ich kenne) die Extraktions einzigartigen Permutationen verwendet , {''.join(i)for i in permutations(f)}wo fist die Eingabezeichenfolge.

Beachten Sie abschließend, dass dies beide Lambda-Funktionen sind und daher im Format aufgerufen werden müssen print(<Function Name>(<Input String>)).

R. Kap
quelle
3

Mathematica, 34 23 Bytes

Print@@@Permutations@#&

Die Eingabe muss eine Liste von Zeichen sein.

Erläuterung

Permutations@

Hier finden Sie alle Permutationen der Eingabe, sortiert und duplikationsfrei.

Print@@@

Drucken Sie sie einzeln aus.

JungHwan min
quelle
3

Brachylog , 9 Bytes

:pfdo~@nw

Probieren Sie es online!

Erläuterung

:pf         Find all outputs of p - Permute with the main Input as input
   d        Remove Duplicates
    o       Order
     ~@n    Concatenate into a single string with linebreaks as separator
        w   Write to STDOUT
Tödlich
quelle
3

Perl 6 ,  49  44 Bytes

String als Eingabe

*.comb.permutations.sort».join.squish.map: *.put

Liste der Zeichen als Eingabe

*.permutations.sort».join.squish.map: *.put

Erweitert

*\              # Whatever lambda
# .comb\        # split into a list of characters
.permutations\  # returns a list of lists
.sort\
».join\         # join the second level lists
.squish\        # remove adjacent repeated values
.map: *.put     # print each on its own line
Brad Gilbert b2gills
quelle
2
Jedes Mal, wenn ich Perl 6-Code sehe, frage ich mich, warum ich ihn noch nicht installiert habe
Gabriel Benamy,
@ GabrielBenamy Es gibt einen IRC-Bot, der Perl 6-Code auf dem #perl6Kanal freenode.net ausführt .
Brad Gilbert b2gills
Sie können ».sayanstelle von.map: *.put
Jo King
1
@JoKing Technisch ».sayist es erlaubt, sie in beliebiger Reihenfolge auszuführen , und zu einem Zeitpunkt wurde dies absichtlich nicht in der richtigen Reihenfolge ausgeführt.
Brad Gilbert b2gills
3

Brachylog (v2), 5 Bytes

pᵘoẉᵐ

Probieren Sie es online!

Finden nique permutations der Eingabe, s ort sie, ap riteln (Schreiben mit Newline) über das Array.

Sundar - Setzen Sie Monica wieder ein
quelle
2

Python 3, 77-85 Bytes

Jetzt sortiert!

import itertools as i
for a in sorted(set(i.permutations(input()))):print("".join(a))
Aryaman
quelle
1
Um dies zu verkürzen, könnten Sie tun, from itertools import*im Gegensatz zu import itertools as i. Sie wäre in der Lage , ein Byte durch den Ersatz speichern i.permutationsdurch permutations.
0WJYxW9FMN
Mit {*...}statt set(...)sparen Sie zwei weitere Bytes.
Movatica
2

PowerShell v3 +, 171 Byte

param([char[]]$x)$a,$b=$x;$a=,$a;while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}$a|?{$_.length-eq$x.count}|sort -u

In PowerShell v3 wurde das -UniqueFlag für das Sort-ObjectCmdlet eingeführt, sodass es einige Bytes kürzer ist als die Version unter v2, da dies nicht erforderlich ist Select.

v2 version, 178 bytes:

param([char[]]$x)$a,$b=$x;$a=,$a;while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}$a|?{$_.length-eq$x.count}|select -u|sort

In PowerShell sind keine Permutationen integriert, daher habe ich meinen Code von Prime Factors Buddies ausgeliehen und ihn für die Verwendung hier leicht optimiert.

Dies sind im Wesentlichen drei Teile, auf die ich im Folgenden näher eingehen werde.

param([char[]]$x)$a,$b=$x;$a=,$aNimmt Eingaben auf $x, charwandelt sie als -array um, entfernt den ersten Buchstaben $aund den Rest $bund setzt sie dann $amit dem Komma-Operator als Array um.

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Durchläuft die verbleibenden Buchstaben ( $b), wobei jede Iteration den nächsten Buchstaben aufnimmt $zund in die verbleibenden Buchstaben speichert und diese $bdann in einem Array auf $adas Ergebnis des Sendens $ain einer eigenen Schleife verkettet - jedes Element von $a(temporär gespeichert in $c) wird durchlaufen seine eigene .length, und dann $zwird in jeder Position eingefügt, einschließlich Voranstellen und Anhängen mit $z$cund $c$z. Zum Beispiel für $c = '12'und $z = '3'wird dies dazu führen , '132','312','123'in wird verketteten zurück $a.

Der letzte Teil $a|?{$_.length-eq$x.count}|select -u|sortnimmt jedes Element von $aund verwendet eine Where-ObjectKlausel, um nur diejenigen herauszufiltern, die die gleiche Länge wie die Eingabezeichenfolge haben, dann selectnur die -uNique-Elemente und schließlich sortdiese alphabetisch. Die resultierenden Zeichenfolgen verbleiben alle in der Pipeline und werden implizit Write-Outputnach Programmabschluss ausgegeben .

PS C:\Tools\Scripts\golfing> .\alphabetically-permute-a-string.ps1 'PPCG'
CGPP
CPGP
CPPG
GCPP
GPCP
GPPC
PCGP
PCPG
PGCP
PGPC
PPCG
PPGC
AdmBorkBork
quelle
Wenn Sie bereit sind , 3,0 gehen können Sie ändern |select -u|sortzu |sort -u. Ziemlich sicher, dass 2.0 das nicht hat.
Matt
@Matt Danke - du hast recht. Das wurde in v3 eingeführt.
AdmBorkBork
2

JavaScript (ES6), 119 Byte

f=(s,t=[...s].sort().join``,p=``)=>t?t.replace(/./g,(c,i)=>t.indexOf(c)==i?f(s,t.slice(0,i)+t.slice(i+1),p+c):``):p+`\n`

Wobei \ndas wörtliche Zeilenumbruchzeichen darstellt. Die Antwort von Port of @ ETHproduction, Strings anstelle von Arrays zu verwenden. Das Umkehren der Ausgabe oder das Verschieben der nachgestellten Zeile an den Anfang spart 3 Bytes.

Neil
quelle
1

R, 113 Bytes

x=scan(,"");cat(sort(unique(apply(matrix(x[permute:::allPerms(l<-length(x))],,l),1,paste,collapse=""))),sep="\n")

Liest die Eingabe von stdin. Es permutewird davon ausgegangen, dass das Paket installiert ist, um die allPermsFunktion aufzurufen .

Füge eine Erklärung hinzu, wenn ich von der Arbeit nach Hause komme.

Billywob
quelle
1

Java 302 300 Bytes

import java.util.*;class M{public static void main(String[]a){for(Object s:p(new TreeSet(),"",a[0]))System.out.println(s);}static Set p(Set l,String p,String s){int n=s.length(),i=0;if(n>1)for(;i<n;p(l,p+s.charAt(i),s.substring(0,i)+s.substring(++i,n)));else if(!l.contains(p+=s))l.add(p);return l;}}

Ungolfed & Testcode:

Probieren Sie es hier aus.

import java.util.*;
class M{
  static Set p(Set l, String p, String s){
    int n = s.length(),
        i = 0;
    if(n > 1){
      for(; i < n; p(l, p + s.charAt(i), s.substring(0, i) + s.substring(++i, n)));
    } else if(!l.contains(p+=s)){
      l.add(p);
    }
    return l;
  }

  public static void main(String[] a){
    for(Object s : p(new TreeSet(), "", a[0])){
      System.out.println(s);
    }
  }
}

Eingang: Test
Ausgang:

estt
etst
etts
sett
stet
stte
test
tets
tset
tste
ttes
ttse
Kevin Cruijssen
quelle
1
Die Permutationen sollen alphabetisch sortiert sein
Ikaros
@Ikaros Danke, sollte jetzt behoben sein.
Kevin Cruijssen
1

Schläger 82 Bytes

(sort(remove-duplicates(map list->string(permutations(string->list s)))) string<?)

Ungolfed:

(define(f s)
 (sort
  (remove-duplicates
   (map
    list->string
    (permutations
     (string->list s))))
  string<?))

Testen:

(f "buzz")

Ausgang:

'("buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub")
rnso
quelle
0

Groovy, 69 Bytes

{(it as List).permutations().unique().sort().each{println it.join()}}
Magische Kraken-Urne
quelle
0

Ruby, 51 Bytes

->s{puts s.chars.permutation.map(&:join).uniq.sort}
Lee W
quelle
Wie können wir es betreiben?
بار
puts s.chars.permutation().map(&:join).uniq43 Byte
بارپابابا
Das geht nicht Sie müssen die Ausgabe sortieren und können sohne vorherige Definition nicht darauf verweisen .
Lee W
0

Eigentlich 8 Bytes

Golfvorschläge willkommen! Probieren Sie es online!

;l@╨♂Σ╔i

Ungolfing

     Implicit input s.
;l   Get len(s).
@╨   Get all len(s)-length permutations of s.
♂Σ   Sum them all back into strings.
╔    uniq() the list of strings.
i    Flatten the list of strings.
     Implicit print the stack, separated by newlines.
Sherlock9
quelle
0

Pip , 8 Bytes

7 Byte Code, +1 für -nFlag.

SSUQPMa

Nimmt eine Zeichenfolge als Befehlszeilenargument. Probieren Sie es online!

Pips Scanner zerlegt Serien von Großbuchstaben in Zwei-Buchstaben-Blöcke. Dieser Code ist also SS UQ PM a--ie SortString(UniQue(PerMutations(a))), wobei aes sich um das Befehlszeilenargument handelt. Das -nFlag stellt sicher, dass die Ergebnisliste durch Zeilenumbrüche getrennt ist. Das ist alles dazu.

DLosc
quelle
0

K (oK) , 14 Bytes

Lösung:

?x@<x@:prm@#x:

Probieren Sie es online!

Erläuterung:

Verwenden Sie die integrierte Permutationsfunktion, prmum Permutationen der Länge der Eingabe zu generieren, wenden Sie diese Permutationen auf die Eingabe an, sortieren Sie sie alphabetisch und nehmen Sie dann unterschiedliche Werte an.

?x@<x@:prm@#x: / the solution
            x: / store input as x
           #   / count length of x
       prm@    / apply (@) function prm
    x@:        / apply indices to x and save result back into x
   <           / indices to sort ascending
 x@            / apply to x
?              / take distint
Streetster
quelle
0

Japt v2.0a0 -R, 5 Bytes

á â n

Versuch es

Verkörperung der Ignoranz
quelle
ûist die Center-Pas-Methode; Ich denke du meintest n;)
Shaggy
@Shaggy Ich habe gerade sortdie Suchleiste in Ihrem Dolmetscher eingefügt und auf die erste geklickt, die ich gefunden habe. Aber áscheint jede Permutation bereits in alphabetischer Reihenfolge zu geben
Verkörperung der Ignoranz
Hoppla, das ist ein Tippfehler. sollte sein ü. Ich werde es morgen reparieren. Die Permutationen von "Buzz" werden zufällig sortiert, weil das Wort selbst lautet - versuchen Sie es beispielsweise mit "zzub".
Shaggy
@ Shaggy, ich sehe, aktualisierte Antwort mit n(es ist einfacher zu tippen)
Verkörperung der Ignoranz
0

C ++ (gcc) , 132 128 Bytes

#include<bits/stdc++.h>
using namespace std;int main(){string s;for(cin>>s;cout<<s<<endl,next_permutation(s.begin(),s.end()););}

Probieren Sie es online!

movatica
quelle
0

Muschel , 9 Bytes

p_D`Sq@~Q

Erläuterung

          - Implicit Q = first input
p         - Print...
 _        - Sorted ascending value (alphabetical order)
  D       - Distinct from...
   `Sq    - Joined (map(q=>q.join(""))
      @~Q - Permutations of Q
Skidsdev
quelle