모든 아나그램을 찾아라!


16

태그가 지정된 17 개의 질문이 있음에도 불구하고 여전히이 질문이 없습니다.

당신의 작업

문자열을받을 때 가능한 모든 아나그램을 인쇄하는 프로그램이나 함수를 작성해야합니다. 이 질문의 목적 상, 아나그램은 원래 문자열과 동일한 문자를 포함하지만 원래 문자열의 정확한 사본이 아닌 문자열입니다. 아나그램은 실제 단어 일 필요는 없습니다.

입력

표준 입력 방법으로 길이가 0보다 큰 문자열을 사용할 수 있습니다. ASCII 문자를 포함 할 수 있습니다.

산출

입력 된 문자열의 가능한 모든 아나그램을 표준 방식으로 출력 할 수 있습니다. 동일한 문자열을 두 번 출력하거나 입력과 동일한 문자열을 출력해서는 안됩니다.

다른 규칙

표준 허점 은 허용되지 않습니다

채점

이것은 이며 최소 바이트 수입니다.


일반적인 "프로그램 또는 기능"표준을 준수 할 수 있습니까?
Jonathan Allan

@JonathanAllan 명시 적으로 언급하지 않으면 프로그램이나 기능을 제출할 수 있다고 생각합니다. 나는 일반적으로 문제없이 내 질문에 암시 적으로 남겼습니다
Digital Trauma

예, 물론 프로그램이나 기능이 제대로 작동합니다.
그리폰


@gryphon 어떻게 편집하고 있습니까
Foxy

답변:


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

pyth , 8 4

-{.p

온라인 테스트 .

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

훌륭한 골프 직업. 매우 인상적인 05AB1E 답변을 묶어 주셔서 감사합니다.
그리폰

1
입력에 동일한 문자가 두 번 있으면 동일한 문자열을 두 번 출력합니다. 고쳐주세요.
그리폰

고쳐 줘서 고마워 그래도 바이트 수를 늘리는 것이 너무 나쁩니다.
그리폰

나는 같은 대답을했지만 중복을 잊어 버렸습니다. 큰 마음은 다 비슷 하네?
Tornado547

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가 있습니까?!
Jonathan Allan

3

하스켈, 48 40 바이트

import Data.List
a=tail.nub.permutations

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

Leo의 tail팁 덕분에 8 바이트가 절약되었습니다 .


2
원래 문자열은 항상 순열 목록에서 맨 앞에 오므로 tail대신 대신 사용할 수 있습니다 delete x. 그러면 포인트없는 솔루션으로 전환 한 다음 명명되지 않은 함수로 전환하여 많은 바이트를 저장할 수 있습니다!
Leo

@ 레오 위대한, 감사합니다!
Cristian Lupascu

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

@JonathanAllan 감사합니다
Luis Mendo

@Gryphon 음, 조나단의 매우 적절한 수정 후 7 ;-)
Luis Mendo

나는 지금 그 질문에 대답했다.
그리폰

음, TIO가 여전히 원래 문자열을 출력하고 있습니까?
그리폰

@Gryphon 죄송합니다, 지금 작동합니다. 나는 이것에 대해 너무 피곤하다. 잠자리에 :-P
Luis Mendo

2

수학, 47 바이트

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

나는 이것들 중 하나를 기다리고 있었지만 승리하지 않을 것이라고 확신했다. 킨다는 내장 된 것이 아니라는 것에 놀랐습니다.
Gryphon

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"]

감동적인. 젤리가 아니기 때문에 설명이 있습니까?
그리폰

예, 물론입니다!
Jonathan Allan

내가 가진 이유는, 따라서, 전 연령대 떨어져 그것을 가지고 간 "(4?)"헤더 및 제거에 대한 텍스트의 Y기능이 허용된다면 ... 난 그냥 질문하지만 내 편집을 반전 참조 : /
조나단 앨런

2

파이썬 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')로 문자열 출력이 허용되는 경우 비트가 줄어들 수 있습니다 (확실하지 않습니다).


만약 파이썬 만이 골프 언어라면, 어.
그리폰

1
( 'a', 'b', 'c')로 출력하면 괜찮을 것입니다. 이 pyth 답변 은 (기본적으로) 수행합니다.
pizzapants184

2

Java 8, 245 239 237 bytes

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

-6 bytes thanks to @OlivierGrégoire.

Typical verbose Java.. I see a lot of <10 byte answers, and here I am with 200+ bytes.. XD

Explanation:

Try it here.

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)

Use l.forEach(System.out::println); instead of your printing loop. Also, I don't like Set being defined at the class level without its enclosing class, a lambda defined no one knows where and a method. This just too much for me. I can understand the imports being separated from the rest, but there is nothing self-contained there, it looks more like a collection of snippets than anything else. I'm sorry, but for the first time in PCG, I give -1 :(
Olivier Grégoire

@OlivierGrégoire First of all thanks for the tip for the forEach. As for the class-level Set, what is the alternative? Post the entire class including main-method? Post the entire class excluding the main-method, but including the class itself, interface and function name?
Kevin Cruijssen

I'd write a full class. That's the smallest self-contained I can find. No need to add the public static void main, just say "the entry method is...". The thing is that your answer as it currently is breaks all the "self-contained" rules. I'm not against binding the rules, but breaking? Yeah, I mind :(
Olivier Grégoire

1
또 다른 아이디어 : Set as 매개 변수를 전달 하시겠습니까? 도우미 기능, 나는 그것을 완전히 이해할 수 있지만, 내가 진드기를 일으키는 모든 것 이외의 Set을 정의하고 있습니다.
Olivier Grégoire 2016 년

@ OlivierGrégoire Ok, 두 번째 제안을 했어요. 실제로 더 의미가 있으므로 앞으로부터 사용하겠습니다. 정직한 의견을 보내 주셔서 감사합니다.
Kevin Cruijssen 2016 년

1

펄 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 bytes

Solution:

1_?x@prm@!#x:

Try it online!

Explanation:

Evaluation is performed right-to-left.

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)

0

JavaScript (ES6), 101 bytes

Adopted from a past answer of mine.

S=>(R=new Set,p=(s,m='')=>s[0]?s.map((_,i)=>p(a=[...s],m+a.splice(i,1))):R.add(m),_=p([...S]),[...R])


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.