Abjad mengubah string

27

Tugas

Tujuan Anda, jika Anda memilih untuk menerimanya, adalah untuk menulis sebuah program, yang, diberi string input (atau array karakter), menampilkan setiap kemungkinan permutasi dari huruf-huruf dalam string itu. Saya rewel dengan hasil saya, jadi harus diurutkan berdasarkan abjad, tanpa duplikat.

Contoh:

Memasukkan: buzz

Keluaran:

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

Aturan

  • Ini adalah sehingga kode terpendek menang.
  • Mengejar spasi pada setiap baris apa pun tidak masalah
  • Satu baris baru setelah baris terakhir diizinkan (tetapi tidak lebih)
Brian Gradin
sumber
Bisakah format output ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]?
Luis Mendo
Maaf, seperti yang saya sebutkan, saya rewel;) output harus pada baris yang terpisah, bukan dalam format daftar
Brian Gradin
Ya, itu masuk akal. Saya hanya ingin melihat apakah saya dapat menghapus satu byte dari jawaban CJam saya ( N*untuk p) :-)
Luis Mendo
2
Tantangan pertama yang solid!
xnor
1
Begitu banyak bawaan!
Dan

Jawaban:

23

Jelly , 5 byte

ṢŒ!QY

Cobalah online!

Penjelasan

Ṣ         Sort
 Œ!       All permutations
   Q      Unique
    Y     Join by linefeeds
Luis Mendo
sumber
26
Dan ... kami memiliki 100000 posting! Selamat!
ETHproduk
1
@ ETHproduk Heh! Terima kasih! :-)
Luis Mendo
1
Selamat dari pihak saya juga :) @ETHproductions bagaimana Anda mendapatkan hasil itu? Saya hanya ingin tahu ...
geisterfurz007 Hentikan kekacauan ini
5
@ geisterfurz007 Klik tautan "bagikan" di bagian bawah pos. Itu memiliki ID posting di URL.
Martin Ender
1
Oh, jadi itu adalah pos ke-100000 ppcg! Saya pikir Luis Mendo sudah di nomor itu. Salahku. Terima kasih untuk penjelasannya!
geisterfurz007 Hentikan kekacauan ini
12

05AB1E ,  4  3 byte

Diperbarui, sejak pembaruan untuk œmemecahkan versi lama,
yang juga menyimpan byte seperti yang disarankan oleh Magic Octopus Mm .

œê»

Cobalah online!

Penjelasan

œ     # get all permutations of input
 ê    # sort and remove duplicates
  »   # join list by newlines
Emigna
sumber
œê»baik untuk non-warisan.
Magic Octopus Guci
@ MagicOctopusUrn: Ini sebenarnya diperlukan untuk kedua versi karena œsekarang mengembalikan daftar string di keduanya.
Emigna
10

MATL , 4 byte

Y@Xu

Cobalah online!

Penjelasan

Y@    % Implicit input. Push 2D array of all permutations, each on a row, sorted
Xu    % Unique rows. Implicitly display
Luis Mendo
sumber
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)

Fungsi yang mengambil input sebagai daftar karakter dan output dengan mencetak.

Secara rekursif membuat setiap permutasi yang berbeda dengan mengambil setiap karakter berikutnya yang mungkin secara abjad dari karakter yang berbeda yang tersisa, dan menambahkannya ke output yang sedang berlangsung w. Kemudian, kami berulang dengan karakter ini dihapus. Setelah input dikosongkan, kami mencetak w.

Tidak
sumber
Ambil daftar karakter, bukan string.
xnor
10

CJam , 5 byte

Terima kasih kepada @EriktheOutgolfer untuk koreksi ( qbukan r)

qe!N*

Cobalah online!

Penjelasan

q        e# Read input as a string
 e!      e# Unique permutations, sorted
   N*    e# Join by newline. Implicitly display
Luis Mendo
sumber
8

Pyth - 5 byte

jS{.p

Cobalah online di sini .

j        Join. Implictly joins on newlines.
 S       Sort
  {      Uniquify
   .p    All permutations, implicitly run on input.
Maltysen
sumber
Apakah Sbenar-benar dibutuhkan?
Luis Mendo
@LuisMendo Diperlukan jika input belum diurutkan.
isaacg
1
@isaacg Terima kasih! Saya baru sadar bahwa saya membutuhkan itu dalam jawaban Jelly saya juga
Luis Mendo
@LuisMendo whoops.
Maltysen
6

Haskell, 46 byte

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

2 byte disimpan berkat nimi

poi830
sumber
1
Anda tidak memerlukan nama untuk fungsi tersebut, sehingga Anda dapat menghapusnya f=.
nimi
5

J, 19 byte

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

Kasus cobaan

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

Penjelasan

Ini adalah kereta 4:

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

Pada dasarnya:

/:~@~.@:{~!@#A.&i.#
          !  A.&     get permutations
           @#   i.#  of range (0..length)
        {~           map indices to chars in string
      @:             then
    ~.               unique
   @                 then
/:~                  sort
Conor O'Brien
sumber
Saya pikir [:~.i.@!@#A./:~akan menghemat beberapa byte
mil
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]

Tidak terlalu buruk untuk bahasa tanpa permutasi bawaan ...

Produksi ETH
sumber
Saya mengonversikan ini untuk beroperasi pada string; meskipun mengambil 23 byte hanya untuk mengurutkan karakter agar saya masih mendapatkan pekerjaan dalam 120 byte.
Neil
3

Python 3.5, 81 byte:

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

Sungguh ... 81 byte ketika jawaban terpanjang berikutnya adalah 48 byte ... huh . Yah, saya akan mencoba golf ini sebanyak yang saya bisa, tetapi tips golf masih sangat dihargai.

Juga, berikut ini adalah solusi terpendek yang saya dapat dalam Python 2 pada 86 byte :

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

Rupanya dalam Python 2, [*...]mengembalikan a Syntax Error, dan karena permutationskembali itertools.permutations object at 0x..., cara terpendek berikutnya (yang saya tahu) mengekstraksi permutasi unik adalah menggunakan di {''.join(i)for i in permutations(f)}mana fstring input.

Akhirnya, perhatikan bahwa keduanya adalah fungsi lambda dan karenanya harus dipanggil dalam format print(<Function Name>(<Input String>)).

R. Kap
sumber
3

Mathematica, 34 23 byte

Print@@@Permutations@#&

Input harus berupa daftar karakter.

Penjelasan

Permutations@

Temukan semua permutasi dari input, diurutkan dan bebas duplikat

Print@@@

Cetak satu per satu.

JungHwan Min
sumber
3

Brachylog , 9 byte

:pfdo~@nw

Cobalah online!

Penjelasan

:pf         Find all outputs of p - Permute with the main Input as input
   d        Remove Duplicates
    o       Order
     ~@n    Concatenate into a single string with linebreaks as separator
        w   Write to STDOUT
Fatalisasi
sumber
3

Perl 6 ,  49  44 byte

String sebagai input

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

Daftar karakter sebagai input

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

Diperluas

*\              # 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
Brad Gilbert b2gills
sumber
2
setiap kali saya melihat kode perl 6, saya bertanya-tanya mengapa saya belum menginstalnya
Gabriel Benamy
@GabrielBenamy Ada bot irc yang menjalankan kode Perl 6 pada #perl6saluran freenode.net .
Brad Gilbert b2gills
Anda dapat melakukan ».sayalih - alih.map: *.put
Jo King
1
@JoKing Secara teknis ».saydiizinkan untuk melakukannya dalam urutan apa pun, dan pada satu waktu sengaja dilakukan rusak.
Brad Gilbert b2gills
3

Brachylog (v2), 5 byte

pᵘoẉᵐ

Cobalah online!

Cari nique permutations input, s ort mereka, ap riteln (write dengan newline) lebih array.

sundar - Pasang kembali Monica
sumber
2

Python 3, 77 85 byte

Sekarang macam!

import itertools as i
for a in sorted(set(i.permutations(input()))):print("".join(a))
Aryaman
sumber
1
Untuk mempersingkat ini, Anda bisa melakukan from itertools import*sebaliknya import itertools as i. Anda dapat menyimpan byte dengan menggantinya i.permutationsdengan permutations.
0WJYxW9FMN
Menggunakan {*...}bukannya set(...)menghemat dua byte lagi.
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 memperkenalkan -Uniqueflag pada Sort-Objectcmdlet, jadi beberapa byte lebih pendek dari versi v2 di bawah ini, karena kita tidak perlu Selectterlebih dahulu.

versi 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 tidak memiliki permutasi bawaan, jadi saya meminjam kode saya dari Prime Factors Buddies dan sedikit mengubahnya untuk digunakan di sini.

Ini pada dasarnya adalah tiga bagian, yang akan saya bahas di bawah ini.

param([char[]]$x)$a,$b=$x;$a=,$aMengambil input $x, melemparkannya sebagai char-array, melepas huruf pertama ke dalam $adan sisanya ke dalam $b, dan kemudian menyusun kembali$a sebagai array dengan koma-operator.

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Loop melalui huruf-huruf yang tersisa ( $b), setiap iterasi mengambil huruf berikutnya dan menyimpannya ke dalam $zdan meninggalkan sisanya di $b, kemudian array-concatenating ke $ahasil pengiriman $amelalui loop sendiri - setiap item $a(disimpan sementara ke dalam $c) dilingkarkan miliknya sendiri .length, dan kemudian $zdimasukkan ke dalam setiap posisi, termasuk menambahkan dan menambahkan dengan $z$cdan $c$z. Misalnya, untuk $c = '12'dan $z = '3', ini akan mengakibatkan '132','312','123'digabungkan kembali ke $a.

Bagian terakhir $a|?{$_.length-eq$x.count}|select -u|sortmengambil setiap elemen $adan menggunakan Where-Objectklausa untuk menyaring hanya mereka yang memiliki panjang yang sama dengan string input, kemudian selecthanya -uitem unik, dan akhirnya sortadalah mereka berdasarkan abjad. String yang dihasilkan semuanya ditinggalkan di pipa, dan output melalui implisit Write-Outputterjadi pada penyelesaian program.

PS C:\Tools\Scripts\golfing> .\alphabetically-permute-a-string.ps1 'PPCG'
CGPP
CPGP
CPPG
GCPP
GPCP
GPPC
PCGP
PCPG
PGCP
PGPC
PPCG
PPGC
AdmBorkBork
sumber
Jika Anda ingin pergi 3.0 Anda dapat mengubah |select -u|sortke |sort -u. Cukup yakin 2,0 tidak memilikinya.
Matt
@ Matt Terima kasih - Anda benar. Itu diperkenalkan di 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`

Dimana \n mewakili karakter baris baru literal. Port of @ ETHproduksi menjawab untuk menggunakan string, bukan array. Membalikkan output, atau memindahkan baris baru ke awal, menghemat 3 byte.

Neil
sumber
1

R, 113 byte

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

Membaca input dari stdin. Itupermute paket diasumsikan untuk diinstal dalam rangka untuk memanggilallPerms fungsi.

Akan menambahkan penjelasan saat saya pulang kerja.

Billywob
sumber
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;}}

Tidak digabungkan & kode uji:

Coba di sini.

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

Input: uji
Output:

estt
etst
etts
sett
stet
stte
test
tets
tset
tste
ttes
ttse
Kevin Cruijssen
sumber
1
Permutasi seharusnya diurutkan berdasarkan abjad
Ikaros
@Ikaros Terima kasih, harus diperbaiki sekarang.
Kevin Cruijssen
1

Racket 82 byte

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

Tidak Disatukan:

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

Pengujian:

(f "buzz")

Ouput:

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

Groovy, 69 Bytes

{(it as List).permutations().unique().sort().each{println it.join()}}
Guci Gurita Ajaib
sumber
0

Ruby, 51 byte

->s{puts s.chars.permutation.map(&:join).uniq.sort}
Lee W
sumber
bagaimana kita bisa menjalankannya?
بارپابابا
puts s.chars.permutation().map(&:join).uniq43 Byte
بارپابابا
Itu tidak berhasil. Anda perlu mengurutkan output, dan Anda tidak dapat merujuk stanpa definisi sebelumnya.
Lee W
0

Sebenarnya , 8 byte

Selamat datang saran bermain golf! Cobalah online!

;l@╨♂Σ╔i

Tidak melakukanolf

     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.
Sherlock9
sumber
0

Pip , 8 byte

7 byte kode, +1 untuk -nbendera.

SSUQPMa

Mengambil string sebagai argumen baris perintah. Cobalah online!

Pemindai Pip memecah huruf besar menjadi potongan dua huruf. Jadi kode ini SS UQ PM a--ie SortString(UniQue(PerMutations(a))), dengan amenjadi baris perintah arg. The -nbendera memastikan daftar hasil adalah baris baru-dipisahkan. Itu semua yang ada untuk itu.

DLosc
sumber
0

K (oK) , 14 byte

Larutan:

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

Cobalah online!

Penjelasan:

Gunakan fungsi permutasi bawaan prm,, untuk menghasilkan permutasi panjang input, terapkan permutasi ini ke input, urutkan secara abjad dan kemudian ambil nilai yang berbeda.

?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
streetster
sumber
0

Perl 5 -MList::Util=uniq -F , 68 byte

$"=',';@b=sort@F;map{say if"@b"eq join$",sort/./g}uniq glob"{@b}"x@b

Cobalah online!

Xcali
sumber
0

Japt v2.0a0 -R, 5 byte

á â n

Cobalah

Perwujudan Ketidaktahuan
sumber
ûadalah metode pusat pas; Saya pikir Anda maksud n;)
Shaggy
@ Shaggy Saya baru saja memasukkan bilah pencarian sortdi juru bahasa Anda dan mengklik yang pertama saya temukan. Tetapi átampaknya memberikan setiap permutasi dalam urutan abjad
Perwujudan Ketidaktahuan
Oop, itu salah ketik; seharusnya ü. Saya akan memperbaikinya besok. Permutasi "buzz" kebetulan disortir karena kata itu sendiri - coba saja dengan "zzub", misalnya.
Shaggy
@Shaggy, saya mengerti, jawaban yang diperbarui dengan n(lebih mudah untuk mengetik)
Perwujudan Ketidaktahuan
0

C ++ (gcc) , 132 128 byte

#include<bits/stdc++.h>
using namespace std;int main(){string s;for(cin>>s;cout<<s<<endl,next_permutation(s.begin(),s.end()););}

Cobalah online!

movatica
sumber
0

Clam , 9 byte

p_D`Sq@~Q

Penjelasan

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