Temukan semua Anagram, dan Subanagram juga!


13

Pertanyaan ini sangat didasarkan pada pertanyaan ini , tetapi harus menimbulkan sejumlah kesulitan tambahan.

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 string asli. Subanagram adalah anagram substring dari string yang dimasukkan. Anagram dan sub-diagram 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 dan sub-diagram 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.


Apakah string kosong kemungkinan anagram?
Trauma Digital

Apakah mengeluarkan string / penopang asli diizinkan?
CalculatorFeline

@ CalculatorFeline "Anda tidak harus mengeluarkan string yang sama dua kali, atau menghasilkan string yang sama dengan input."
Jonathan Allan

@DigitalTrauma, "Anda dapat menerima string, yang panjangnya> 0 , dengan metode input standar apa pun". (penekanan ditambahkan)
Gryphon

4
Beberapa Test case akan membantu
Tn. Xcoder

Jawaban:


8

05AB1E , 7 byte

Œ€œ˜Ù¹K

Fungsi yang menerima string dari input dan meninggalkan daftar string pada stack. Sebagai program lengkap, representasi daftar dicetak.

Cobalah online!

Bagaimana?

        - push input
Œ       - all substrings
 €œ     - for €ach: all permutations
   ˜    - flatten
    Ù   - de-duplicate
     ¹  - push 1st input onto top of stack
      K - pop a,b; push a without any b's (remove the copy of the input from the list)
        - as a full program: implicit print of the top of the stack

Dan ... Anda mengelola sesuatu yang bahkan lebih pendek.
Gryphon

Algoritma yang sama, hanya lebih sedikit byte.
Jonathan Allan

Ya, perubahan bahasa itu saja, tetapi masih mengesankan.
Gryphon

@ ais523 Sepertinya saya salah jalan!
Jonathan Allan

@ ais523 Saya pikir sudah diperbaiki.
Jonathan Allan

9

Brachylog (2), 7 byte

{sp}ᶠdb

Cobalah online!

Penjelasan

{sp}ᶠdb
{  }ᶠ    Find all
  p        permutations of
 s         a substring of {the input}
     d   Remove duplicates (leaving the list otherwise in the same order)
      b  Remove the first (the input itself)

Apa artinya (2)?
Gryphon

@Gryphon (afaik) ada 2 versi branchylog, ini menggunakan V2.
John Hamilton

1
Ok, tidak yakin apakah itu nomor versi atau jumlah byte yang mungkin menggunakan metode yang berbeda, dan mungkin ilegal.
Gryphon

1
Itu kedua kalinya saya ditanyai sekarang. Saya kira saya harus mulai menulis sebagai (v2).

7

Jelly , 9 byte

ẆŒ!€;/QḟW

Tautan monadik yang menerima daftar dan mengembalikan daftar semua sub-anagram yang berbeda kecuali input itu sendiri.

Cobalah online! (footer cukup mencetak daftar yang dihasilkan dengan bergabung dengan baris baru.)

Bagaimana?

ẆŒ!€;/QḟW - Link: list of characters, s
Ẇ         - all contiguous sublists of s
 Œ!€      - all permutations for €ach sublist now a list of lists of lists)
     /    - reduce by:
    ;     -   concatenation (flattens the list by one level)
      Q   - de-duplicate (gets the unique entries)
        W - wrap s in a list (otherwise filtering will attempt to remove characters)
       ḟ  - filter discard from left if in right (remove the one equal to the input)

4

Pyth, 12

-{.n.pM.:Q)]

Tes online .

         Q       # input
       .: )      # all substrings
    .pM          # all permutations of all substrings
  .n             # flatten
 {               # deduplicate
-          ]Q    # subtract (list of) (implicit) input

@ ais523 Redone - Saya pikir itu benar sekarang.
Digital Trauma

3

Japt , 10 byte

à má c â Å

Cobalah online!

Saya harus menggunakan à,á dan âsemuanya dalam satu jawaban, juga. Kebetulan sekali...

Penjelasan

 à má c â Å
Uà má c â s1  // Ungolfed
              // Implicit: U = input string
Uà            // Take all combinations of characters in the input string.
   má         // Map each combination to all of its permutations.
      c       // Flatten into a single array.
        â     // Uniquify; remove all duplicates.
          s1  // Remove the first item (the input) from the resulting array.
              // Implicit: output resulting array, separated by commas

1
Anda bahkan mengelola Å juga.
Gryphon

1

Mathematica, 60 byte

DeleteCases[""<>#&/@Permutations[c=Characters@#,Tr[1^c]],#]&

Permutationsmengambil argumen numerik opsional yang menunjukkan berapa banyak nilai input yang digunakan untuk permutasi. Jika kami memberikan panjang input, itu akan menghasilkan permutasi untuk semua himpunan bagian dari input tanpa duplikat. Yang perlu kita lakukan adalah menghapus input.


1

Java 8, 313 312 306 byte

import java.util.*;s->{Set l=new HashSet();for(int z=s.length(),i=0,j;i<z;i++)for(j=i;j<z;p("",s.substring(i,j+++1),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+++1,n),l));}

Versi modifikasi dari jawaban saya di sini , di manap("",s,l); telah diganti denganfor(int z=s.length(),i=0,j;i<z;i++)for(j=i;j<z;p("",s.substring(i,j+++1),l));

-6 byte terima kasih kepada @ OlivierGrégoire dalam jawaban tertaut saya.

Penjelasan bagian ini:

Coba di sini.

for(int l=s.length(),i=0,j;i<l;i++)
                               // Loop (1) from 0 to the length of the String (exclusive)
  for(j=i+1;j<=l;              //  Loop (2) from 1 to the length of the String (exclusive)
    p("",                      //   Call the permutation-method,
    s.substring(i,j+++1),l));  //   with a substring from `i` to `j` (inclusive)
                               //  End of loop (2) (implicit / single-line body)
                               // End of loop (1) (implicit / single-line body)

0

Perl 6 , 75 byte

{unique(flat $_,.comb.combinations.skip».permutations.map(*».join)).skip}

Cobalah

Diperluas:

{                    # bare block lambda with implicit parameter 「$_」

  unique(            # return each (sub)anagram once

    flat             # unstructure the following (List of Lists into flat List)
      $_,            # the input (so we can skip it at the end)

      .comb          # split the input into graphemes
      .combinations  # get all the combinations
      .skip\         # skip the first empty combination
      ».permutations # get all the permutations of each combination
      .map(*».join)  # join the inner permutations

  ).skip             # skip the first value (the input)
}
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.