Bảng chữ cái hoán vị một chuỗi


27

Bài tập

Mục tiêu của bạn, nếu bạn chọn chấp nhận nó, là viết một chương trình, đưa ra một chuỗi đầu vào (hoặc mảng ký tự), đưa ra mọi hoán vị có thể có của các chữ cái trong chuỗi đó. Tôi rất khó tính với đầu ra của mình, vì vậy nó nên được sắp xếp theo thứ tự abc, không có sự trùng lặp.

Thí dụ:

Đầu vào: buzz

Đầu ra:

buzz
bzuz
bzzu
ubzz
uzbz
uzzb
zbuz
zbzu
zubz
zuzb
zzbu
zzub

Quy tắc

  • Đây là nên mã ngắn nhất sẽ thắng.
  • Không gian lưu trữ trên mỗi / bất kỳ dòng nào là ok
  • Một dòng mới sau dòng cuối cùng được cho phép (nhưng không còn nữa)

Định dạng đầu ra có thể được ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]?
Luis Mendo

Xin lỗi, như tôi đã đề cập, tôi rất khó tính;) đầu ra phải nằm trên các dòng riêng biệt, thay vì ở định dạng danh sách
Brian Gradin

Vâng, điều đó có ý nghĩa. Tôi chỉ muốn xem liệu tôi có thể xóa một byte khỏi câu trả lời của tôi không ( N*đểp ) :-)
Luis Mendo

2
Một thử thách đầu tiên vững chắc!
xnor

1
Rất nhiều nội dung!
Dan

Câu trả lời:


23

Thạch , 5 byte

ṢŒ!QY

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

Giải trình

Ṣ         Sort
 Œ!       All permutations
   Q      Unique
    Y     Join by linefeeds

26
Và ... chúng tôi có 100000 bài viết! Chúc mừng!
Sản phẩm ETH

1
@ETHproductions Heh! Cảm ơn! :-)
Luis Mendo

1
Xin chúc mừng từ phía tôi nữa :) @ETHproductions bạn đã đạt được kết quả đó như thế nào? Tôi chỉ tò mò ...
geisterfurz007 Dừng sự hỗn loạn này vào

5
@ geisterfurz007 Nhấp vào liên kết "chia sẻ" ở cuối bài. Điều đó có ID của bài đăng trong URL.
Martin Ender

1
Ồ, vậy là bài viết thứ 100000 của ppcg! Tôi nghĩ Luis Mendo đã ở con số đó rồi. Lỗi của tôi. Cảm ơn đã giải thích!
geisterfurz007 Dừng sự hỗn loạn này vào

12

05AB1E ,  4  3 byte

Đã cập nhật, kể từ khi bản cập nhật œphá vỡ phiên bản cũ,
cũng lưu một byte theo đề xuất của Magic Octopus Urn .

œê»

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

Giải trình

œ     # get all permutations of input
 ê    # sort and remove duplicates
  »   # join list by newlines

œê»là tốt cho không di sản.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Nó thực sự cần thiết cho cả hai phiên bản vì œbây giờ trả về một danh sách chuỗi trong cả hai.
Emigna


10

Python 3.5, 79 byte

def f(s,w=''):
 s or print(w)
 for c in sorted({*s}):t=s*1;t.remove(c);f(t,w+c)

Một chức năng lấy đầu vào là một danh sách các ký tự và đầu ra bằng cách in.

Đệ quy thực hiện mọi hoán vị riêng biệt bằng cách lấy từng ký tự tiếp theo có thể theo thứ tự abc ra khỏi các ký tự riêng biệt còn lại và nối nó với đầu ra trong tiến trình w. Sau đó, chúng tôi tái diễn với nhân vật này được loại bỏ. Sau khi đầu vào được làm trống, chúng tôi in w.


Lấy một danh sách các ký tự, không phải là một chuỗi.
xnor


8

Pyth - 5 byte

jS{.p

Hãy thử trực tuyến tại đây .

j        Join. Implictly joins on newlines.
 S       Sort
  {      Uniquify
   .p    All permutations, implicitly run on input.

Sthực sự cần thiết?
Luis Mendo

@LuisMendo Cần thiết nếu đầu vào chưa được sắp xếp.
isaacg

1
@isaacg Cảm ơn! Tôi chỉ nhận ra rằng tôi cũng cần điều đó trong câu trả lời Jelly của mình
Luis Mendo

@LuisMendo rất tiếc.
Maltysen

6

Haskell, 46 byte

import Data.List;unlines.sort.nub.permutations

Lưu 2 byte nhờ nimi


1
Bạn không cần tên cho hàm, vì vậy bạn có thể bỏ tên f=.
nimi

5

J, 19 byte

/:~@~.@:{~!@#A.&i.#

Trường hợp thử nghiệm

   f =: /:~@~.@:{~!@#A.&i.#
   f 'buzz'
buzz
bzuz
bzzu
ubzz
uzbz
uzzb
zbuz
zbzu
zubz
zuzb
zzbu
zzub

Giải trình

Đây là một chuyến tàu 4 người:

                     /- ~ --- /:
               /- @ -^- ~.
  /- ~ --- @: -^- {
  |
  |            /- !
--<     /- @ --^- #
  |     |
  \-----<      /- A.
        >- & --^- i.
        \- #

Về cơ bản:

/:~@~.@:{~!@#A.&i.#
          !  A.&     get permutations
           @#   i.#  of range (0..length)
        {~           map indices to chars in string
      @:             then
    ~.               unique
   @                 then
/:~                  sort

Tôi nghĩ rằng [:~.i.@!@#A./:~nên giúp bạn tiết kiệm một vài byte
dặm

4

JavaScript (Firefox 30+), 129 124 byte

f=(a,i=-1)=>a[1]?[for(x of a.sort())if(a.indexOf(x)==++i)f([...a.slice(0,i),...a.slice(i+1)]).replace(/^/gm,x)].join`
`:a[0]

Không quá tệ cho một ngôn ngữ không có tích hợp hoán vị ...


Tôi đã chuyển đổi nó để hoạt động trên chuỗi; mặc dù lấy 23 byte chỉ để sắp xếp các ký tự theo thứ tự, tôi vẫn hoàn thành công việc trong 120 byte.
Neil

3

Python 3.5, 81 byte:

from itertools import*;lambda i:'\n'.join(sorted({*map(''.join,permutations(i))}))

Thực sự ... 81 byte khi câu trả lời dài nhất tiếp theo là 48 byte ... thở dài . Chà, tôi sẽ thử chơi golf này nhiều nhất có thể, nhưng mẹo chơi golf vẫn được đánh giá rất cao.

Ngoài ra, đây là giải pháp ngắn nhất tôi có thể nhận được trong Python 2 với 86 byte :

from itertools import*;lambda f:'\n'.join(sorted({''.join(i)for i in permutations(f)}))

Rõ ràng trong Python 2, [*...]trả về a Syntax Errorvà kể từ khi permutationstrả về itertools.permutations object at 0x..., cách ngắn nhất tiếp theo (mà tôi biết) là trích xuất duy nhất hoán vị đang sử dụng {''.join(i)for i in permutations(f)}flà chuỗi đầu vào.

Cuối cùng, lưu ý rằng đây là cả hai hàm lambda và do đó phải được gọi theo định dạng print(<Function Name>(<Input String>)).


3

Toán học, 34 23 byte

Print@@@Permutations@#&

Đầu vào phải là một danh sách các ký tự.

Giải trình

Permutations@

Tìm tất cả các hoán vị của đầu vào, được sắp xếp và không trùng lặp.

Print@@@

In chúng từng cái một.



3

Perl 6 ,  49  44 byte

Chuỗi làm đầu vào

*.comb.permutations.sort».join.squish.map: *.put

Danh sách các ký tự làm đầu vào

*.permutations.sort».join.squish.map: *.put

Mở rộng

*\              # Whatever lambda
# .comb\        # split into a list of characters
.permutations\  # returns a list of lists
.sort\
».join\         # join the second level lists
.squish\        # remove adjacent repeated values
.map: *.put     # print each on its own line

2
mỗi lần tôi nhìn thấy 6 mã perl, tôi tự hỏi tại sao tôi chưa cài đặt nó
Gabriel Benamy

@GabrielBenamy Có một bot irc chạy mã Perl 6 trên #perl6kênh freenode.net .
Brad Gilbert b2gills

Bạn có thể làm ».saythay vì.map: *.put
Jo King

1
@JoKing Về mặt kỹ thuật ».sayđược phép thực hiện chúng theo bất kỳ thứ tự nào, và tại một thời điểm, nó đã được thực hiện ngoài trật tự.
Brad Gilbert b2gills


2

Trăn 3, 77 85 byte

Bây giờ sắp xếp!

import itertools as i
for a in sorted(set(i.permutations(input()))):print("".join(a))

1
Để rút ngắn điều này, bạn có thể làm from itertools import*trái ngược với import itertools as i. Bạn có thể lưu một byte bằng cách thay thế i.permutationsbằng permutations.
0WJYxW9FMN

Sử dụng {*...}thay vì set(...)tiết kiệm cho bạn thêm hai byte.
Movatica

2

PowerShell v3 +, 171 byte

param([char[]]$x)$a,$b=$x;$a=,$a;while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}$a|?{$_.length-eq$x.count}|sort -u

PowerShell v3 đã giới thiệu -Uniquecờ trênSort-Object lệnh ghép ngắn, do đó, nó ngắn hơn một vài byte so với phiên bản v2 dưới đây, vì Selecttrước tiên chúng ta không cần .

phiên bản v2, 178 byte:

param([char[]]$x)$a,$b=$x;$a=,$a;while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}$a|?{$_.length-eq$x.count}|select -u|sort

PowerShell không có bất kỳ hoán vị tích hợp nào, vì vậy tôi đã mượn mã của mình từ Prime Factors Buddies và điều chỉnh một chút để sử dụng ở đây.

Đây thực chất là ba phần, tôi sẽ mở rộng bên dưới.

param([char[]]$x)$a,$b=$x;$a=,$aĐưa đầu vào $x, biến nó thành một char-array, loại bỏ chữ cái đầu tiên $avà phần còn lại vào $b, sau đó tái diễn $athành một mảng với toán tử dấu phẩy.

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Các vòng lặp thông qua các chữ cái còn lại ( $b), mỗi lần lặp lấy chữ cái tiếp theo và lưu nó vào $zvà để lại phần còn lại $b, sau đó nối $achuỗi vào kết quả gửi $aqua vòng lặp của chính nó - mỗi mục của $a(được lưu trữ tạm thời $c) được lặp lại riêng của nó .length, và sau đó $zđược chèn vào mọi vị trí, bao gồm cả chuẩn bị và nối thêm $z$c$c$z. Ví dụ, cho $c = '12'$z = '3', điều này sẽ dẫn đến'132','312','123' việc được nối lại thành $a.

Phần cuối cùng $a|?{$_.length-eq$x.count}|select -u|sortlấy từng phần tử $avà sử dụng Where-Objectmệnh đề để chỉ lọc ra những phần tử có cùng độ dài với chuỗi đầu vào, sau đó selectchỉ các -umục nique và cuối cùng sortlà các phần tử theo thứ tự bảng chữ cái. Các chuỗi kết quả là tất cả còn lại trên đường ống và đầu ra thông qua ngầm Write-Outputxảy ra khi hoàn thành chương trình.

PS C:\Tools\Scripts\golfing> .\alphabetically-permute-a-string.ps1 'PPCG'
CGPP
CPGP
CPPG
GCPP
GPCP
GPPC
PCGP
PCPG
PGCP
PGPC
PPCG
PPGC

Nếu bạn sẵn sàng đi 3.0 Bạn có thể đổi |select -u|sortsang |sort -u. Khá chắc chắn 2.0 không có điều đó.
Matt

@Matt Cảm ơn - bạn đã đúng. Điều đó đã được giới thiệu trong v3.
admBorkBork

2

JavaScript (ES6), 119 byte

f=(s,t=[...s].sort().join``,p=``)=>t?t.replace(/./g,(c,i)=>t.indexOf(c)==i?f(s,t.slice(0,i)+t.slice(i+1),p+c):``):p+`\n`

Trường hợp \nđại diện cho nhân vật dòng chữ mới. Câu trả lời của cổng @ ETHproduction để sử dụng chuỗi thay vì mảng. Đảo ngược đầu ra hoặc di chuyển dòng mới ở đầu, tiết kiệm 3 byte.


1

R, 113 byte

x=scan(,"");cat(sort(unique(apply(matrix(x[permute:::allPerms(l<-length(x))],,l),1,paste,collapse=""))),sep="\n")

Đọc đầu vào từ stdin. Các permutegói được giả thiết được cài đặt để gọi allPermschức năng.

Sẽ thêm một lời giải thích khi tôi đi làm về.


1

Java 302 300 byte

import java.util.*;class M{public static void main(String[]a){for(Object s:p(new TreeSet(),"",a[0]))System.out.println(s);}static Set p(Set l,String p,String s){int n=s.length(),i=0;if(n>1)for(;i<n;p(l,p+s.charAt(i),s.substring(0,i)+s.substring(++i,n)));else if(!l.contains(p+=s))l.add(p);return l;}}

Mã thử nghiệm & mã hóa:

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

import java.util.*;
class M{
  static Set p(Set l, String p, String s){
    int n = s.length(),
        i = 0;
    if(n > 1){
      for(; i < n; p(l, p + s.charAt(i), s.substring(0, i) + s.substring(++i, n)));
    } else if(!l.contains(p+=s)){
      l.add(p);
    }
    return l;
  }

  public static void main(String[] a){
    for(Object s : p(new TreeSet(), "", a[0])){
      System.out.println(s);
    }
  }
}

Đầu vào: kiểm tra
Đầu ra:

estt
etst
etts
sett
stet
stte
test
tets
tset
tste
ttes
ttse

1
Các hoán vị được cho là được sắp xếp theo thứ tự abc
Ikaros

@Ikaros Cảm ơn, nên sửa ngay.
Kevin Cruijssen

1

Vợt 82 byte

(sort(remove-duplicates(map list->string(permutations(string->list s)))) string<?)

Ung dung:

(define(f s)
 (sort
  (remove-duplicates
   (map
    list->string
    (permutations
     (string->list s))))
  string<?))

Kiểm tra:

(f "buzz")

Ouput:

'("buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub")


0

Ruby, 51 byte

->s{puts s.chars.permutation.map(&:join).uniq.sort}

Làm thế nào để chúng ta có thể chạy nó?
بارابابا

puts s.chars.permutation().map(&:join).uniq43 Byte
بارپابابا

Điều đó không hiệu quả. Bạn cần sắp xếp đầu ra và bạn không thể tham khảo smà không có định nghĩa trước.
Lee W

0

Trên thực tế , 8 byte

Gợi ý chơi golf chào mừng! Hãy thử trực tuyến!

;l@╨♂Σ╔i

Ungolfing

     Implicit input s.
;l   Get len(s).
@╨   Get all len(s)-length permutations of s.
♂Σ   Sum them all back into strings.
╔    uniq() the list of strings.
i    Flatten the list of strings.
     Implicit print the stack, separated by newlines.

0

Pip , 8 byte

7 byte mã, +1 cho -ncờ.

SSUQPMa

Lấy một chuỗi làm đối số dòng lệnh. Hãy thử trực tuyến!

Máy quét của Pip phá vỡ các chữ cái viết hoa thành các khối hai chữ cái. Vì vậy, mã này là SS UQ PM a--ie SortString(UniQue(PerMutations(a))), với alà dòng lệnh arg. Các -nĐảm bảo cờ danh sách kết quả là newline-tách ra. Thats tất cả để có nó.


0

K (oK) , 14 byte

Dung dịch:

?x@<x@:prm@#x:

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

Giải trình:

Sử dụng hàm hoán vị tích hợp, prmđể tạo các hoán vị độ dài của đầu vào, áp dụng các hoán vị này cho đầu vào, sắp xếp theo thứ tự abc và sau đó lấy các giá trị riêng biệt.

?x@<x@:prm@#x: / the solution
            x: / store input as x
           #   / count length of x
       prm@    / apply (@) function prm
    x@:        / apply indices to x and save result back into x
   <           / indices to sort ascending
 x@            / apply to x
?              / take distint


0

Japt v2.0a0 -R, 5 byte

á â n

Thử nó


ûlà phương pháp pas trung tâm; Tôi nghĩ bạn có ý đó n;)
Shaggy

@Shaggy Tôi chỉ cần đặt sortthanh tìm kiếm trong trình thông dịch của bạn và nhấp vào cái đầu tiên tôi tìm thấy. Nhưng ádường như đã cho mỗi hoán vị theo thứ tự chữ cái
Hiện thân của sự thiếu hiểu biết

Rất tiếc, đó là một lỗi đánh máy; nên ü. Tôi sẽ sửa nó vào ngày mai. Các hoán vị của "buzz" xảy ra được sắp xếp vì bản thân từ này là - ví dụ như thử với "zzub".
Xù xì

@Shaggy, tôi thấy, câu trả lời được cập nhật với n(dễ gõ hơn)
Hiện thân của sự thiếu hiểu biết


0

Ngao , 9 byte

p_D`Sq@~Q

Giải trình

          - Implicit Q = first input
p         - Print...
 _        - Sorted ascending value (alphabetical order)
  D       - Distinct from...
   `Sq    - Joined (map(q=>q.join(""))
      @~Q - Permutations of Q
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.