Alfabetycznie permutuj ciąg


27

Zadanie

Twoim celem, jeśli zdecydujesz się go zaakceptować, jest napisanie programu, który, biorąc pod uwagę ciąg wejściowy (lub tablicę znaków), wypisze każdą możliwą permutację liter w tym ciągu. Moje wyniki są wybredne, więc należy je sortować alfabetycznie, bez duplikatów.

Przykład:

Wkład: buzz

Wydajność:

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

Zasady

  • To jest więc wygrywa najkrótszy kod.
  • Końcowe spacje w każdej / dowolnej linii są prawidłowe
  • Pojedynczy nowy wiersz po ostatnim wierszu jest dozwolony (ale nie więcej)

Czy może być format wyjściowy ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]?
Luis Mendo

Przepraszam, jak wspomniałem, jestem wybredny;) dane wyjściowe muszą być w osobnych wierszach, a nie w formacie listy
Brian Gradin

Tak, to ma sens. Chciałem tylko sprawdzić, czy mogę usunąć jeden bajt z mojej odpowiedzi CJam ( N*do p) :-)
Luis Mendo,

2
Solidne pierwsze wyzwanie!
xnor

1
Tyle wbudowanych!
Dan

Odpowiedzi:


23

Galaretka , 5 bajtów

ṢŒ!QY

Wypróbuj online!

Wyjaśnienie

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

26
I ... mamy 100000 postów! Gratulacje!
ETHprodukcje

1
@ETHproductions Heh! Dzięki! :-)
Luis Mendo

1
Gratulacje również z mojej strony :) @ETHproductions jak doszedłeś do tego wyniku? Jestem tylko ciekawy ...
geisterfurz007 Zatrzymaj ten chaos

5
@ geisterfurz007 Kliknij link „udostępnij” u dołu wpisu. Ma identyfikator posta w adresie URL.
Martin Ender

1
Och, więc to jest 100 000 post PPCG! Myślałem, że Luis Mendo jest już pod tym numerem. Mój błąd. Dziękuję za wyjaśnienie!
geisterfurz007 Zatrzymaj ten chaos

12

05AB1E ,  4  3 bajty

Zaktualizowano, ponieważ aktualizacja œzłamała starą wersję,
która również zapisała bajt, jak sugeruje Magic Octopus Urn .

œê»

Wypróbuj online!

Wyjaśnienie

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

œê»jest w porządku w przypadku braku dziedzictwa.
Magic Octopus Urn

@MagicOctopusUrn: To jest faktycznie wymagane dla obu wersji, ponieważ œteraz zwraca listę ciągów w obu.
Emigna


10

Python 3.5, 79 bajtów

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

Funkcja, która przyjmuje dane wejściowe jako listę znaków i dane wyjściowe podczas drukowania.

Rekurencyjnie dokonuje każdej wyraźnej permutacji, usuwając każdy możliwy następny znak alfabetycznie z pozostałych odrębnych znaków i dołączając go do tworzonego wyniku w. Następnie cofamy się z usuniętą postacią. Po opróżnieniu wejścia drukujemy w.


Weź listę znaków, a nie ciąg znaków.
xnor


8

Pyth - 5 bajtów

jS{.p

Wypróbuj online tutaj .

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

Czy Snaprawdę jest potrzebny?
Luis Mendo,

@LuisMendo Jest potrzebny, jeśli dane wejściowe nie są jeszcze posortowane.
isaacg

1
@isaacg Thanks! Właśnie zdałem sobie sprawę, że potrzebuję tego również w mojej odpowiedzi na
żelki

@LuisMendo whoops.
Maltysen

6

Haskell, 46 bajtów

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

2 bajty zapisane dzięki nim


1
Nie potrzebujesz nazwy dla funkcji, więc możesz upuścić f=.
nimi

5

J, 19 bajtów

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

Przypadek testowy

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

Wyjaśnienie

To jest 4 pociąg:

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

Gruntownie:

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

Myślę, że [:~.i.@!@#A./:~powinienem zaoszczędzić kilka bajtów
mil

4

JavaScript (Firefox 30+), 129 124 bajtów

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]

Nieźle jak na język bez wbudowanych permutacji ...


Przekształciłem to do działania na ciągach; pomimo tego, że zajęłem 23 bajty tylko w celu posortowania znaków w kolejności, nadal wykonałem zadanie w 120 bajtach.
Neil,

3

Python 3.5, 81 bajtów:

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

Naprawdę ... 81 bajtów, gdy następna najdłuższa odpowiedź to 48 bajtów ... westchnienie . Cóż, spróbuję tego golfa bardziej, jak potrafię, ale wskazówki dotyczące gry w golfa są nadal bardzo mile widziane.

Oto też najkrótsze rozwiązanie, jakie udało mi się uzyskać w Pythonie 2 o wielkości 86 bajtów :

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

Najwyraźniej w Pythonie 2 [*...]zwraca a Syntax Error, a skoro permutationszwraca itertools.permutations object at 0x..., kolejnym najkrótszym sposobem (jaki znam) wyodrębnienia unikatowych permutacji jest użycie {''.join(i)for i in permutations(f)}gdzie fjest łańcuchem wejściowym.

Na koniec zauważ, że są to obie funkcje lambda i dlatego muszą być wywoływane w formacie print(<Function Name>(<Input String>)).


3

Mathematica, 34 23 bajtów

Print@@@Permutations@#&

Dane wejściowe muszą być listą znaków.

Wyjaśnienie

Permutations@

Znajdź wszystkie permutacje danych wejściowych, posortowane i wolne od duplikatów.

Print@@@

Wydrukuj je jeden po drugim.


3

Brachylog , 9 bajtów

:pfdo~@nw

Wypróbuj online!

Wyjaśnienie

: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 bajtów

Ciąg jako dane wejściowe

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

Lista znaków jako dane wejściowe

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

Rozszerzony

*\              # 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
za każdym razem, gdy widzę kod perla 6, zastanawiam się, dlaczego go jeszcze nie zainstalowałem
Gabriel Benamy,

@GabrielBenamy Istnieje irc bot, który uruchamia kod Perl 6 na #perl6kanale freenode.net .
Brad Gilbert b2gills,

Możesz zrobić ».sayzamiast.map: *.put
Jo King

1
@JoKing Technicznie ».saydozwolone jest wykonywanie ich w dowolnej kolejności, a kiedyś zostało to celowo wykonane poza kolejnością.
Brad Gilbert b2gills


2

Python 3, 77 85 bajtów

Teraz sortuje!

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

1
Aby to skrócić, możesz zrobić from itertools import*inaczej import itertools as i. Możesz zapisać bajt, zastępując i.permutationsgo permutations.
0WJYxW9FMN

Użycie {*...}zamiast set(...)oszczędza dwa dodatkowe bajty.
movatica

2

PowerShell v3 +, 171 bajtów

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

Program PowerShell v3 wprowadził -Uniqueflagę w Sort-Objectcmdletu, więc jest o kilka bajtów krótszy niż wersja v2 poniżej, ponieważ nie musimy tego robić Selectnajpierw.

wersja v2, 178 bajtów:

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 nie ma żadnych wbudowanych permutacji, więc pożyczyłem swój kod od znajomych Factor i nieco go poprawiłem, aby używał go tutaj.

To w zasadzie trzy części, które rozwinę poniżej.

param([char[]]$x)$a,$b=$x;$a=,$aPobiera dane wejściowe $x, rzuca je jako chartablicę, usuwa pierwszą literę do, $aa resztę do $b, a następnie przekształca $ajako tablicę z operatorem przecinkowym.

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Pętle przechodzą przez pozostałe litery ( $b), każda iteracja bierze kolejną literę i przechowuje ją do $zpozostałych $b, a następnie pozostawia w , a następnie konkatenuje tablicę $az wynikiem wysłania $aprzez własną pętlę - każdy element $a(tymczasowo przechowywany w $c) jest zapętlany jest własny .length, a następnie $zjest wstawiany w każdą pozycję, w tym poprzedzanie i dołączanie za pomocą $z$ci $c$z. Na przykład dla $c = '12'i $z = '3'spowoduje '132','312','123'to powrót do konkatenacji $a.

Ostatnia część $a|?{$_.length-eq$x.count}|select -u|sortbierze każdy element $ai używa Where-Objectklauzuli, aby odfiltrować tylko te, które mają taką samą długość jak łańcuch wejściowy, a następnie selects tylko -udrobne elementy, a na końcu sortte alfabetycznie. Wynikowe ciągi znaków są pozostawione w potoku, a dane wyjściowe za pośrednictwem niejawnego mają Write-Outputmiejsce po zakończeniu programu.

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

Jeśli chcesz przejść do wersji 3.0, możesz zmienić |select -u|sortna |sort -u. Z pewnością 2.0 tego nie ma.
Matt

@Matt Dzięki - masz rację. Zostało to wprowadzone w wersji 3.
AdmBorkBork

2

JavaScript (ES6), 119 bajtów

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`

Gdzie \nreprezentuje dosłowny znak nowej linii. Port odpowiedzi @ ETHproduction na użycie ciągów zamiast tablic. Odwrócenie wyniku lub przeniesienie końcowego znaku nowej linii na początek oszczędza 3 bajty.


1

R, 113 bajtów

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

Odczytuje dane wejściowe ze standardowego wejścia. permutePakiet zakłada być zainstalowany w celu wywołania allPermsfunkcji.

Dodam wyjaśnienie, gdy wracam do domu z pracy.


1

Java 302 300 bajtów

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

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wejście: test
Wyjście:

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

1
Permutacje mają być posortowane alfabetycznie
Ikaros

@Ikaros Dzięki, powinno zostać naprawione teraz.
Kevin Cruijssen

1

Rakieta 82 bajtów

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

Nie golfowany:

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

Testowanie:

(f "buzz")

Ouput:

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


0

Rubinowy, 51 bajtów

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

jak możemy to uruchomić?
بارپابابا

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

To nie działa. Musisz posortować dane wyjściowe i nie można odwoływać się do nich sbez wcześniejszej definicji.
Lee W

0

Właściwie 8 bajtów

Zapraszamy do gry w golfa! Wypróbuj 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 bajtów

7 bajtów kodu, +1 dla -nflagi.

SSUQPMa

Bierze ciąg jako argument wiersza polecenia. Wypróbuj online!

Skaner Pip dzieli serie wielkich liter na dwuliterowe fragmenty. Tak więc ten kod to SS UQ PM a--ie SortString(UniQue(PerMutations(a))), z aargumentem wiersza poleceń. Te -nflagi zapewnia listy wyników jest oddzielone znakiem nowej linii. To wszystko.


0

K (oK) , 14 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Użyj wbudowanej funkcji permutacji prm, aby wygenerować permutacje długości danych wejściowych, zastosuj te permutacje na danych wejściowych, posortuj alfabetycznie, a następnie przyjmuj różne wartości.

?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 bajtów

á â n

Spróbuj


ûjest metodą centralnego pas; Myślę, że miałeś na myśli n;)
Kudłaty

@Shaggy Właśnie sortwstawiłem pasek wyszukiwania w twoim tłumaczu i kliknąłem pierwszy znaleziony. Ale áwydaje się, że daje już każdą permutację w kolejności alfabetycznej
Embodiment of Ignorance

Ups, to literówka; powinno być ü. Naprawię to jutro. Permutacje „buzz” są sortowane, ponieważ samo słowo to - spróbuj na przykład z „zzub”.
Kudłaty

@Shaggy, widzę, zaktualizowana odpowiedź z n(łatwiej pisać)
Embodiment of Ignorance


0

Małż , 9 bajtów

p_D`Sq@~Q

Wyjaśnienie

          - Implicit Q = first input
p         - Print...
 _        - Sorted ascending value (alphabetical order)
  D       - Distinct from...
   `Sq    - Joined (map(q=>q.join(""))
      @~Q - Permutations of Q
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.