Tüm Anagramları bulun!


17

etiketli 17 soru olmasına rağmen , hala bu soruya sahip değiliz, işte burada.

Senin görevin

Bir dize alırken, tüm olası anagramlarını yazdıran bir program veya işlev yazmalısınız. Bu sorunun amaçları doğrultusunda bir anagram, orijinal dizeyle aynı karakteri içeren ancak orijinal dizenin tam bir kopyası olmayan bir dizedir. Bir anagramın gerçek kelimeler olması veya içermesi gerekmez.

Giriş

Herhangi bir uzunlukta> 0 olabilecek dizeyi herhangi bir standart giriş yöntemiyle kabul edebilirsiniz. Herhangi bir ASCII karakteri içerebilir.

Çıktı

Girilen dizgenin tüm olası anagramlarını herhangi bir standart şekilde çıktılayabilirsiniz. Aynı dizeyi iki kez çıkarmamalı veya girdiye eşit bir dize çıkarmamalısınız.

Diğer Kurallar

Standart Loopholes'a izin verilmiyor

puanlama

Bu , en az bayt kazanır.


Normal "program veya işlev" standardına uyabilir miyiz?
Jonathan Allan

@JonathanAllan Bence açıkça belirtilmemişse, bir program veya işlev gönderebilirsiniz. Genelde bunu sorularımda sorunsuz bir şekilde bıraktım
Digital Trauma

Evet, elbette bir program ya da işlev iyi çalışır.
Gryphon


@gryphon bir şeyleri nasıl düzenliyorsunuz
Foxy

Yanıtlar:


10

05AB1E , 3 bayt

œÙ¦

Yığını üstte anagramların bir listesiyle (ve tek öğesi olarak) bırakan bir işlev. Tam bir program olarak bu listenin bir temsilini yazdırır.

Çevrimiçi deneyin!

Nasıl?

    - 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'nin aşırı kısa olacağını tahmin etmeliydim.
Gryphon

4

Ruby , 45 bayt

->x{(x.chars.permutation.map(&:join)-[x])|[]}

Çevrimiçi deneyin!

Yerleşik olmasına rağmen, "permütasyon" kelimesi gerçekten uzun :(


|[]Gereksiz görünüyor?
canhascodez

@sethrin, tam olarak değil. Spesifikasyon, kopyaların kaldırılması gerektiğini söylüyor. |[]daha kısadır .uniq.
ymbirtt

3

MATL , 7 bayt

tY@1&X~

Çevrimiçi deneyin!

açıklama

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

pıhtı , 8 4

-{.p

Çevrimiçi test .

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

Büyük golf işi. Çok etkileyici 05AB1E yanıtını bağladığınız için tebrikler.
Gryphon

1
Üzgünüz, ancak girişte iki kez aynı karakter varsa bu aynı dizeyi iki kez çıkarır. Lütfen düzeltin.
Gryphon

Düzelttiğiniz için teşekkürler. Bununla birlikte bayt sayınızı artıran çok kötü.
Gryphon

Aynı cevabı buldum ama aynı zamanda tekrarlamayı da unuttum. Büyük akıllar benzer mi?
Tornado547

3

Japt , 6 bayt

á â kU

Çevrimiçi deneyin!

açıklama

 á â 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

Tebrikler zaferi çaldığı için. +1
Gryphon

1
@Gryphon 05AB1E'de 3 bayt değilse çok hızlı değil, şok olurdum ...
ETHproductions

Şimdilik demek istedim. Seni henüz kabul edilmiş olarak işaretliyorum gibi değil.
Gryphon

@Dennis Jelly'de bunu yaparsa, muhtemelen 2 bayt gibi olacaktır. Biri sadece Dennis'i geride bırakmaz.
Gryphon

1
3 bayt tahmini iyiydi, ama 2 var mı ?!
Jonathan Allan

3

Haskell, 48 40 bayt

import Data.List
a=tail.nub.permutations

Çevrimiçi deneyin!

Leo'nun tailucu sayesinde 8 bayt tasarruf etti .


2
Orijinal dize her zaman permütasyonlar listesinde ilk olacağından, tailyerine kullanabilirsiniz delete x. Bu, noktasız bir çözüme ve daha sonra adlandırılmamış bir işleve, kaydedilecek çok sayıda bayt'a geçmenizi sağlar!
Leo

@Leo Harika, teşekkürler!
Cristian Lupascu

2

CJam , 8 bayt

l_e!\a-p

Çevrimiçi deneyin!

açıklama

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 Teşekkürler, düzeltildi
Luis Mendo

@Gryphon Eh, Jonathan'ın çok uygun düzeltmesinden sonra 7 ;-)
Luis Mendo

Şimdi bu soruyu cevapladım.
Gryphon

Umm, TIO hala orijinal dizgiyi benim için çıkarıyor mu?
Gryphon

@Gryphon Üzgünüm, şimdi çalışıyor olmalı. Bunun için çok yoruldum; yatağa gidiyor :-P
Luis Mendo

2

Mathematica, 47 bayt

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

Bunlardan birini bekliyordum, ama kazanamayacağından emindim. Türde sadece bir tane olmadığına şaşırdım.
Gryphon

StringJoin/@Rest@Permutations@Characters@#&43 bayttır.
jcai

2

Jöle , 4 bayt

Œ!QḊ

Karakterlerin listesini alan ve karakterlerin listesini döndüren monadik bir bağlantı - girişe eşit olmayan farklı anagramlar.

Çevrimiçi deneyin! (altbilgi, aksi halde parçalanmış temsili önlemek için listeye satır satırlarına katılan ve yazdırılan bir program oluşturur).

Nasıl?

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

Etkileyici. Bir açıklama olacak mı, çünkü Jelly değilim?
Gryphon

Evet tabi ki!
Jonathan Allan

Çağlar önce çıkardım, bu yüzden neden başlıkta "(4?)" Ve Yişlevlere izin verilip verilmediğini kaldırma metni vardı ... Gördüğüm kadarıyla düzenlememi soruyu tersine çevirdiniz: /
Jonathan Allan

2

Python 3, 85 76 63 bayt

Bir işlev olarak ve dizeleri karakter listesi olarak döndürmek (@ pizzapants184 sayesinde bana izin verildiğini bildirmek için teşekkürler):

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

İşlev olarak:

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

Tam bir program olarak 85 bayt:

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

('A', 'b', 'c') olarak dizgilerin çıkışına izin verilirse biraz azaltılabilir (emin değilim).


Sadece python bir golf diliyse, ha.
Gryphon

1
('A', 'b', 'c') olarak çıktı iyi olmalıdır, bu pire cevap (temel olarak) yapar.
pizzapants184

2

Java 8, 245 239 237 bayt

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 sayesinde -6 bayt .

Tipik ayrıntılı Java .. <10 baytlık cevapların birçoğunu görüyorum ve burada 200+ bayt ile beraberim .. XD

Açıklama:

Burada deneyin.

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);Yazdırma döngünüz yerine kullanın . Ayrıca, Setiçine alan sınıf olmadan sınıf düzeyinde tanımlanmasını sevmiyorum , bir lambda kimse nerede ve bir yöntem bilmiyor tanımladı. Bu benim için çok fazla. İthalatın diğerlerinden ayrıldığını anlayabiliyorum, ama orada kendine yeten hiçbir şey yok, daha fazla bir parçacık koleksiyonuna benziyor. Özür dilerim, ama PCG'de ilk defa -1 veriyorum :(
Olivier Grégoire

@ OlivierGrégoire Her şeyden önce bahşiş için teşekkürler forEach. Sınıf düzeyine gelince Set, alternatif nedir? Main-yöntemi de dahil olmak üzere tüm sınıf sonrası? Ana yöntemi hariç, ancak sınıfın kendisini, arabirimini ve işlev adını içeren tüm sınıfı yayınla
Kevin Cruijssen

Tam bir sınıf yazardım. Bulabildiğim en küçük müstakil. Eklemeye gerek yok public static void main, sadece "giriş yöntemi ..." deyin. Mesele şu anda cevabınızın "bağımsız" tüm kuralları çiğnemesidir. Kurallara uymamaya değil, kırılmaya karşı mı? Evet,
umrumda

1
Başka bir fikir: Set as parametresi? Yardımcı fonksiyon, bunu tamamen anlayabiliyorum, ama Set'i beni işaretleyen her şeyin dışında tanımlıyor.
Olivier Grégoire

@ OlivierGrégoire Tamam, ikinci öneriniz için gitti. Gerçekten de daha mantıklı, bu yüzden bundan sonra kullanacağım. Dürüst geribildirim için teşekkürler.
Kevin Cruijssen

1

Perl 6 ,  39  38 bayt

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

Dene

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

Dene

Expanded

*               # 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 bayt

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

ungolfed

#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 bayt

Çözüm:

1_?x@prm@!#x:

Çevrimiçi deneyin!

Açıklama:

Değerlendirme sağdan sola yapılır.

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 bayt

Geçmiş bir cevabımdan benimsendi .

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.