文字列をアルファベット順に並べ替えます


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"]
ルイスメンドー

申し訳ありませんが、私が言ったように、私は細心です;)出力はリスト形式ではなく別々の行になければなりません
ブライアン・グラディン

はい、それは理にかなっています。私はちょうど私が私のCJamの答え(から1つのバイトを取り除くことができるかどうかを確認したかったN*p):-)
ルイスMendo

2
しっかりした最初の挑戦!
XNOR

1
非常に多くのビルトイン!
ダン

回答:


23

ゼリー、5バイト

ṢŒ!QY

オンラインでお試しください!

説明

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

26
そして... 10万件の投稿があります!おめでとうございます!
ETHproductions

1
@ETHproductionsへっ!ありがとう!:-)
ルイスメンドー

1
私の側からもおめでとうございます:) @ETHproductionsどのようにしてその結果に到達しましたか?私はちょうど好奇心が強いです...
geisterfurz007この混乱を停止します

5
@ geisterfurz007投稿の下部にある[共有]リンクをクリックします。URLに投稿のIDがあります。
マーティンエンダー

1
ああ、ppcgの100000番目の投稿です!ルイスメンドーはすでにその数に達していると思いました。私の悪い。説明してくれてありがとう!
geisterfurz007この混乱を止めてください

12

05AB1E 4  3バイト

更新されたため、Magic Octopus Urn によって提案されたバイトを保存するœ古いバージョンが壊れたため、更新
されました。

œê»

オンラインでお試しください!

説明

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

œê»非レガシーには問題ありません。
マジックタコUr

@MagicOctopusUrn:両方のバージョンœで文字列のリストを返すようになったため、実際には両方のバージョンで必要です。
エミグナ


10

Python 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


8

Pyth-5バイト

jS{.p

こちらからオンラインでお試しください

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

されてS本当に必要?
ルイスメンドー

@LuisMendo入力がまだソートされていない場合に必要です。
isaacg

1
@isaacgありがとう!私はちょうど実現Iの必要性私のゼリーの答えでもその
ルイスMendo

@LuisMendoおっと。
マルティセン

6

Haskell、46バイト

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

nimiのおかげで2バイト節約


1
関数の名前は不要なので、をドロップできますf=
nimi

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 +)、129 124バイト

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

Python 3.5、81バイト:

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

本当に...次に長い回答が48バイトのときは81バイト... ため息です。まあ、私はこのゴルフをできる限り試しますが、ゴルフのコツは今でも大歓迎です。

また、Python 2で86バイトで取得できる最短のソリューションを次に示します

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

見かけ上のPython 2に、[*...]戻りSyntax Error、そしてのでpermutations戻りitertools.permutations object at 0x...、抽出の次の最短の方法(私が知っている)固有の順列を使用している{''.join(i)for i in permutations(f)}場合f、入力文字列があります。

最後に、これらは両方ともラムダ関数であるため、formatで呼び出す必要があることに注意してくださいprint(<Function Name>(<Input String>))


3

Mathematica 34 23バイト

Print@@@Permutations@#&

入力は文字のリストでなければなりません。

説明

Permutations@

入力のすべての順列を検索し、ソートされ、重複がありません。

Print@@@

それらを1つずつ印刷します。



3

Perl 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コード
ガブリエルBenamy

@GabrielBenamy freenode.net #perl6チャネルでPerl 6コードを実行するircボットがあります。
ブラッドギルバートb2gills

».say代わりに行うことができます.map: *.put
ジョーキング

1
@JoKing Technically ».sayは、それらを任意の順序で実行することを許可されており、かつては意図的に順序をずらして実行されていました。
ブラッドギルバートb2gills


2

Python 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ではコマンドレットに-Uniqueフラグが導入されたSort-Objectため、Select最初に行う必要がないため、以下の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からコードを借用し、ここで使用するために少し調整しました。

これは基本的に3つの部分であり、以下で詳しく説明します。

param([char[]]$x)$a,$b=$x;$a=,$a入力を受け取り$x、-array としてキャスト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ます- $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-uniqueの項目のみを最後にsortアルファベット順に並べます。結果の文字列はすべてパイプラインに残り、暗黙的な出力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にはそれがないことを確認してください。
マット

@マットありがとう-あなたは正しい。これはv3で導入されました。
AdmBorkBork

2

JavaScript(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`

where \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

Java 302 300バイト

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ありがとう、今修正する必要があります。
ケビン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

Ruby、51バイト

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

どのように実行できますか?
بارپابابا

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

それは機能しません。出力をソートする必要があり、s事前の定義なしでは参照できません。
リー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、5 -Rバイト

á â n

それを試してみてください


ûcenter pasメソッドです。あなたが意味したと思うn;)
シャギー

@Shaggy sortインタプリタの検索バーに入れて、最初に見つけたものをクリックしただけです。しかしá、各順列はすでにアルファベット順に与えられているようです
無知の具現化

おっと、それはタイプミスです。する必要がありますü。明日修正します。「バズ」の順列は、単語自体がソートされているためにソートされます-たとえば、代わりに「zzub」で試してください。
シャギー

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