В алфавитном порядке переставить строку


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 сообщений! Congrats!
ETHproductions

1
@ETHproductions Хех! Благодарность! :-)
Луис Мендо

1
Поздравляю и с моей стороны :) @ETHproductions, как вы достигли этого результата? Мне просто любопытно ...
geisterfurz007 Останови этот хаос

5
@ geisterfurz007 Нажмите ссылку "поделиться" внизу поста. Это имеет идентификатор сообщения в URL.
Мартин Эндер

1
О, так это 100000-й пост 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 Это необходимо, если вход еще не отсортирован.
Исаак

1
@isaacg Спасибо! Я только что понял, что мне нужно это в моем ответе желе, а также
Луис Мендо

@ LuisMendo упс.
Maltysen

6

Haskell, 46 байтов

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

2 байта сохранены благодаря nimi


1
Вам не нужно имя для функции, поэтому вы можете удалить f=.
Nimi

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

Mathematica, 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 Существует IRC-бот, который запускает код Perl 6 на канале freenode.net #perl6.
Брэд Гилберт b2gills

Вы можете сделать ».sayвместо.map: *.put
Джо Кинг

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(...)экономит вам еще два байта.
Моватика

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-Objectкомандлет, поэтому он на несколько байтов короче, чем в версии 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преобразует их как -array, удаляет первую букву, $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 только -uуникальные элементы и, наконец, sortте в алфавитном порядке. Все полученные строки остаются в конвейере, а вывод через неявный 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")

Читает ввод из стандартного ввода. Предполагается, что 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;}}

Ungolfed & тестовый код:

Попробуй это здесь.

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 Спасибо, сейчас надо исправить.
Кевин Круйссен

1

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

(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<?))

Тестирование:

(f "buzz")

Ouput:

'("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 байта
بارپابابا

Это не работает Вам нужно отсортировать вывод, и вы не можете ссылаться sбез предварительного определения.
Ли W

0

На самом деле , 8 байт

Предложения по игре в гольф приветствуются! Попробуйте онлайн!

;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

Пип , 8 байт

7 байтов кода, +1 за -nфлаг.

SSUQPMa

Принимает строку в качестве аргумента командной строки. Попробуйте онлайн!

Сканер Пипа разбивает серии заглавных букв на две буквы. Итак, этот код SS UQ PM a--ie SortString(UniQue(PerMutations(a))), с aаргументом командной строки arg. В -nфлаге обеспечивает список результата новая строка , разделенная. Это все, что нужно сделать.


0

K (ок) , 14 байтов

Решение:

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

Попробуйте онлайн!

Объяснение:

Используйте встроенную функцию перестановки prm, чтобы генерировать перестановки длины ввода, применять эти перестановки к вводу, сортировать по алфавиту и затем принимать различные значения.

?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 байт

á â n

Попытайся


ûметод центра па; Я думаю, что вы имели в виду n;)
Лохматый

@ Shaggy Я просто вставил sortпанель поиска в ваш переводчик и нажал первую найденную мной. Но, áпохоже, каждая перестановка приведена в алфавитном порядке
Воплощение неведения

Ой, это опечатка; должно быть ü. Я исправлю это завтра. Перестановки «гудения» оказываются отсортированными, потому что само слово есть - попробуйте вместо этого «zzub», например.
лохматый

@ Shaggy, я вижу, обновленный ответ с n(легче набрать)
Воплощение невежества


0

Моллюск , 9 байт

p_D`Sq@~Q

объяснение

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