すべてのアナグラムを見つけてください!


16

とタグ付けされた17の質問があるにもかかわらず、この質問はまだありません。

あなたのタスク

文字列を受け取ったときに、可能なすべてのアナグラムを出力するプログラムまたは関数を作成する必要があります。この質問の目的上、アナグラムは元の文字列と同じ文字を含む文字列ですが、元の文字列の正確なコピーではありません。アナグラムは、実際の単語である必要はありません。

入力

任意の標準入力方法で、文字列(長さ> 0)を受け入れることができます。ASCII文字を含めることができます。

出力

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

その他の規則

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

得点

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


通常の「プログラムまたは機能」標準を順守できますか?
ジョナサンアラン

@JonathanAllan明示的に言及されていない場合は、プログラムまたは関数を送信できます。私は通常、問題に暗黙のうちにその暗黙の質問を残しました
デジタルトラウマ

はい、もちろんプログラムまたは関数のいずれかが正常に動作します。
グリフォン-モニカの復活


@gryphonどのように物事を編集していますか
フォクシー

回答:


9

05AB1E、3 バイト

œÙ¦

スタックに、アナグラムのリストを最上部に(そして唯一のアイテムとして)残す関数。完全なプログラムとして、そのリストの表現を印刷します。

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

どうやって?

    - push input
œ   - pop and push a list of all permutations (input appears at the head)
 Ù  - pop and push a list of unique items (sorted by first appearance)
  ¦ - pop and push a dequeued list (removes the occurrence of the input)
    - As a full program: implicit print of the top of the stack

05AB1Eが極端に短いと推測すべきでした。
グリフォン-モニカの復活


3

MATL、7バイト

tY@1&X~

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

説明

t     % Implicitly input a string, say of length n. Duplicate
Y@    % All permutations. May contain duplicates. Gives a 2D char array of 
      % size n!×n with each permutation in a row
1&X~  % Set symmetric difference, row-wise. Automatically removes duplicates.
      % This takes the n!×n char array and the input string (1×n char array)
      % and produces an m×n char array containing the rows that are present 
      % in exactly one of the two arrays
      % Implicitly display

3

pyth8 4

-{.p

オンラインテスト

  .pQ     # all permutations of the (implicit) input string
 {        # de-duplicate
-    Q    # subtract (implicit) input

素晴らしいゴルフの仕事。非常に印象的な05AB1Eの回答をおめでとうございます。
グリフォン-モニカの復活

1
申し訳ありませんが、入力に同じ文字が2回ある場合、同じ文字列を2回出力します。それを修正してください。
グリフォン-モニカの復活

それを修正してくれてありがとう。ただし、バイトカウントが増加するのは残念です。
グリフォン-モニカの復活

同じ答えを思いつきましたが、重複排除を忘れていました。偉大な心は同じように考える?
竜巻547

3

Japt、6バイト

á â kU

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

説明

 á â kU
Uá â kU   // Ungolfed
          // Implicit: U = input string
Uá        // Take all permutations of U.
   â      // Remove duplicates.
     kU   // Remove U itself from the result.
          // Implicit: output resulting array, separated by commas

おめでとうございます。+1
グリフォン-復活モニカ

1
@Gryphonそれほど速くはないが、これが05AB1Eで3バイトでなければショックを受けるだろう
...-ETHproductions

今のところ意味がありません。まだ受け入れられているとマークしているわけではありません。
グリフォン-モニカの復活

@DennisがJellyでこれを行うと、おそらく2バイトのようになります。単純にゴルフデニスを上回るわけではありません。
グリフォン-モニカの復活

1
3バイトの予測は良好でしたが、2がありますか?!
ジョナサンアラン

3

Haskell、48 40バイト

import Data.List
a=tail.nub.permutations

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

Leoのtailヒントのおかげで8バイト節約されました。


2
元の文字列は常に順列のリストの最初に来るため、tail代わりにを使用できますdelete x。これにより、ポイントのないソリューションに切り替えてから、名前のない関数に切り替えて、大量のバイトを保存できます!
レオ

@レオ素晴らしい、ありがとう!
クリスチャンルパスク

2

CJam、8バイト

l_e!\a-p

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

説明

l    e# Read string from input
_    e# Duplicate
e!   e# Unique permutations. Gives a list of strings
\    e# Swap
a    e# Wrap in a singleton array
-    e# Set difference. This removes the input string
p    e# Pretty print the list

@ジョナサンアランありがとう、修正
ルイスメンドー

@Gryphonまあ、ジョナサンの非常に適切な修正後の7 ;-)
ルイスメンドー

私は今その質問に答えました。
グリフォン-モニカの復活

うーん、TIOはまだ元の文字列を出力していますか?
グリフォン-モニカの復活

@Gryphon申し訳ありませんが、現在動作しているはずです。私は明らかにこれに疲れすぎています。寝る:-P
ルイスメンドー

2

Mathematica、47バイト

Drop[StringJoin/@Permutations[Characters@#],1]&

私はこれらのいずれかを待っていましたが、勝つことはないと確信していました。ちょっとだけに建てられたものがない驚かせた。
グリフォン-復活モニカ

StringJoin/@Rest@Permutations@Characters@#&43バイトです。
jcai

2

ゼリー、4 バイト

Œ!QḊ

文字のリストを受け取り、文字のリストのリストを返すモナドリンク-入力と等しくないすべての個別のアナグラム。

オンラインでお試しください!(フッターは、リストを改行で結合して印刷するプログラムを形成し、それ以外の場合は破壊された表現を回避します)。

どうやって?

Œ!QḊ - Link: list of characters     e.g. "text"
Œ!   - all permutations of the list      ["text","tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","extt","ettx","etxt","xtet","xtte","xett","xett","xtte","xtet","ttex","ttxe","tetx","text","txte","txet"]
  Q  - de-duplicate                      ["text","tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","xtet","xtte","xett"]
   Ḋ - dequeue (the first one = input)          ["tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","xtet","xtte","xett"]

印象的。私はゼリーではないので、説明がありますか?
グリフォン-モニカの復活

はい、もちろん!
ジョナサンアラン

私は、ヘッダおよび削除に関するテキストで「(?4)」を持っていた私はなぜそれゆえ、とっくの昔にそれを脱いY機能が許可された場合...私はあなただけかかわらの質問に私の編集を逆に参照:/
ジョナサン・アラン

2

Python 3、85 76 63バイト

関数として、文字列を文字のリストとして返します(許可されていることを教えてくれた@ pizzapants184に感謝します)。

from itertools import*
lambda z:set(permutations(z))-{tuple(z)}

機能として:

from itertools import*
lambda z:map("".join,set(permutations(z))-{tuple(z)})

完全なプログラムとして85バイト:

from itertools import*
z=input()
print(*map("".join,set(permutations(z))-{tuple(z)}))

( 'a'、 'b'、 'c')として文字列を出力できる場合は、少し減らすことができます(確かではありません)。


もしpythonだけがゴルフ言語だったら、ええ。
グリフォン-モニカの復活

1
( 'a'、 'b'、 'c')として出力すれば問題ありません。この基本的な答えは(基本的に)あります。
pizzapants184

2

Java 8、245 239 237バイト

import java.util.*;s->{Set l=new HashSet();p("",s,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,n),l));}

@OlivierGrégoireのおかげで-6バイト。

典型的な冗長なJava ..多くの<10バイトの回答が表示されますが、ここでは200バイト以上です。XD

説明:

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

import java.util.*;         // Required import for the Set and HashSet

s->{                        // Method (1) with String parameter and no return-type
  Set l=new HashSet();      //  Set to save all permutations in (without duplicates)
  p("",s);                  //  Determine all permutations, and save them in the Set
  l.remove(s);              //  Remove the input from the Set
  l.forEach(                //  Loop over the Set
    System.out::println);   //   And print all the items
}                           // End of method (1)

// This method will determine all permutations, and save them in the Set:
void p(String p,String s,Set l){
  int n=s.length(),         //  Length of the first input String
      i=0;                  //  And a temp index-integer
  if(n<1)                   //  If the length is 0:
    l.add(p);               //   Add the permutation input-String to the Set
  else                      //  Else:
    for(;i<n;               //   Loop over the first input-String
      p(                    //    And do a recursive-call with:
        p+s.charAt(i),      //     Permutation + char
        s.substring(0,i)+s.substring(++i,n),l)
                            //     Everything except this char
      );                    //   End of loop
}                           // End of method (2)

l.forEach(System.out::println);印刷ループの代わりに使用します。また、Setクラスを囲むクラスなしでクラスレベルで定義されるのは好きではありません。ラムダはどこでもメソッドを誰も知らないように定義されています。これは私には多すぎます。インポートが残りから分離されていることは理解できますが、自己完結型のものは何もありません。他のものよりもスニペットのコレクションのように見えます。申し訳ありませんが、PCGで初めて-1を与えます:(
オリビエグレゴワール

@OlivierGrégoireまず、のヒントをありがとうforEach。クラスレベルSetについては、代替手段は何ですか?main-methodを含むクラス全体を投稿しますか?メインメソッドを除くクラス全体を投稿しますが、クラス自体、インターフェイス、および関数名を含めますか?
ケビンCruijssen

私は完全なクラスを書きます。それは私が見つけることができる最小の自己完結型です。を追加する必要はありませんpublic static void main。「入力方法は...」と言うだけです。問題は、現在の回答がすべての「自己完結型」ルールに違反していることです。私は規則を拘束することに反対しているのではなく、違反していますか?ええ、私は気に:(
オリヴィエグレゴワール

1
別のアイデア:Setをパラメーターとして渡しますか?ヘルパー関数、私はそれを完全に理解することができますが、それは私を動かすすべての外側のセットを定義しています。
オリビエグレゴワール

@OlivierGrégoireOK、2番目の提案に行きました。実際、さらに理にかなっているので、これから使用します。正直なフィードバックをありがとう。
ケビンCruijssen

1

Perl 6の 39の  38バイト

*.comb.permutations».join.unique[1..*]

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

*.comb.permutations».join.unique.skip

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

拡大

*               # WhateverCode lambda (this is the parameter)
.comb           # split into graphemes
.permutations\  # get all of the permutations
».join          # join each of them with a hyper method call
.unique         # make sure they are unique
.skip           # start after the first value (the input)

1

C ++、142バイト

#include<algorithm>
void p(std::string s){auto b=s;sort(begin(s),end(s));do if(s!=b)puts(s.data());while(next_permutation(begin(s),end(s)));}

食べない

#include <algorithm>

void p(std::string s)
{
    auto b = s;                    // use auto to avoid std::string
    sort(begin(s), end(s));        // start at first permutation
    do
      if (s != b)                  // only print permutation different than given string
        puts(s.data());
    while (next_permutation(begin(s), end(s))); // move to next permutation
}

1

K(oK)、13バイト

解決:

1_?x@prm@!#x:

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

説明:

評価は右から左に実行されます。

1_?x@prm@!#x: / the solution
           x: / store input in variable x
          #   / count length of x, #"abc" => 3
         !    / range, !3 => 0 1 2
     prm@     / apply (@) function permutations (prm) to range
   x@         / apply (@) these pumuted indixes back to original input
  ?           / return distinct values
1_            / drop the first one (ie the original input)


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