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

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

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

œê»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

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.


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



6

Haskell, 46 Bytes

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

2 Bytes gespart dank nimi


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

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 ...


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


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.


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

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

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


2

Python 3, 77-85 Bytes

Jetzt sortiert!

import itertools as i
for a in sorted(set(i.permutations(input()))):print("".join(a))

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

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.


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.


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

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


0

Ruby, 51 Bytes

->s{puts s.chars.permutation.map(&:join).uniq.sort}

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.

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.


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


0

Japt v2.0a0 -R, 5 Bytes

á â n

Versuch es


û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

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
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.