Tìm tất cả các đảo chữ cái!


16

Mặc dù có 17 câu hỏi được gắn thẻ đảo , chúng tôi vẫn không có câu hỏi này, vì vậy đây là.

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à bản sao chính xác của chuỗi gốc. Một đảo chữ cái không phải là hoặc chứa các từ thực tế.

Đầu vào

Bạn có thể chấp nhận 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ữ 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.


Chúng tôi có thể tuân thủ tiêu chuẩn "chương trình hoặc chức năng" thông thường không?
Jonathan Allan

@Jonathan ALLan Tôi nghĩ rằng nếu nó không được đề cập rõ ràng, bạn có thể gửi một chương trình hoặc một chức năng. Nói chung, tôi thường để lại ẩn ý trong các câu hỏi của mình mà không gặp vấn đề gì
Chấn thương kỹ thuật số

Vâng, tất nhiên hoặc một chương trình hoặc một chức năng sẽ hoạt động tốt.
Gryphon - Tái lập Monica


@gryphon bạn chỉnh sửa mọi thứ như thế nào
Foxy

Câu trả lời:


9

05AB1E , 3 byte

œÙ¦

Một chức năng rời khỏi ngăn xếp với một danh sách các đảo chữ trên đầu (và là mục duy nhất của nó). Như một chương trình đầy đủ in một đại diện của danh sách đó.

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

Làm sao?

    - 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

Nên đoán 05AB1E sẽ quá ngắn.
Gryphon - Tái lập Monica

4

Ruby , 45 byte

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

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

Mặc dù có tích hợp sẵn, từ "hoán vị" thực sự dài :(


|[]vẻ không cần thiết?
canhascodez

@sethrin, không hẳn. Thông số kỹ thuật nói rằng các bản sao cần được loại bỏ. |[]ngắn hơn .uniq.
ymbirtt

3

MATL , 7 byte

tY@1&X~

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

Giải trình

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

trăn , 8 4

-{.p

Kiểm tra trực tuyến .

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

Công việc chơi golf tuyệt vời. Chúc mừng bạn đã buộc câu trả lời 05AB1E rất ấn tượng.
Gryphon - Tái lập Monica

1
Xin lỗi, nhưng điều này xuất ra cùng một chuỗi hai lần nếu có cùng một ký tự trong đầu vào hai lần. Hãy sửa nó đi.
Gryphon - Tái lập Monica

Cảm ơn đã sửa nó. Quá tệ về việc nó tăng số byte của bạn mặc dù.
Gryphon - Tái lập Monica

Tôi đã đưa ra câu trả lời tương tự nhưng cũng quên không lặp lại. Tư tưởng lớn gặp nhau?
Tornado547

3

Japt , 6 byte

á â kU

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

Giải trình

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

Chúc mừng bạn đã đánh cắp chiến thắng. +1
Gryphon - Phục hồi Monica

1
@Gryphon Không quá nhanh, tôi sẽ bị sốc nếu đây không phải là 3 byte trong 05AB1E ...
Sản phẩm ETH

Tôi đã có ý nghĩa cho bây giờ. Nó không giống như tôi đang đánh dấu bạn là chấp nhận được.
Gryphon - Tái lập Monica

Nếu @Dennis thực hiện điều này trong Jelly, nó có thể sẽ giống như 2 byte. Một người không chỉ đơn giản là vượt qua Dennis.
Gryphon - Tái lập Monica

1
Dự đoán 3 byte là tốt, nhưng có 2 không?!
Jonathan Allan

3

Haskell, 48 40 byte

import Data.List
a=tail.nub.permutations

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

Đã lưu 8 byte nhờ tailmẹo của Leo .


2
Bạn có thể sử dụng tailthay vì delete x, vì chuỗi gốc sẽ luôn đứng đầu trong danh sách hoán vị. Điều này sẽ cho phép bạn chuyển sang một giải pháp không có điểm, và sau đó đến một hàm không tên, rất nhiều byte sẽ được lưu!
Leo

@Leo Tuyệt, cảm ơn!
Cristian Lupascu

2

CJam , 8 byte

l_e!\a-p

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

Giải trình

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

@Jonathan ALLan Cảm ơn, đã sửa chữa
Luis Mendo

@Gryphon Vâng, 7 sau khi chỉnh sửa rất chính xác của Jonathan ;-)
Luis Mendo

Bây giờ tôi đã trả lời câu hỏi đó.
Gryphon - Tái lập Monica

Umm, TIO vẫn xuất ra chuỗi gốc cho tôi?
Gryphon - Tái lập Monica

@Gryphon Xin lỗi, nó nên hoạt động ngay bây giờ. Tôi rõ ràng quá mệt mỏi vì điều này; đi ngủ :-P
Luis Mendo

2

Toán học, 47 byte

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

Tôi đã chờ đợi một trong những điều này, nhưng tôi khá chắc chắn rằng nó sẽ không chiến thắng. Kinda ngạc nhiên khi không chỉ có một chiếc được tích hợp.
Gryphon - Tái lập Monica

StringJoin/@Rest@Permutations@Characters@#&là 43 byte.
jcai

2

Thạch , 4 byte

Œ!QḊ

Một liên kết đơn âm lấy danh sách các ký tự và trả về danh sách các danh sách các ký tự - tất cả các đảo chữ riêng biệt không bằng đầu vào.

Hãy thử trực tuyến! (chân trang tạo thành một chương trình tham gia danh sách theo dòng mới và bản in để tránh đại diện bị đập vỡ).

Làm sao?

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

Ấn tượng. Sẽ có một lời giải thích, bởi vì tôi không Jelly?
Gryphon - Phục hồi Monica

Phải, tất nhiên!
Jonathan Allan

Tôi đã gỡ bỏ nó từ lâu, vì vậy tại sao tôi lại có "(4?)" Trong tiêu đề và văn bản về việc loại bỏ Ynếu các chức năng được cho phép ... Tôi thấy bạn chỉ đảo ngược chỉnh sửa của mình cho câu hỏi: /
Jonathan Allan

2

Python 3, 85 76 63 byte

Là một hàm và trả về các chuỗi dưới dạng danh sách các ký tự (cảm ơn @ pizzapants184 vì đã cho tôi biết nó được cho phép):

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

Là một chức năng:

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

85 byte là một chương trình đầy đủ:

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

Có thể giảm một chút nếu xuất ra các chuỗi như ('a', 'b', 'c') được cho phép (tôi không chắc là như vậy).


Nếu chỉ có trăn là một ngôn ngữ chơi gôn, eh.
Gryphon - Tái lập Monica

1
Xuất ra dưới dạng ('a', 'b', 'c') sẽ ổn, câu trả lời thứ ba này (về cơ bản).
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 nhờ @ OlivierGrégoire .

Java verbose điển hình .. Tôi thấy rất nhiều câu trả lời <10 byte và ở đây tôi có hơn 200 byte .. XD

Giải trình:

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

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)

Sử dụng l.forEach(System.out::println);thay vì vòng lặp in của bạn. Ngoài ra, tôi không thích Setđược định nghĩa ở cấp lớp mà không có lớp kèm theo, lambda định nghĩa không ai biết phương thức và phương thức. Điều này là quá nhiều cho tôi. Tôi có thể hiểu hàng nhập khẩu được tách ra khỏi phần còn lại, nhưng không có gì độc lập ở đó, nó trông giống như một bộ sưu tập các đoạn hơn bất cứ thứ gì khác. Tôi xin lỗi, nhưng lần đầu tiên trong PCG, tôi cho -1 :(
Olivier Grégoire

@ OlivierGrégoire Trước hết cảm ơn vì tiền boa cho forEach. Đối với cấp độ lớp học Set, sự thay thế là gì? Đăng toàn bộ lớp bao gồm cả phương thức chính? Đăng toàn bộ lớp không bao gồm phương thức chính, nhưng bao gồm chính lớp, giao diện và tên hàm?
Kevin Cruijssen

Tôi sẽ viết một lớp đầy đủ. Đó là sự khép kín nhỏ nhất mà tôi có thể tìm thấy. Không cần thêm public static void main, chỉ cần nói "phương thức nhập là ...". Vấn đề là câu trả lời của bạn như hiện tại đang phá vỡ tất cả các quy tắc "khép kín". Tôi không chống lại các quy tắc, nhưng phá vỡ? Vâng, tôi nhớ :(
Olivier Grégoire

1
Một ý tưởng khác: truyền tham số Set làm tham số? Hàm trợ giúp, tôi hoàn toàn có thể hiểu điều đó, nhưng nó xác định Set bên ngoài mọi thứ khiến tôi đánh dấu.
Olivier Grégoire

@ OlivierGrégoire Ok, đã đề nghị thứ hai của bạn. Quả thực cũng có ý nghĩa hơn, vì vậy tôi sẽ sử dụng nó từ bây giờ. Cảm ơn các phản hồi trung thực.
Kevin Cruijssen

1

Perl 6 ,  39  38 byte

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

Thử nó

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

Thử nó

Mở rộng

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

vô dụng

#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

Giải pháp:

1_?x@prm@!#x:

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

Giải trình:

Đánh giá được thực hiện từ phải sang trái.

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)


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.