Bir dizeye alfabetik olarak izin ver


27

Görev

Amacınız, kabul etmeyi seçmeniz durumunda, bir giriş dizesi (veya bir karakter dizisi) verildiğinde, o dizedeki harflerin olası her permütasyonunu veren bir program yazmaktır. Çıktım konusunda titizim, bu yüzden alfabetik olarak sıralanmamalı, kopyaları yok.

Örnek:

Giriş: buzz

Çıktı:

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

kurallar

  • Bu yani en kısa kod kazanır.
  • Her satırda sondaki boşluklar tamam
  • Son satırdan sonra tek bir yeni satıra izin verilir (ancak artık değil)

Çıkış formatı olabilir ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]mi?
Luis Mendo

Üzgünüm, dediğim gibi, titizim;) çıktılar liste biçiminde değil, ayrı satırlarda olmalıdır
Brian Gradin

Evet, bu mantıklı. (Benim CJam cevap itibaren bir bayt kaldırmak misin diye görmek istedim N*için p:-))
Luis Mendo

2
Sağlam bir ilk meydan okuma!
xnor

1
Çok fazla yerleşik!
Dan

Yanıtlar:


23

Jöle , 5 bayt

ṢŒ!QY

Çevrimiçi deneyin!

açıklama

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

26
Ve ... 100000 mesajımız var! Tebrikler!
ETHProductions,

1
@ETHproductions Heh! Teşekkürler! :-)
Luis Mendo 16:16

1
Benim tarafımdan da tebrikler :) @ETHproductions bu sonucu nasıl aldın? Ben sadece merak ediyorum ...
geisterfurz007 Bu kargaşayı durdur

5
@ geisterfurz007 Gönderinin altındaki "paylaş" bağlantısını tıklayın. URL’deki yayının kimliği var.
Martin Ender

1
Ah, ppcg'nin 100.000'inci yazı! Luis Mendo'nun zaten bu numarada olduğunu sanıyordum. Benim hatam. Açıklama için teşekkürler!
geisterfurz007 Dur bu kaos

12

05AB1E ,  4  3 bayt

Bir güncelleme beri, Güncelleme œEski sürümü kırdı
önerdiği gibi aynı zamanda bir bayt kurtardı Sihirli Ahtapot Urn .

œê»

Çevrimiçi deneyin!

açıklama

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

œê»mirassızlık için iyidir.
Magic Octopus Urn,

@ MagicOctopusUrn: Aslında her iki sürüm için de zorunludur, çünkü œşimdi her ikisinde de bir dize listesi döndürüyor.
Emigna


10

Python 3.5, 79 bayt

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

Girdiyi karakter listesi olarak alan ve yazdırırken çıkan bir işlev.

Mümkün olan her bir karakteri bir sonraki karakterini alfabetik olarak kalan farklı karakterlerden alfabetik olarak alarak ve devam eden çıktıya ekleyerek tekrarlı bir şekilde geçirir w. Ardından, bu karakter kaldırılmış olarak yineleniriz. Giriş boşaltıldıktan sonra yazdırırız w.


Dize değil, karakter listesinden alın.
xnor



6

Haskell, 46 bayt

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

Nimi sayesinde 2 bayt kaydedildi


1
İşlev için bir isme ihtiyacınız yoktur, bu nedenle bırakabilirsiniz f=.
nimi

5

J, 19 bayt

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

Test durumu

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

açıklama

Bu 4 tren:

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

Temelde:

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

Bence [:~.i.@!@#A./:~size birkaç bayt kaydetmek gerekir
mil

4

JavaScript (Firefox 30+), 129 124 bayt

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]

Yerleşik olmayan bir dil için hiç de fena değil ...


Bunu dizelerde çalışacak şekilde dönüştürdüm; sadece karakterleri sıralamak için 23 bayt almama rağmen hala 120 byte iş yaptım.
Neil

3

Python 3.5, 81 bayt:

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

Gerçekten ... 81 bayt sonraki en uzun cevap 48 bayt olduğunda ... . Bu golfü elimden geldiğince daha fazla deneyeceğim, ancak golf ipuçlarını hala çok takdir ediyorum.

Ayrıca, Python 2'de 86 baytta alabileceğim en kısa çözüm :

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

Görünüşe göre Python 2'de, a [*...]döndürür Syntax Errorve permutationsgeri döndüğünden itertools.permutations object at 0x..., benzersiz permütasyonları çıkarmanın bir sonraki en kısa yolu (bildiğim kadarıyla) giriş dizgisinin {''.join(i)for i in permutations(f)}nerede kullanılmasıdır f.

Son olarak, bunların her ikisinin de lambda işlevi olduğunu ve bu nedenle biçiminde çağrılması gerektiğini unutmayın print(<Function Name>(<Input String>)).


3

Mathematica, 34 23 bayt

Print@@@Permutations@#&

Giriş bir karakter listesi olmalıdır.

açıklama

Permutations@

Girişin tüm izinlerini, sıralanmış ve çoğaltılamaz olarak bulun.

Print@@@

Bunları birer birer yazdırın.


3

Brachylog , 9 bayt

:pfdo~@nw

Çevrimiçi deneyin!

açıklama

: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 bayt

Giriş olarak dize

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

Giriş olarak karakterlerin listesi

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

Expanded

*\              # 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
perl 6 kodunu her gördüğümde neden henüz
kurmadığımı

@GabrielBenamy freenode.net #perl6kanalında Perl 6 kodunu çalıştıran bir irc bot var .
Brad Gilbert,

Sen yapabilirsin ».sayyerine.map: *.put
Jo Kral

1
@JoKing Teknik ».sayolarak herhangi bir sırayla bunları yapmak için izin verilir ve bir anda bilerek sıra dışı yapıldı.
Brad Gilbert b2gills


2

Python 3, 77 85 bayt

Şimdi sıralar!

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

1
Bunu kısaltmak için from itertools import*, aksine yapabilirsiniz import itertools as i. Sen değiştirerek byte kaydetmek mümkün olurdu i.permutationstarafından permutations.
0WJYxW9FMN 16:16

{*...}Bunun yerine kullanmak set(...)size iki byte kazandırır.
movatica

2

PowerShell v3 +, 171 bayt

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, -Uniquebayrağı cmdlet'te tanıttı Sort-Object, bu yüzden Selectilk v2 sürümünden birkaç bayt daha kısa, çünkü ilk önce gerekmiyor .

v2 sürümü, 178 bayt:

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'de yerleşik izinler yok, bu yüzden kodumu Prime Factors Buddies'ten ödünç aldım ve burada kullanmak için hafifçe çimdikledim.

Bu, temelde aşağıda genişleyeceğim üç bölümdür.

param([char[]]$x)$a,$b=$x;$a=,$aGirdiyi alır $x, bir chardizi olarak atar , ilk harfi çıkarır $ave geri kalanını çıkarır $bve sonra $avirgül operatörüyle birlikte bir dizi olarak okunur .

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Kalan harflerin ( $b) ilmekleri, her bir sonraki mektubu alan ve $zkalanları içine alan ve kalanları bırakan her bir yineleme $b, sonradan kendi döngüsünden $agönderme sonucu üzerine birleştirme yapar $a- $a(geçici olarak depolanan $c) öğelerinin her biri üzerinden çevrilir. kendi .lengthsonra ve $zprepending ile ekleme dahil her pozisyonda, içine yerleştirilir $z$cve $c$z. Örneğin, $c = '12've için $z = '3'bu, '132','312','123'yeniden bir araya getirilmesine neden olacaktır $a.

Son bölüm $a|?{$_.length-eq$x.count}|select -u|sort, her öğeyi alır $ave Where-Objectyalnızca girdi dizesiyle aynı uzunluğa sahip olanları filtrelemek için yan tümce öğelerini kullanır , ardından selectyalnızca -unique öğelerini ve son olarak da sortalfabetik olarak öğelerini siler . Sonuçta ortaya çıkan dizgilerin tümü boru hattında bırakılır ve örtülü yoluyla çıktı Write-Outputprogram tamamlandığında gerçekleşir.

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

Eğer 3.0 gitmek için istekli iseniz değiştirebilirsiniz |select -u|sortiçin |sort -u. Tabii ki 2.0 buna sahip değil.
Matt

@Matt Teşekkürler - haklısın. Bu v3'te tanıtıldı.
AdmBorkBork,

2

JavaScript (ES6), 119 bayt

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`

Nerede \nliteral satır karakteri temsil eder. @ ETHproduction'ın dizeleri yerine dizeleri kullanma cevabı limanı. Çıktının tersine çevrilmesi veya takip eden yeni satırın başlangıcına taşınması, 3 bayt tasarrufu sağlar.


1

R, 113 bayt

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

Stdin'den girişi okur. permutePaket aramak için kurulacak varsayılır allPermsişlevi.

İşten eve döndüğümde bir açıklama ekleyeceğim.


1

Java 302 300 bayt

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

Ungolfed ve test kodu:

Burada dene.

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

Giriş: Test
Çıkışı:

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

1
Permütasyonların alfabetik olarak sıralanması gerekiyor
Ikaros

@Ikaros Teşekkürler, şimdi düzeltilmelidir.
Kevin Cruijssen

1

Raket 82 bayt

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

Ungolfed:

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

Test yapmak:

(f "buzz")

Çıkışı:

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


0

Ruby, 51 bayt

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

nasıl çalıştırabiliriz?
بارپابابا

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

Bu işe yaramıyor. Çıktıyı sıralamanız gerekir ve sönceden bir tanım olmadan başvuramazsınız.
Lee W

0

Aslında 8 bayt

Golf önerileri hoş geldiniz! Çevrimiçi deneyin!

;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 bayt

7 bayt kod, -nbayrak için +1 .

SSUQPMa

Bir dize komut satırı argümanı olarak alır. Çevrimiçi deneyin!

Pip'in tarayıcısı büyük harflerden oluşan harfleri iki harfli parçalara böler. Yani bu kod SS UQ PM a--ie SortString(UniQue(PerMutations(a))), akomut satırı argümanı ile . -nBayrak olmasını sağlar Sonuç listesi, yeni satır ayrılmış olan. Hepsi bu kadar.


0

K (oK) , 14 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

prmGirişin uzunluğu permütasyonları oluşturmak için yerleşik permütasyon fonksiyonunu kullanın, bu permütasyonları girişe uygulayın, alfabetik olarak sıralayın ve sonra farklı değerler alın.

?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 bayt

á â n

Dene


ûmerkez pas yöntemidir; Ben demek istedin n;)
Shaggy

@Shaggy Tercümanınızdaki arama çubuğuna girdim sortve bulduğum ilkini tıkladım. Ama ázaten her permütasyona alfabetik sıraya göre geliyor gibi görünüyor
Ignorance'ın

Oop, bu bir yazım hatası; olmalı ü. Yarın tamir ederim. "Buzz" ın permütasyonları sıralanır çünkü kelimenin kendisi - örneğin "zzub" ile deneyin.
Shaggy

@Shaggy, görüyorum, güncellenmiş yanıtla n(yazmak daha kolay)
Ignorance uygulaması


0

İstiridye , 9 bayt

p_D`Sq@~Q

açıklama

          - Implicit Q = first input
p         - Print...
 _        - Sorted ascending value (alphabetical order)
  D       - Distinct from...
   `Sq    - Joined (map(q=>q.join(""))
      @~Q - Permutations of Q
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.