За алфавітом перестановка рядка


27

Завдання

Ваша мета, якщо ви вирішите прийняти це, - написати програму, яка з урахуванням рядка введення (або масиву символів) видає всі можливі перестановки літер у цьому рядку. Я витончений зі своїм результатом, тому його слід сортувати за алфавітом, без дублікатів.

Приклад:

Вхід: buzz

Вихід:

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

Правила

  • Це тому найкоротший код виграє.
  • Пробіли на кожному / будь-якому рядку в порядку
  • Один новий рядок після останнього рядка дозволений (але не більше)

Чи може бути формат виводу ["buzz" "bzuz" "bzzu" "ubzz" "uzbz" "uzzb" "zbuz" "zbzu" "zubz" "zuzb" "zzbu" "zzub"]?
Луїс Мендо

Вибачте, як я вже згадував, я вибагливий;) Вихід повинен бути в окремих рядках, а не у форматі списку
Брайан Градін

Так, це має сенс. Я просто хотів побачити, чи можу я видалити один байт з моєї відповіді CJam ( N*на p) :-)
Луїс Мендо

2
Солідний перший виклик!
xnor

1
Стільки вбудованих!
Ден

Відповіді:


23

Желе , 5 байт

ṢŒ!QY

Спробуйте в Інтернеті!

Пояснення

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

26
І ... у нас 100000 постів! Вітаю!
ETHproductions

1
@ETHproductions Хе! Спасибі! :-)
Луїс Мендо

1
Вітаю і з мого боку :) @ETHproductions як ти дійшов до цього результату? Мені просто цікаво ...
geisterfurz007 Зупиніть цей хаос

5
@ geisterfurz007 Натисніть посилання "Поділитися" внизу публікації. Ідентифікатор публікації в URL-адресі.
Мартін Ендер

1
О, так це 100-тисячний пост ppcg! Я думав, що Луїс Мендо вже був у цьому числі. Моє ліжко. Дякую за пояснення!
geisterfurz007 Зупиніть цей хаос

12

05AB1E ,  4  3 байти

Оновлено, оскільки оновлення œзламало стару версію,
яка також зберегла байт, як запропонував Magic Octopus Urn .

œê»

Спробуйте в Інтернеті!

Пояснення

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

œê»штрафується за ненасилля.
Чарівна урва восьминога

@MagicOctopusUrn: Фактично потрібно для обох версій, оскільки œтепер повертає список рядків в обох.
Емінья


10

Python 3,5, 79 байт

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

Функція, яка приймає введення як список символів та виводить друк.

Рекурсивно робить кожну окрему перестановку, виводячи кожен можливий наступний символ в алфавітному порядку з решти окремих символів і додаючи його до результату, який виконується w. Потім ми повторюємо видалення цього символу. Як тільки введення спорожняється, ми друкуємо w.


Візьміть список знаків, а не рядок.
xnor


8

Pyth - 5 байт

jS{.p

Спробуйте його онлайн тут .

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

Це Sсправді потрібно?
Луїс Мендо

@LuisMendo Це потрібно, якщо введення ще не відсортовано.
isaacg

1
@isaacg Дякую! Я щойно зрозумів, що мені це потрібно і в моїй відповіді «Желе»
Луїс Мендо

@LuisMendo скрізь.
Мальтісен

6

Haskell, 46 байт

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

2 байти збережено завдяки німі


1
Вам не потрібне ім’я для функції, тому ви можете кинути це f=.
німі

5

J, 19 байт

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

Тестовий випадок

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

Пояснення

Це 4-поїзд:

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

В основному:

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

Думаю, вам [:~.i.@!@#A./:~слід заощадити кілька байтів
миль

4

JavaScript (Firefox 30+), 129 124 байт

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]

Не надто погано для мови без вбудованих перестановок ...


Я перетворив це для роботи на рядках; незважаючи на те, що я взяв 23 байти лише для сортування символів, я все-таки виконав роботу в 120 байт.
Ніл

3

Python 3,5, 81 байт:

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

Дійсно ... 81 байт, коли наступна найдовша відповідь - 48 байт ... зітхання . Що ж, я спробую цей гольф більше, наскільки я можу, але поради щодо гольфу все ще дуже цінуються.

Крім того, ось найкоротше рішення, яке я міг отримати в Python 2 на 86 байт :

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

Мабуть, в Python 2 [*...]повертає a Syntax Error, а оскільки permutationsповертається itertools.permutations object at 0x..., наступним найкоротшим способом (що я знаю) вилучення унікальних перестановок є використання {''.join(i)for i in permutations(f)}де fвхідного рядка.

Нарешті, зауважте, що це обидві лямбда-функції, і тому їх потрібно викликати у форматі print(<Function Name>(<Input String>)).


3

Математика, 34 23 байти

Print@@@Permutations@#&

Вхід повинен містити список символів.

Пояснення

Permutations@

Знайдіть усі перестановки введення, відсортовані та без дублікатів.

Print@@@

Роздрукуйте їх по черзі.



3

Perl 6 ,  49  44 байт

Рядок як вхід

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

Список символів як введення

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

Розширено

*\              # 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, мені цікаво, чому я його ще не встановив
Габріель Бенамі

@GabrielBenamy На #perl6каналі freenode.net є бот irc, який запускає код Perl 6 .
Бред Гілберт b2gills

Можна зробити ».sayзамість.map: *.put
Jo King

1
@JoKing Технічно ».sayдозволено робити їх у будь-якому порядку, і свого часу це було навмисно зроблено поза порядком.
Бред Гілберт b2gills


2

Python 3, 77 85 байт

Тепер сортування!

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

1
Щоб скоротити це, ви могли б зробити from itertools import*на відміну від import itertools as i. Ви зможете зберегти байт, замінивши i.permutationsна permutations.
0WJYxW9FMN

Використання {*...}замість цього set(...)економить ще два байти.
movatica

2

PowerShell v3 +, 171 байт

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 представив -Uniqueпрапор на Sort-Objectcmdlet, тому він на кілька байтів коротший, ніж нижченаведена версія v2, оскільки нам не потрібноSelect .

версія v2, 178 байт:

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 немає вбудованих перестановок, тому я запозичив свій код у Prime Factors Buddies і трохи підкоригував його для використання тут.

Це, по суті, три частини, які я розкрию нижче.

param([char[]]$x)$a,$b=$x;$a=,$aЗаймає введення $x, charпередає його як- масив, знімає першу букву в, $aа решту - $b, а потім переглядає $aяк масив із оператором коми.

while($b){$z,$b=$b;$a+=$a|%{0..($y=($c="$_").Length)|%{-join($c[0..$_]+$z+$c[++$_..$y])};"$z$c";"$c$z"}}Проведіть цикл через інші літери ( $b), кожна ітерація приймає наступний лист і зберігає його в нього, $zа решту залишає в ньому $b, а потім об'єднує масив на $aрезультат надсилання $aчерез його власний цикл - кожен елемент $a(тимчасово зберігається в $c) перекидається на його власне .length, а потім $zвставляється у кожну позицію, включаючи попереднє додавання та додавання до $z$cта $c$z. Наприклад, для $c = '12'і $z = '3', це призведе до '132','312','123'об'єднання назад у $a.

Кінцева частина $a|?{$_.length-eq$x.count}|select -u|sortзаймає кожен елемент $aта використовує Where-Objectпункт для фільтрації лише тих, які мають ту саму довжину, що і вхідна рядок, потім selects лише -unique елементи і, нарешті, sorts в алфавітному порядку. Отримані рядки залишаються на конвеєрі, а вихід через неявні Write-Outputвідбувається після завершення програми.

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

Якщо ви бажаєте перейти на 3.0, ви можете перейти |select -u|sortна |sort -u. Досить впевнений, що 2.0 не має цього.
Мт

@Matt Спасибі - ти маєш рацію. Це було представлено у v3.
AdmBorkBork

2

JavaScript (ES6), 119 байт

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`

Де \nпредставляє буквальний символ нового рядка. Порт відповіді @ ETHproduction використовувати рядки замість масивів. Зворотний результат або переміщення нижньої лінії на початок економить 3 байти.


1

R, 113 байт

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

Читає дані від stdin. Передбачається, що permuteпакет встановлений для виклику allPermsфункції.

Додамо пояснення, коли я повернуся з роботи додому.


1

Java 302 300 байт

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

Невикористаний і тестовий код:

Спробуйте тут.

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

Вхід: тест
Вихід:

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

1
Перестановки повинні бути сортовані за алфавітом
Ікарос

@Ikaros Спасибі, слід виправити зараз.
Kevin Cruijssen

1

Ракетка 82 байти

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

Безголівки:

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

Тестування:

(f "buzz")

Вихід:

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


0

Рубі, 51 байт

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

як ми можемо це запустити?
بارپابابا

puts s.chars.permutation().map(&:join).uniq43 байт
بارپابابا

That doesn't work. You need to sort the output, and you can't refer to s without prior definition.
Lee W

0

Actually, 8 bytes

Golfing suggestions welcome! Try it online!

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

7 bytes of code, +1 for -n flag.

SSUQPMa

Takes a string as a command-line argument. Try it online!

Pip's scanner breaks runs of uppercase letters into two-letter chunks. So this code is SS UQ PM a--i.e. SortString(UniQue(PerMutations(a))), with a being the command-line arg. The -n flag ensures the result list is newline-separated. That's all there is to it.


0

K (oK), 14 bytes

Solution:

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

Try it online!

Explanation:

Use the built-in permutation function, prm, to generate permutations of length of the input, apply these permutations to the input, sort alphabetically and then take distinct values.

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

á â n

Try it


û is the centre pas method; I think you meant n ;)
Shaggy

@Shaggy I just put sort in the searchbar in your interpreter and clicked the first one I found. But á seems to give each permutation in alphabetic order already
Embodiment of Ignorance

Oop, that's a typo; should be ü. I'll fix it tomorrow. The permutations of "buzz" happen to be sorted because the word itself is - try it with "zzub" instead, for example.
Shaggy

@Shaggy, I see, updated answer with n (it's easier to type)
Embodiment of Ignorance


0

Clam, 9 bytes

p_D`Sq@~Q

Explanation

          - Implicit Q = first input
p         - Print...
 _        - Sorted ascending value (alphabetical order)
  D       - Distinct from...
   `Sq    - Joined (map(q=>q.join(""))
      @~Q - Permutations of Q
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.