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.


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


@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

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 :(


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

3

pyth , 8 4

-{.p

Tes online .

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

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

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 .


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

@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]&

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

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


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)

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)

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
}

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)

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.