Tìm tất cả các đảo chữ cái và các Subanagram cũng vậy!


13

Câu hỏi này chủ yếu dựa trên câu hỏi này , nhưng sẽ gây ra một số khó khăn khác.

Nhiệm vụ của bạn

Bạn phải viết một chương trình hoặc hàm, khi nhận được một chuỗi, in ra tất cả các đảo chữ có thể có của nó. Đối với mục đích của câu hỏi này, đảo chữ là một chuỗi chứa cùng ký tự với chuỗi gốc, nhưng không phải là chuỗi gốc. Một subanagram là một đảo chữ của một chuỗi con của một chuỗi được nhập. Đảo chữ và đảo con không cần phải có hoặc chứa các từ thực tế.

Đầu vào

Bạn có thể chấp nhận một chuỗi, có thể có độ dài bất kỳ> 0, theo bất kỳ phương thức nhập chuẩn nào. Nó có thể chứa bất kỳ ký tự ASCII nào.

Đầu ra

Bạn có thể xuất tất cả các đảo chữ và đảo con có thể có của chuỗi được nhập theo bất kỳ cách tiêu chuẩn nào. Bạn không được xuất cùng một chuỗi hai lần hoặc xuất một chuỗi bằng với đầu vào.

Các quy tắc khác

Lỗ hổng tiêu chuẩn không được phép

Chấm điểm

Đây là , ít byte thắng nhất.


Là chuỗi rỗng một đảo chữ có thể?
Chấn thương kỹ thuật số

Là đầu ra chuỗi / sustrings ban đầu được phép?
Máy

@CalculatorFeline "Bạn không được xuất cùng một chuỗi hai lần hoặc xuất một chuỗi bằng với đầu vào."
Jonathan Allan

@DigitalTrauma, "Bạn có thể chấp nhận một chuỗi, có thể có độ dài> 0 , theo bất kỳ phương thức nhập chuẩn nào". (nhấn mạnh thêm)
Gryphon

4
Một số trường hợp thử nghiệm sẽ hữu ích
Ông Xcoder

Câu trả lời:


8

05AB1E , 7 byte

Œ€œ˜Ù¹K

Hàm chấp nhận một chuỗi từ đầu vào và để lại danh sách các chuỗi trên ngăn xếp. Như một chương trình đầy đủ, một đại diện của danh sách được in.

Hãy thử trực tuyến!

Làm sao?

        - 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

Và ... bạn đã quản lý một cái gì đó thậm chí còn ngắn hơn.
Gryphon

Đó là cùng một thuật toán, chỉ cần ít byte hơn.
Jonathan Allan

Vâng, sự thay đổi ngôn ngữ là tất cả, nhưng nó vẫn ấn tượng.
Gryphon

@ ais523 Hình như tôi đã đi nhầm đường!
Jonathan Allan

@ ais523 Tôi nghĩ rằng nó đã được sửa.
Jonathan Allan

9

Brachylog (2), 7 byte

{sp}ᶠdb

Hãy thử trực tuyến!

Giải trình

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

(2) có nghĩa là gì?
Gryphon

@Gryphon (afaik) có 2 phiên bản của Branchylog, đây là sử dụng V2.
John Hamilton

1
Ok, không chắc đó là số phiên bản hay số byte có thể sử dụng một phương thức khác và có thể bất hợp pháp.
Gryphon

1
Đó là lần thứ hai tôi được hỏi bây giờ. Tôi đoán tôi sẽ phải bắt đầu viết nó như là (v2).

7

Thạch , 9 byte

ẆŒ!€;/QḟW

Một liên kết đơn âm chấp nhận một danh sách và trả về một danh sách tất cả các đảo chữ phụ riêng biệt ngoại trừ đầu vào.

Hãy thử trực tuyến! (chân trang in đẹp danh sách kết quả bằng cách nối với dòng mới.)

Làm sao?

ẆŒ!€;/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)


3

Japt , 10 byte

à má c â Å

Hãy thử trực tuyến!

Tôi đã sử dụng à, áâtất cả trong một câu trả lời, theo thứ tự quá. Thật là một sự trùng hợp ...

Giải trình

 à 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
Bạn thậm chí còn quản lý Å quá.
Gryphon

1

Toán học, 60 byte

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

Permutationslấy một đối số số tùy chọn cho nó biết có bao nhiêu giá trị đầu vào được sử dụng cho các hoán vị. Nếu chúng ta cho nó độ dài của đầu vào, nó sẽ tạo ra các hoán vị cho tất cả các tập hợp con của đầu vào mà không trùng lặp. Tất cả chúng ta cần làm là loại bỏ đầu vào.


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

Phiên bản sửa đổi của câu trả lời của tôi ở đây , nơi p("",s,l);đã được thay thế bằngfor(int z=s.length(),i=0,j;i<z;i++)for(j=i;j<z;p("",s.substring(i,j+++1),l));

-6 byte nhờ @ OlivierGrégoire trong câu trả lời được liên kết của tôi.

Giải thích về phần này:

Hãy thử nó ở đây.

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}

Thử nó

Mở rộng:

{                    # 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)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.