すべてのアナグラム、およびサブアナグラムも見つけてください!


13

この質問は頻繁にオフに基づいているこの質問が、追加の多くの困難を提起する必要があります。

あなたのタスク

文字列を受け取ったときに、可能なすべてのアナグラムを出力するプログラムまたは関数を作成する必要があります。この質問のために、アナグラムは元の文字列と同じ文字を含む文字列ですが、元の文字列ではありません。サブアナグラムは、入力された文字列のサブストリングのアナグラムです。アナグラムとサブアナグラムは、実際の単語である必要はありません。

入力

標準の入力方法で、文字列を受け入れることができます。これは、長さが0を超える場合があります。ASCII文字を含めることができます。

出力

入力された文字列の可能なアナグラムとサブアナグラムのすべてを標準的な方法で出力できます。同じ文字列を2回出力したり、入力と同じ文字列を出力したりしないでください。

その他の規則

標準の抜け穴は許可されていません

得点

これは、最小バイトが勝ちます。


空の文字列は可能なアナグラムですか?
デジタル外傷

元の文字列/サストリングの出力は許可されていますか?
電卓

@CalculatorFeline「同じ文字列を2回出力したり、入力と同じ文字列を出力したりしてはいけません。」
ジョナサンアラン

@DigitalTrauma、「文字列を受け入れることができます。これは、任意の標準入力メソッドにより、長さが0を超える場合があります」。(強調追加)
グリフォン

4
いくつかのテストケースが役立つだろう
氏Xcoder

回答:


8

05AB1E、7 バイト

Œ€œ˜Ù¹K

入力から文字列を受け取り、文字列のリストをスタックに残す関数。完全なプログラムとして、リストの表現が印刷されます。

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

どうやって?

        - push input
Œ       - all substrings
 €œ     - for €ach: all permutations
   ˜    - flatten
    Ù   - de-duplicate
     ¹  - push 1st input onto top of stack
      K - pop a,b; push a without any b's (remove the copy of the input from the list)
        - as a full program: implicit print of the top of the stack

そして...あなたはもっと短いものを管理しました。
グリフォン

これは同じアルゴリズムで、バイト数が少ないだけです。
ジョナサンアラン

はい、言語の変更はすべてでしたが、それでも印象的です。
グリフォン

@ ais523両方とも間違った方法で入手したようです!
ジョナサンアラン

@ ais523修正されたと思います。
ジョナサンアラン

9

Brachylog(2)、7バイト

{sp}ᶠdb

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

説明

{sp}ᶠdb
{  }ᶠ    Find all
  p        permutations of
 s         a substring of {the input}
     d   Remove duplicates (leaving the list otherwise in the same order)
      b  Remove the first (the input itself)

(2)はどういう意味ですか?
グリフォン

@Gryphon(afaik)branchylogには2つのバージョンがあり、これはV2を使用しています。
ジョンハミルトン

1
わかりました、それがバージョン番号であるか、別の、おそらく違法な方法を使用して考えられるバイト数であるかどうかはわかりませんでした。
グリフォン

1
これは私が今尋ねられた二度目です。私はそれをとして書き始めなければならないと思います(v2)

7

ゼリー、9 バイト

ẆŒ!€;/QḟW

リストを受け入れ、入力自体を除くすべての異なるサブアナグラムのリストを返すモナドリンク。

オンラインでお試しください!(フッターは、改行と結合することにより、結果のリストをきれいに印刷します。)

どうやって?

ẆŒ!€;/QḟW - Link: list of characters, s
Ẇ         - all contiguous sublists of s
 Œ!€      - all permutations for €ach sublist now a list of lists of lists)
     /    - reduce by:
    ;     -   concatenation (flattens the list by one level)
      Q   - de-duplicate (gets the unique entries)
        W - wrap s in a list (otherwise filtering will attempt to remove characters)
       ḟ  - filter discard from left if in right (remove the one equal to the input)


3

Japt、10バイト

à má c â Å

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

私は使用するようになりました àáâあまりに順に、1つの回答ですべて。なんという偶然なんでしょう...

説明

 à má c â Å
Uà má c â s1  // Ungolfed
              // Implicit: U = input string
Uà            // Take all combinations of characters in the input string.
   má         // Map each combination to all of its permutations.
      c       // Flatten into a single array.
        â     // Uniquify; remove all duplicates.
          s1  // Remove the first item (the input) from the resulting array.
              // Implicit: output resulting array, separated by commas

1
あなたもÅを管理しました。
グリフォン

1

Mathematica、60バイト

DeleteCases[""<>#&/@Permutations[c=Characters@#,Tr[1^c]],#]&

Permutations順列に使用する入力値の数を伝えるオプションの数値引数を取ります。入力の長さを指定すると、重複することなく入力のすべてのサブセットの順列が生成されます。入力を削除するだけです。


1

Java 8、313 312 306バイト

import java.util.*;s->{Set l=new HashSet();for(int z=s.length(),i=0,j;i<z;i++)for(j=i;j<z;p("",s.substring(i,j+++1),l));l.remove(s);l.forEach(System.out::println);}void p(String p,String s,Set l){int n=s.length(),i=0;if(n<1)l.add(p);else for(;i<n;p(p+s.charAt(i),s.substring(0,i)+s.substring(i+++1,n),l));}

ここ私の答えの修正版、ここp("",s,l);置き換えられていますfor(int z=s.length(),i=0,j;i<z;i++)for(j=i;j<z;p("",s.substring(i,j+++1),l));

リンクされた回答の@OlivierGrégoireに感謝します。

この部分の説明:

ここで試してみてください。

for(int l=s.length(),i=0,j;i<l;i++)
                               // Loop (1) from 0 to the length of the String (exclusive)
  for(j=i+1;j<=l;              //  Loop (2) from 1 to the length of the String (exclusive)
    p("",                      //   Call the permutation-method,
    s.substring(i,j+++1),l));  //   with a substring from `i` to `j` (inclusive)
                               //  End of loop (2) (implicit / single-line body)
                               // End of loop (1) (implicit / single-line body)

0

Perl 6、75バイト

{unique(flat $_,.comb.combinations.skip».permutations.map(*».join)).skip}

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

拡張:

{                    # bare block lambda with implicit parameter 「$_」

  unique(            # return each (sub)anagram once

    flat             # unstructure the following (List of Lists into flat List)
      $_,            # the input (so we can skip it at the end)

      .comb          # split the input into graphemes
      .combinations  # get all the combinations
      .skip\         # skip the first empty combination
      ».permutations # get all the permutations of each combination
      .map(*».join)  # join the inner permutations

  ).skip             # skip the first value (the input)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.