Temukan semua Anagram!

16

Meskipun memiliki 17 pertanyaan yang ditandai , kami masih belum memiliki pertanyaan ini, jadi ini dia.

Tugas Anda

Anda harus menulis sebuah program atau fungsi yang, saat menerima sebuah string, mencetak semua anagram yang mungkin darinya. Untuk keperluan pertanyaan ini, anagram adalah string yang berisi karakter yang sama dengan string asli, tetapi bukan salinan persis dari string asli. Anagram tidak harus atau mengandung kata-kata aktual.

Memasukkan

Anda dapat menerima string, yang panjangnya> 0, dengan metode input standar apa pun. Ini mungkin mengandung karakter ASCII.

Keluaran

Anda dapat menampilkan semua anagram yang mungkin dari string yang dimasukkan dengan cara standar apa pun. Anda tidak boleh mengeluarkan string yang sama dua kali, atau menghasilkan string yang sama dengan input.

Peraturan Lainnya

Celah Standar tidak diizinkan

Mencetak gol

Ini adalah , paling tidak byte menang.

Gryphon
sumber
Bisakah kita mematuhi standar "program atau fungsi" yang normal?
Jonathan Allan
@ JonathanAllan Saya pikir jika tidak disebutkan secara eksplisit, Anda dapat mengirimkan program atau fungsi. Saya biasanya membiarkan hal itu tersirat dalam pertanyaan saya tanpa masalah
Digital Trauma
Ya, tentu saja program atau fungsi akan berfungsi dengan baik.
Gryphon
Terkait erat
FryAmTheEggman
@gryphon bagaimana Anda mengedit hal
Foxy

Jawaban:

9

05AB1E , 3 byte

œÙ¦

Fungsi yang meninggalkan tumpukan dengan daftar anagram di atas (dan sebagai satu-satunya item). Saat program lengkap mencetak representasi dari daftar itu.

Cobalah online!

Bagaimana?

    - 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
Jonathan Allan
sumber
Seharusnya menebak 05AB1E akan menjadi terlalu pendek.
Gryphon
4

Ruby , 45 byte

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

Cobalah online!

Meskipun memiliki built-in, kata "permutasi" sangat panjang :(

ymbirtt
sumber
The |[]tampaknya tidak perlu?
canhascodez
@sethrin, tidak cukup. Spesifikasi mengatakan bahwa duplikat harus dihapus. |[]lebih pendek dari .uniq.
ymbirtt
3

MATL , 7 byte

tY@1&X~

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
3

pyth , 8 4

-{.p

Tes online .

  .pQ     # all permutations of the (implicit) input string
 {        # de-duplicate
-    Q    # subtract (implicit) input
digital Trauma
sumber
Pekerjaan golf yang bagus. Selamat atas jawaban 05AB1E yang sangat mengesankan.
Gryphon
1
Maaf, tetapi ini menghasilkan string yang sama dua kali jika ada karakter yang sama dalam input dua kali. Tolong perbaiki itu.
Gryphon
Terima kasih telah memperbaikinya. Sayang sekali tentang hal itu meningkatkan jumlah byte Anda.
Gryphon
Saya datang dengan jawaban yang sama tetapi juga lupa untuk menduplikasi. Pemikir hebat berfikir yang sama?
Tornado547
3

Japt , 6 byte

á â kU

Cobalah online!

Penjelasan

 á â 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
Produksi ETH
sumber
Selamat mencuri kemenangan. +1
Gryphon
1
@Gryphon Tidak terlalu cepat, saya akan terkejut jika ini bukan 3 byte di 05AB1E ...
ETHproduksi
Maksudku memang untuk saat ini. Ini tidak seperti saya menandai Anda sebagai diterima.
Gryphon
Jika @Dennis melakukan ini di Jelly, itu mungkin akan seperti 2 byte. Seseorang tidak hanya mengalahkan Dennis.
Gryphon
1
Prediksi 3 byte bagus, tetapi apakah ada 2 ?!
Jonathan Allan
3

Haskell, 48 40 byte

import Data.List
a=tail.nub.permutations

Cobalah online!

Disimpan 8 byte berkat tailtip Leo .

Cristian Lupascu
sumber
2
Anda dapat menggunakan tailsebagai ganti delete x, karena string asli akan selalu menjadi yang pertama dalam daftar permutasi. Ini akan memungkinkan Anda beralih ke solusi titik bebas, dan kemudian ke fungsi yang tidak disebutkan namanya, banyak byte yang akan disimpan!
Leo
@ Leo Hebat, terima kasih!
Cristian Lupascu
2

CJam , 8 byte

l_e!\a-p

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
@JonathanAllan Terima kasih, dikoreksi
Luis Mendo
@Gryphon Well, 7 setelah koreksi Jonathan yang sangat tepat ;-)
Luis Mendo
Saya sekarang telah menjawab pertanyaan itu.
Gryphon
Umm, TIO masih mengeluarkan string asli untuk saya?
Gryphon
@Gryphon Maaf, seharusnya sudah berfungsi sekarang. Saya jelas terlalu lelah untuk ini; tidur :-P
Luis Mendo
2

Mathematica, 47 byte

Drop[StringJoin/@Permutations[Characters@#],1]&
J42161217
sumber
Saya sedang menunggu salah satu dari ini, tetapi saya cukup yakin itu tidak akan menang. Agak kaget tidak hanya ada satu built-in.
Gryphon
StringJoin/@Rest@Permutations@Characters@#&adalah 43 byte.
jcai
2

Jelly , 4 byte

Œ!QḊ

Tautan monadik yang mengambil daftar karakter dan mengembalikan daftar daftar karakter - semua anagram berbeda yang tidak sama dengan input.

Cobalah online! (footer membentuk program yang menggabungkan daftar dengan baris baru dan cetakan untuk menghindari representasi yang hancur).

Bagaimana?

Œ!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
sumber
Impresif. Akankah ada penjelasan, karena saya tidak Jelly?
Gryphon
Ya tentu saja!
Jonathan Allan
Saya melepasnya sejak lama, oleh karena itu mengapa saya memiliki "(4?)" Di header dan teks tentang menghapus Yjika fungsi diizinkan ... Saya melihat Anda baru saja membalik edit saya ke pertanyaan: /
Jonathan Allan
2

Python 3, 85 76 63 byte

Sebagai fungsi, dan mengembalikan string sebagai daftar karakter (terima kasih kepada @ pizzapants184 karena memberi tahu saya bahwa itu diperbolehkan):

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

Sebagai fungsi:

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

85 byte sebagai program lengkap:

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

Bisa dikurangi sedikit jika mengeluarkan string sebagai ('a', 'b', 'c') diperbolehkan (Saya tidak yakin itu).

Nore
sumber
Kalau saja python adalah bahasa golf, eh.
Gryphon
1
Keluaran sebagai ('a', 'b', 'c') harus baik-baik saja, jawaban ini tidak (pada dasarnya).
pizzapants184
2

Java 8, 245 239 237 byte

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 byte terima kasih kepada @ OlivierGrégoire .

Java verbose yang umum .. Saya melihat banyak <10 byte jawaban, dan saya di sini dengan 200+ byte .. XD

Penjelasan:

Coba di sini.

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)
Kevin Cruijssen
sumber
Gunakan l.forEach(System.out::println);sebagai ganti lingkaran pencetakan Anda. Juga, saya tidak suka Setdidefinisikan di tingkat kelas tanpa kelas terlampir, sebuah lambda didefinisikan tidak ada yang tahu di mana dan metode. Ini terlalu banyak untukku. Saya dapat memahami impor dipisahkan dari yang lain, tetapi tidak ada yang mandiri di sana, lebih mirip kumpulan potongan daripada yang lainnya. Maaf, tetapi untuk pertama kalinya di PCG, saya memberi -1 :(
Olivier Grégoire
@ OlivierGrégoire Pertama-tama terima kasih atas tipnya forEach. Sedangkan untuk tingkat kelas Set, apa alternatifnya? Posting seluruh kelas termasuk metode utama? Posting seluruh kelas tidak termasuk metode utama, tetapi termasuk kelas itu sendiri, antarmuka dan nama fungsi?
Kevin Cruijssen
Saya akan menulis kelas penuh. Itu mandiri terkecil yang bisa saya temukan. Tidak perlu menambahkan public static void main, katakan saja "metode entri adalah ...". Masalahnya adalah bahwa jawaban Anda seperti saat ini melanggar semua aturan "mandiri". Saya tidak menentang mengikat aturan, tetapi melanggar? Ya, saya keberatan :(
Olivier Grégoire
1
Gagasan lain: lulus Tetapkan sebagai parameter? Fungsi pembantu, saya benar-benar bisa mengerti itu, tapi itu mendefinisikan Set di luar semua yang membuat saya tergerak.
Olivier Grégoire
@ OlivierGrégoire Ok, pergi untuk saran kedua Anda. Memang lebih masuk akal juga, jadi saya akan menggunakannya mulai sekarang. Terima kasih atas umpan balik yang jujur.
Kevin Cruijssen
1

Perl 6 ,  39  38 byte

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

Cobalah

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

Cobalah

Diperluas

*               # 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)
Brad Gilbert b2gills
sumber
1

C ++, 142 byte

#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
}
Michiel uit het Broek
sumber
1

K (oK) , 13 byte

Larutan:

1_?x@prm@!#x:

Cobalah online!

Penjelasan:

Evaluasi dilakukan dari kanan ke kiri.

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)
streetster
sumber
0

JavaScript (ES6), 101 byte

Diadopsi dari jawaban masa lalu saya .

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

Darrylyeo
sumber
0

Perl 5 , 89 + 2 ( -F) = 91 byte

$,=$_;$"=",";map{say if!$k{$_}++&&$,ne$_&&(join"",sort@F)eq join"",sort/./g}glob"{@F}"x@F

Cobalah online!

Xcali
sumber
Anda mungkin ingin menambahkan penjelasan.
Gryphon