Permutez alphabétiquement une chaîne


27

Tâche

Votre objectif, si vous l'acceptez, est d'écrire un programme qui, étant donné une chaîne d'entrée (ou un tableau de caractères), génère toutes les permutations possibles des lettres de cette chaîne. Je suis tatillon avec ma sortie, donc elle doit être triée par ordre alphabétique, sans doublons.

Exemple:

Contribution: buzz

Sortie:

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

Règles

  • C'est le donc le code le plus court l'emporte.
  • Les espaces de fin sur chaque ligne / n'importe quelle ligne sont corrects
  • Une seule nouvelle ligne après la dernière ligne est autorisée (mais pas plus)

Le format de sortie peut ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]-il être ?
Luis Mendo

Désolé, comme je l'ai mentionné, je suis capricieux;) la sortie doit être sur des lignes distinctes, plutôt que dans un format de liste
Brian Gradin

Oui, cela a du sens. Je voulais juste voir si je pouvais retirer un octet de ma réponse CJAM ( N*à p) :-)
Luis Mendo

2
Un premier défi solide!
xnor

1
Tant de builtins!
Dan

Réponses:


23

Gelée , 5 octets

ṢŒ!QY

Essayez-le en ligne!

Explication

Ṣ         Sort
 Œ!       All permutations
   Q      Unique
    Y     Join by linefeeds

26
Et ... nous avons 100000 messages! Félicitations!
ETHproductions

1
@ETHproductions Heh! Merci! :-)
Luis Mendo

1
Félicitations aussi de mon côté :) @ETHproductions comment avez-vous obtenu ce résultat? Je suis juste curieux ...
geisterfurz007 Arrêtez ce chaos

5
@ geisterfurz007 Cliquez sur le lien "partager" en bas de l'article. Qui a l'ID de la publication dans l'URL.
Martin Ender

1
Oh donc c'est le 100 000ème post de ppcg! Je pensais que Luis Mendo était déjà à ce numéro. Ma faute. Merci pour l'explication!
geisterfurz007 Arrêtez ce chaos

12

05AB1E ,  4  3 octets

Mise à jour, depuis une mise à jour pour œcasser l'ancienne version,
qui a également enregistré un octet comme suggéré par Magic Octopus Urn .

œê»

Essayez-le en ligne!

Explication

œ     # get all permutations of input
 ê    # sort and remove duplicates
  »   # join list by newlines

œê»est bien pour les non-hérités.
Urne de poulpe magique

@MagicOctopusUrn: Il est en fait requis pour les deux versions car œrenvoie maintenant une liste de chaînes dans les deux.
Emigna


10

Python 3.5, 79 octets

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

Une fonction qui prend en entrée une liste de caractères et sort par impression.

Effectue récursivement chaque permutation distincte en retirant alphabétiquement chaque caractère suivant possible des caractères distincts restants et en l'ajoutant à la sortie en cours w. Ensuite, nous récursions avec ce personnage supprimé. Une fois l'entrée vide, nous imprimons w.


Prenez une liste de caractères, pas une chaîne.
xnor


8

Pyth - 5 octets

jS{.p

Essayez-le en ligne ici .

j        Join. Implictly joins on newlines.
 S       Sort
  {      Uniquify
   .p    All permutations, implicitly run on input.

Est-ce Svraiment nécessaire?
Luis Mendo

@LuisMendo Il est nécessaire si l'entrée n'est pas déjà triée.
isaacg

1
@isaacg Merci! Je viens de réaliser que j'en ai aussi besoin dans ma réponse Jelly
Luis Mendo

@LuisMendo whoops.
Maltysen

6

Haskell, 46 octets

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

2 octets économisés grâce à nimi


1
Vous n'avez pas besoin d'un nom pour la fonction, vous pouvez donc supprimer le f=.
nimi

5

J, 19 octets

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

Cas de test

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

Explication

Il s'agit d'un 4 trains:

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

Fondamentalement:

/:~@~.@:{~!@#A.&i.#
          !  A.&     get permutations
           @#   i.#  of range (0..length)
        {~           map indices to chars in string
      @:             then
    ~.               unique
   @                 then
/:~                  sort

Je pense que cela [:~.i.@!@#A./:~devrait vous faire économiser quelques octets
miles

4

JavaScript (Firefox 30+), 129 124 octets

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]

Pas trop mal pour une langue sans permutation intégrée ...


J'ai converti cela pour opérer sur des cordes; malgré le fait de prendre 23 octets juste pour trier les caractères dans l'ordre, j'ai quand même fait le travail en 120 octets.
Neil

3

Python 3.5, 81 octets:

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

Vraiment ... 81 octets lorsque la prochaine réponse la plus longue est de 48 octets ... soupir . Eh bien, je vais essayer ce golf autant que possible, mais les conseils de golf sont toujours très appréciés.

En outre, voici la solution la plus courte que j'ai pu obtenir en Python 2 à 86 octets :

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

Apparemment en Python 2, [*...]retourne un Syntax Error, et depuis permutationsretourne itertools.permutations object at 0x..., la prochaine façon la plus courte (que je connaisse) d'extraire les permutations uniques utilise {''.join(i)for i in permutations(f)}fest la chaîne d'entrée.

Enfin, notez que ce sont deux fonctions lambda et doivent donc être appelées dans le format print(<Function Name>(<Input String>)).


3

Mathematica, 34 23 octets

Print@@@Permutations@#&

L'entrée doit être une liste de caractères.

Explication

Permutations@

Trouvez toutes les permutations de l'entrée, triées et sans doublon.

Print@@@

Imprimez-les un par un.


3

Brachylog , 9 octets

:pfdo~@nw

Essayez-le en ligne!

Explication

: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 octets

Chaîne en entrée

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

Liste des caractères en entrée

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

Étendu

*\              # 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
chaque fois que je vois du code perl 6, je me demande pourquoi je ne l'ai pas encore installé
Gabriel Benamy

@GabrielBenamy Il existe un bot irc qui exécute le code Perl 6 sur le #perl6canal freenode.net .
Brad Gilbert b2gills

Vous pouvez faire à la ».sayplace de.map: *.put
Jo King

1
@JoKing Techniquement ».sayest autorisé à les faire dans n'importe quel ordre, et à un moment donné, il a été délibérément fait hors service.
Brad Gilbert b2gills


2

Python 3, 77 85 octets

Maintenant, trie!

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

1
Pour raccourcir cela, vous pouvez faire from itertools import*plutôt que import itertools as i. Vous pourrez enregistrer un octet en le remplaçant i.permutationspar permutations.
0WJYxW9FMN

Utiliser {*...}au lieu de set(...)vous permet d' économiser deux octets supplémentaires.
movatica

2

PowerShell v3 +, 171 octets

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

PowerShell v3 a introduit le -Uniquedrapeau sur leSort-Object applet de commande, il est donc plus court de quelques octets que la version v2 ci-dessous, car nous n'avons pas besoin de Selectcommencer.

version v2, 178 octets:

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

PowerShell n'a pas de permutations intégrées, j'ai donc emprunté mon code à Prime Factors Buddies et l' ai légèrement modifié pour l'utiliser ici.

Il s'agit essentiellement de trois parties, que je développerai ci-dessous.

param([char[]]$x)$a,$b=$x;$a=,$aPrend l'entrée $x, la chartransforme en tableau, supprime la première lettre $aet le reste $b, puis la refonte $asous forme de tableau avec l'opérateur virgule.

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Boucle à travers les lettres restantes ( $b), chaque itération prenant la lettre suivante et la stockant dans $zet en laissant le reste $b, puis concaténant le tableau sur $ale résultat de l'envoi $avia sa propre boucle - chaque élément de $a(temporairement stocké dans $c) est bouclé son propre .length, puis $zest inséré dans chaque position, y compris pré-ajout et ajout avec $z$cet $c$z. Par exemple, pour $c = '12'et $z = '3', cela se traduira par '132','312','123'une nouvelle concaténation dans $a.

La dernière partie $a|?{$_.length-eq$x.count}|select -u|sortprend chaque élément $aet utilise la Where-Objectclause pour filtrer uniquement ceux qui ont la même longueur que la chaîne d'entrée, puis selects uniquement les -uéléments niques et enfin sorts ceux par ordre alphabétique. Les chaînes résultantes sont toutes laissées sur le pipeline, et la sortie via implicite Write-Outputse produit à la fin du programme.

PS C:\Tools\Scripts\golfing> .\alphabetically-permute-a-string.ps1 'PPCG'
CGPP
CPGP
CPPG
GCPP
GPCP
GPPC
PCGP
PCPG
PGCP
PGPC
PPCG
PPGC

Si vous êtes prêt à passer à la 3.0, vous pouvez passer |select -u|sortà |sort -u. Je suis sûr que 2.0 n'a pas ça.
Matt

@Matt Merci - vous avez raison. Cela a été introduit dans la v3.
AdmBorkBork

2

JavaScript (ES6), 119 octets

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`

\nreprésente le caractère de nouvelle ligne littéral. Port de la réponse de @ ETHproduction pour utiliser des chaînes au lieu de tableaux. Inverser la sortie, ou déplacer le retour à la ligne au début, économise 3 octets.


1

R, 113 octets

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

Lit l'entrée de stdin. Le permutepackage est supposé être installé afin d'appeler leallPerms fonction.

Ajoutera une explication à mon retour du travail.


1

Java 302 300 octets

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;}}

Code non testé et testé:

Essayez-le ici.

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);
    }
  }
}

Entrée: test
Sortie:

estt
etst
etts
sett
stet
stte
test
tets
tset
tste
ttes
ttse

1
Les permutations sont censées être triées par ordre alphabétique
Ikaros

@Ikaros Merci, devrait être corrigé maintenant.
Kevin Cruijssen

1

Raquette 82 octets

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

Non golfé:

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

Essai:

(f "buzz")

Sortie:

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


0

Rubis, 51 octets

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

comment pouvons-nous l'exécuter?
بارپابابا

puts s.chars.permutation().map(&:join).uniq43 octets
بارپابابا

Ça ne marche pas. Vous devez trier la sortie et vous ne pouvez pas vous y référer ssans définition préalable.
Lee W

0

En fait , 8 octets

Suggestions de golf bienvenues! Essayez-le en ligne!

;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 octets

7 octets de code, +1 pour l' -nindicateur.

SSUQPMa

Prend une chaîne comme argument de ligne de commande. Essayez-le en ligne!

Le scanner de Pip divise les séries de lettres majuscules en blocs de deux lettres. Donc, ce code est SS UQ PM a--ie SortString(UniQue(PerMutations(a))), avec al'argument de la ligne de commande. L' -nindicateur garantit que la liste des résultats est séparée par des sauts de ligne. C'est tout ce qu'on peut en dire.


0

K (oK) , 14 octets

Solution:

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

Essayez-le en ligne!

Explication:

Utilisez la fonction de permutation intégrée, prmpour générer des permutations de la longueur de l'entrée, appliquez ces permutations à l'entrée, triez par ordre alphabétique, puis prenez des valeurs distinctes.

?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 octets

á â n

Essayez-le


ûest la méthode du pas central; Je pense que tu voulais dire n;)
Shaggy

@Shaggy Je viens de mettre sortla barre de recherche dans votre interprète et j'ai cliqué sur le premier que j'ai trouvé. Mais ásemble déjà donner chaque permutation dans l'ordre alphabétique
Incarnation de l'ignorance

Oop, c'est une faute de frappe; devrait être ü. Je vais le réparer demain. Les permutations de "buzz" se trouvent être triées parce que le mot lui-même est - essayez-le avec "zzub" à la place, par exemple.
Shaggy

@Shaggy, je vois, réponse mise à jour avec n(c'est plus facile à taper)
Embodiment of Ignorance


0

Palourde , 9 octets

p_D`Sq@~Q

Explication

          - Implicit Q = first input
p         - Print...
 _        - Sorted ascending value (alphabetical order)
  D       - Distinct from...
   `Sq    - Joined (map(q=>q.join(""))
      @~Q - Permutations of Q
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.