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)

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

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

œê»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

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.


Ambil daftar karakter, bukan string.
xnor


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.

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


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

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 ...


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


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.


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

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

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


2

Python 3, 77 85 byte

Sekarang macam!

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

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

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.


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.


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

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


0

Ruby, 51 byte

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

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.

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.


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


0

Japt v2.0a0 -R, 5 byte

á â n

Cobalah


û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

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
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.