알파벳 순으로 문자열을 퍼 뮤트


27

태스크

입력 문자열 (또는 문자 배열)이 주어진 경우 해당 문자열에서 문자의 가능한 모든 순열을 출력하는 프로그램을 작성하는 것이 목표입니다. 출력에 까다로워서 알파벳순으로 정렬해야합니다.

예:

입력: buzz

산출:

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

규칙

  • 이것은 이므로 가장 짧은 코드가 승리합니다.
  • 각 라인의 후행 공백은 괜찮습니다
  • 마지막 줄 다음에 하나의 줄 바꿈이 허용되지만 더 이상은 허용되지 않습니다

출력 형식은 ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]?
Luis Mendo

내가 언급했듯이, 죄송합니다. 나는 출력 형식이 목록 형식이 아닌 별도의 줄에 있어야합니다.
Brian Gradin

그렇습니다. 나는 (내 CJam 응답에서 한 바이트를 제거 할 수 있다면 난 그냥보고 싶었 N*p:-))
루이스 Mendo

2
확실한 첫 도전!
xnor

1
너무 많은 내장!
Dan

답변:


23

젤리 , 5 바이트

ṢŒ!QY

온라인으로 사용해보십시오!

설명

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

26
그리고 ... 우린 100000 개의 게시물이 있습니다! 축하합니다!
ETHproductions

1
트윗 담아 가기 감사! :-)
Luis Mendo 2016

1
내 측면에서도 축하드립니다 :) @ETHproductions 어떻게 그 결과를 얻었습니까? 난 그냥 궁금해 ...
geisterfurz007이 혼란을 중지

5
@ geisterfurz007 게시물 하단의 "공유"링크를 클릭하십시오. URL에 게시물의 ID가 있습니다.
Martin Ender

1
ppcg의 100000 번째 포스트입니다! 나는 Luis Mendo가 이미 그 숫자에 있다고 생각했다. 내 잘못이야. 설명 주셔서 감사합니다!
geisterfurz007이 혼란을 막으십시오

12

05AB1E ,  4  3 바이트

Magic Octopus Urn에서 제안한대로 바이트를 저장 한 œ이전 버전 을 중단 한 이후 업데이트되었습니다 .

œê»

온라인으로 사용해보십시오!

설명

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

œê»비 레거시에는 좋습니다.
Magic Octopus Urn

@MagicOctopusUrn : 두 버전 모두 œ에 문자열 목록을 반환 하므로 실제로 두 버전 모두에 필요 합니다.
Emigna


10

파이썬 3.5, 79 바이트

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

문자 목록으로 입력하고 인쇄하여 출력하는 기능입니다.

나머지 가능한 다른 문자에서 알파벳순으로 가능한 다음 문자를 모두 가져 와서 진행중인 출력에 추가하여 모든 고유 한 순열을 재귀 적으로 만듭니다 w. 그런 다음이 문자를 제거한 상태에서 되풀이합니다. 입력이 비워지면를 인쇄 w합니다.


문자열이 아닌 문자 목록을 가져옵니다.
xnor



6

하스켈, 46 바이트

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

nimi 덕분에 2 바이트 절약


1
함수 이름은 필요하지 않으므로을 삭제할 수 있습니다 f=.
니미

5

J, 19 바이트

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

테스트 사례

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

설명

이것은 4 열입니다.

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

원래:

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

내가 생각하는 [:~.i.@!@#A./:~당신에게 몇 바이트 저장해야합니다
마일

4

JavaScript (Firefox 30+), 129124 바이트

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]

순열이없는 언어에는 그렇게 나쁘지 않습니다 ...


나는 이것을 문자열에서 작동하도록 변환했다. 문자를 순서대로 정렬하기 위해 23 바이트를 사용하더라도 120 바이트로 작업을 완료했습니다.

3

파이썬 3.5, 81 바이트 :

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

다음으로 가장 긴 대답이 48 바이트 인 경우 ... 81 바이트 ... sigh . 글쎄, 나는이 골프를 가능한 한 많이 시도 할 것이지만, 골프 팁은 여전히 ​​대단히 감사합니다.

또한 다음은 Python 2에서 86 바이트로 얻을 수있는 가장 짧은 솔루션입니다 .

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

분명히 파이썬 2에서 [*...]다시 발생 Syntax Error하고 있기 때문에 permutations반환 itertools.permutations object at 0x..., 추출의 (내가 아는) 다음 짧은 방법 고유의 사용 순열은 {''.join(i)for i in permutations(f)}어디에 f입력 문자열입니다.

마지막으로 이들은 람다 함수이므로 형식으로 호출해야합니다 print(<Function Name>(<Input String>)).


3

매스 매 티카, 34 23 바이트

Print@@@Permutations@#&

입력은 문자 목록이어야합니다.

설명

Permutations@

입력의 모든 순열을 정렬하고 무료로 찾습니다.

Print@@@

하나씩 인쇄하십시오.



3

펄 6 ,  49  44 바이트

입력으로 문자열

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

입력 된 문자 목록

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

넓히는

*\              # 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
perl 6 코드를 볼 때마다 아직 설치하지 않은 이유가 궁금합니다.
Gabriel Benamy 1

@GabrielBenamy freenode.net #perl6채널 에서 Perl 6 코드를 실행하는 irc 봇이 있습니다.
브래드 길버트 b2gills

당신이 할 수있는 ».say대신에.map: *.put
조 왕

1
@JoKing Technically ».say는 어떤 순서로든 수행 할 수 있으며 한 번에 의도적으로 순서가 잘못 되었습니다.
브래드 길버트 b2gills


2

파이썬 3, 77 85 바이트

이제 정렬합니다!

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

1
이를 줄이려면와 from itertools import*달리 할 수 import itertools as i있습니다. 당신은 대체하여 바이트를 저장할 수있을 것 i.permutations으로 permutations.
0WJYxW9FMN

{*...}대신에를 사용 set(...)하면 2 바이트가 더 절약됩니다.
movatica

2

PowerShell v3 +, 171 바이트

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 -UniqueSort-Objectcmdlet 에 플래그를 도입 했으므로 Select먼저 v2 버전보다 필요하지 않기 때문에 아래 v2 버전보다 몇 바이트 짧습니다 .

v2 버전, 178 바이트 :

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에는 내장 순열이 없으므로 Prime Factors Buddies 에서 코드를 빌려 여기에서 사용할 수 있도록 약간 조정했습니다.

이것은 본질적으로 세 부분으로, 아래에서 확장하겠습니다.

param([char[]]$x)$a,$b=$x;$a=,$ainput을 가져 와서 배열로 $x캐스트 char하고 첫 번째 문자를으로 분리 $a하고 나머지는 $b을 스트리핑 한 다음 $a쉼표 연산자를 사용하여 배열로 캐스트합니다 .

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}나머지 문자 ( $b)를 반복하고, 각 반복은 다음 문자를 가져 와서 나머지 문자를 으로 $z남겨두고 나머지는에서 그대로 둔 $b다음 자체 루프를 통해 $a보낸 결과에 배열로 연결합니다 . (일시적으로에 저장된 ) $a각 항목 은 반복됩니다 자신의 다음과 붙이는와 함께 추가를 포함하여 모든 위치에 삽입 하고 . 예를 들어 for 및 을 사용하면으로 다시 연결됩니다 .$a$c.length$z$z$c$c$z$c = '12'$z = '3''132','312','123'$a

마지막 부분 $a|?{$_.length-eq$x.count}|select -u|sort의 각 요소를 가져 $a및 사용 Where-Object만 입력 문자열과 동일한 길이를 갖는 것과, 그때 걸러 절 select단지의 S -unique 항목, 마지막 sort알파벳 S는 이들. 결과 문자열은 모두 파이프 라인에 남아 있으며 암시 적 출력 Write-Output은 프로그램 완료시 발생합니다.

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

3.0을 갈 의향이 있다면 당신은 변경할 수 있습니다 |select -u|sort|sort -u. 꽤 2.0에는 없습니다.
Matt

@ 매트 감사합니다-당신이 맞습니다. 그것은 v3에서 소개되었습니다.
AdmBorkBork

2

자바 스크립트 (ES6), 119 바이트

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`

어디 \n리터럴 개행 문자를 나타냅니다. 배열 대신 문자열을 사용하는 @ETHproduction의 답변 포트. 출력을 되돌 리거나 후행 줄 바꿈을 처음으로 이동하면 3 바이트가 절약됩니다.


1

R, 113 바이트

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

stdin에서 입력을 읽습니다. permute패키지는 전화를하기 위해 설치되는 것으로 가정 allPerms기능.

직장에서 집으로 돌아갈 때 설명을 추가합니다.


1

자바 302300 바이트

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

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

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

입력 : 테스트
출력 :

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

1
순열은 알파벳순으로 정렬됩니다
Ikaros

@ Ikaros 감사합니다, 지금 수정해야합니다.
Kevin Cruijssen

1

라켓 82 바이트

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

언 골프 드 :

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

테스트 :

(f "buzz")

출력 :

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


0

루비, 51 바이트

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

어떻게 실행할 수 있습니까?
بارپابابا

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

작동하지 않습니다. 출력을 정렬해야하며 s사전 정의없이 참조 할 수 없습니다 .
Lee W

0

실제로 8 바이트

골프 제안을 환영합니다! 온라인으로 사용해보십시오!

;l@╨♂Σ╔i

언 골핑

     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

, 8 바이트

7 바이트 코드, -n플래그는 +1

SSUQPMa

문자열을 명령 줄 인수로 사용합니다. 온라인으로 사용해보십시오!

Pip의 스캐너는 대문자를 2 글자 덩어리로 나눕니다. 따라서이 코드는 SS UQ PM a--ie SortString(UniQue(PerMutations(a)))이며 a명령 줄 인수입니다. -n플래그 보장 결과리스트는 개행 구분된다. 그것이 전부입니다.


0

K (oK) , 14 바이트

해결책:

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

온라인으로 사용해보십시오!

설명:

내장 순열 함수, prm를 사용하여 입력 길이의 순열을 생성하고이 순열을 입력에 적용하고 알파벳순으로 정렬 한 다음 고유 한 값을 가져옵니다.

?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 바이트

á â n

시도 해봐


û센터 파스 방법입니다. 나는 당신이 의미한다고 생각합니다 n.)
Shaggy

@Shaggy 방금 sort통역사의 검색 창에 넣고 처음 찾은 것을 클릭했습니다. 그러나 á각 순열을 알파벳 순서로 이미 제공하는 것 같습니다
무지의 실시

죄송합니다. 오타입니다. 이어야합니다 ü. 내일 고칠 게요 "버즈"의 순열은 단어 자체이기 때문에 정렬됩니다. 예를 들어 대신 "zzub"로 시도하십시오.
Shaggy

@Shaggy, 알다시피, 답변이 업데이트되었습니다 n(쉽게 입력)
무지의 구현


0

조개 , 9 바이트

p_D`Sq@~Q

설명

          - Implicit Q = first input
p         - Print...
 _        - Sorted ascending value (alphabetical order)
  D       - Distinct from...
   `Sq    - Joined (map(q=>q.join(""))
      @~Q - Permutations of Q
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.