Знайдіть усі Анаграми!


17

Незважаючи на те, що в 17-ти записках є , у нас все ще немає цього питання, тому ось воно.

Ваше завдання

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

Вхідні дані

Ви можете прийняти рядок, який може бути будь-якої довжини> 0, будь-яким стандартним способом введення. Він може містити будь-які символи ASCII.

Вихідні дані

Ви можете вивести всі можливі анаграми введеного рядка будь-яким стандартним способом. Ви не повинні виводити один і той же рядок двічі або виводити рядок, рівний вхідному.

Інші правила

Стандартні лазівки заборонені

Оцінка балів

Це , виграє найменше байт.


Чи можемо ми дотримуватися звичайного стандарту "програма чи функція"?
Джонатан Аллан

@JonathanAllan Я думаю, якщо це прямо не зазначено, ви можете надіслати програму чи функцію. Я, як правило, залишав це неявним у своїх питаннях без проблем
Digital Trauma

Так, звичайно або програма, або функція будуть працювати нормально.
Грифон


@gryphon як ти редагуєш речі
Foxy

Відповіді:


10

05AB1E , 3 байти

œÙ¦

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

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

Як?

    - push input
œ   - pop and push a list of all permutations (input appears at the head)
 Ù  - pop and push a list of unique items (sorted by first appearance)
  ¦ - pop and push a dequeued list (removes the occurrence of the input)
    - As a full program: implicit print of the top of the stack

Якщо б не здогадувались, 05AB1E буде надмірно коротким.
Грифон

4

Рубін , 45 байт

->x{(x.chars.permutation.map(&:join)-[x])|[]}

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

Незважаючи на наявність вбудованого, слово "перестановка" дійсно довге :(


|[]Здається непотрібним?
canhascodez

@sethrin, не зовсім. Специфікація каже, що дублікати потрібно видалити. |[]коротше, ніж .uniq.
ymbirtt

3

MATL , 7 байт

tY@1&X~

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

Пояснення

t     % Implicitly input a string, say of length n. Duplicate
Y@    % All permutations. May contain duplicates. Gives a 2D char array of 
      % size n!×n with each permutation in a row
1&X~  % Set symmetric difference, row-wise. Automatically removes duplicates.
      % This takes the n!×n char array and the input string (1×n char array)
      % and produces an m×n char array containing the rows that are present 
      % in exactly one of the two arrays
      % Implicitly display

3

піт , 8 4

-{.p

Інтернет-тест .

  .pQ     # all permutations of the (implicit) input string
 {        # de-duplicate
-    Q    # subtract (implicit) input

Відмінна робота з гольфу. Вітаю із зав’язкою дуже вражаючої відповіді 05AB1E.
Грифон

1
Вибачте, але це виводить один і той же рядок двічі, якщо є один і той же символ на вході два рази. Виправте це.
Грифон

Дякуємо, що це виправили. Дуже погано з цього приводу, збільшивши кількість байтів.
Грифон

Я придумав таку ж відповідь, але також забув зняти копію. Великі уми мислять однаково?
Tornado547

3

Japt , 6 байт

á â kU

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

Пояснення

 á â kU
Uá â kU   // Ungolfed
          // Implicit: U = input string
Uá        // Take all permutations of U.
   â      // Remove duplicates.
     kU   // Remove U itself from the result.
          // Implicit: output resulting array, separated by commas

Вітаю за крадіжку виграшу. +1
Грифон

1
@Gryphon Не так швидко, я був би шокований, якщо це не 3 байти в 05AB1E ...
ETHproductions

Я мав на увазі поки що. Це не так, як я позначаю тебе як прийнятого.
Грифон

Якщо @Dennis зробить це в Jelly, це, ймовірно, буде як 2 байти. Не просто перевершує Денніс.
Грифон

1
3-байтне передбачення було добре, але чи є 2 ?!
Джонатан Аллан

3

Haskell, 48 40 байт

import Data.List
a=tail.nub.permutations

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

Збережено 8 байт завдяки tailпідказці Лео .


2
Ви можете використовувати tailзамість delete x, оскільки початковий рядок завжди буде першим у списку перестановок. Це дозволить вам перейти до точкового рішення, а потім до безіменної функції, багато байтів, які потрібно зберегти!
Лев

@Leo Чудово, дякую!
Крістіан Лупаску

2

CJam , 8 байт

l_e!\a-p

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

Пояснення

l    e# Read string from input
_    e# Duplicate
e!   e# Unique permutations. Gives a list of strings
\    e# Swap
a    e# Wrap in a singleton array
-    e# Set difference. This removes the input string
p    e# Pretty print the list

@JonathanAllan Спасибі, виправлено
Луїс Мендо

@Gryphon Ну, 7 після дуже пристойного виправлення Джонатана ;-)
Луїс Мендо

Зараз я відповів на це питання.
Грифон

Гм, TIO все ще виводить оригінальний рядок для мене?
Грифон

@Gryphon Вибачте, це має працювати зараз. Я очевидно занадто втомився за це; лягати спати :-P
Луїс Мендо

2

Математика, 47 байт

Drop[StringJoin/@Permutations[Characters@#],1]&

Я чекав одного з таких, але я був майже впевнений, що перемогти не збирається. Ніби не здивований, що тут побудовано не одне.
Грифон

StringJoin/@Rest@Permutations@Characters@#&становить 43 байти.
jcai

2

Желе , 4 байти

Œ!QḊ

Монадічне посилання, що містить список символів та повертає список списків символів - усі чіткі анаграми, які не дорівнюють вводу.

Спробуйте в Інтернеті! (нижній колонтитул формує програму, яка приєднується до списку новими рядками та друкує, щоб уникнути інакше розбитого подання).

Як?

Œ!QḊ - Link: list of characters     e.g. "text"
Œ!   - all permutations of the list      ["text","tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","extt","ettx","etxt","xtet","xtte","xett","xett","xtte","xtet","ttex","ttxe","tetx","text","txte","txet"]
  Q  - de-duplicate                      ["text","tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","xtet","xtte","xett"]
   Ḋ - dequeue (the first one = input)          ["tetx","txet","txte","ttex","ttxe","etxt","ettx","extt","xtet","xtte","xett"]

Вражає. Чи буде пояснення, бо я не желе?
Грифон

Так, звісно!
Джонатан Аллан

Я знімав це ще віки тому, тому чому у мене був "(4?)" У заголовку та текст про видалення, Yякщо функції були дозволені ... Я бачу, що ви просто змінили мою редакцію на питання, хоча: /
Джонатан Аллан

2

Python 3, 85 76 63 байт

Як функція, і повернення рядків як списку символів (завдяки @ pizzapants184 за те, що він сказав мені, що це дозволено):

from itertools import*
lambda z:set(permutations(z))-{tuple(z)}

Як функція:

from itertools import*
lambda z:map("".join,set(permutations(z))-{tuple(z)})

85 байт як повноцінна програма:

from itertools import*
z=input()
print(*map("".join,set(permutations(z))-{tuple(z)}))

Можна трохи зменшити, якщо дозволяється виводити рядки як ('a', 'b', 'c') (я не впевнений, що це так).


Якби тільки пітон був мовою для гольфу, наприклад.
Грифон

1
Виведення як ('a', 'b', 'c') повинно бути нормальним, цей pyth відповідь (в основному).
pizzapants184

2

Java 8, 245 239 237 байт

import java.util.*;s->{Set l=new HashSet();p("",s,l);l.remove(s);l.forEach(System.out::println);}void p(String p,String s,Set l){int n=s.length(),i=0;if(n<1)l.add(p);else for(;i<n;p(p+s.charAt(i),s.substring(0,i)+s.substring(++i,n),l));}

-6 байт завдяки @ OlivierGrégoire .

Типовий багатослівний Java .. Я бачу багато <10 байт відповідей, і ось я з 200+ байтами .. XD

Пояснення:

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

import java.util.*;         // Required import for the Set and HashSet

s->{                        // Method (1) with String parameter and no return-type
  Set l=new HashSet();      //  Set to save all permutations in (without duplicates)
  p("",s);                  //  Determine all permutations, and save them in the Set
  l.remove(s);              //  Remove the input from the Set
  l.forEach(                //  Loop over the Set
    System.out::println);   //   And print all the items
}                           // End of method (1)

// This method will determine all permutations, and save them in the Set:
void p(String p,String s,Set l){
  int n=s.length(),         //  Length of the first input String
      i=0;                  //  And a temp index-integer
  if(n<1)                   //  If the length is 0:
    l.add(p);               //   Add the permutation input-String to the Set
  else                      //  Else:
    for(;i<n;               //   Loop over the first input-String
      p(                    //    And do a recursive-call with:
        p+s.charAt(i),      //     Permutation + char
        s.substring(0,i)+s.substring(++i,n),l)
                            //     Everything except this char
      );                    //   End of loop
}                           // End of method (2)

Використовуйте l.forEach(System.out::println);замість своєї петлі друку. Крім того, мені не подобається Setвизначатися на рівні класу без його класу, що прикладається, лямбда, визначений, ніхто не знає, де і метод. Це просто занадто для мене. Я можу зрозуміти, що імпорт відокремлений від решти, але там немає нічого автономного, він більше схожий на колекцію фрагментів, ніж будь-що інше. Вибачте, але вперше в PCG я даю -1 :(
Олів'є Грегоар

@ OlivierGrégoire Перш за все дякую за пораду для forEach. Що стосується рівня класу Set, то яка альтернатива? Опублікувати весь клас, включаючи основний метод? Опублікувати весь клас, виключаючи основний метод, але включаючи сам клас, ім'я інтерфейсу та функції?
Kevin Cruijssen

Я б написав повний клас. Це найменший самодостатній я можу знайти. Не потрібно додавати значення public static void main, просто скажіть "метод введення є ...". Вся справа в тому, що ваша відповідь, як це є зараз, порушує всі "автономні" правила. Я не проти обов'язкових правил, але порушую? Так, я заперечую :(
Олів'є Грегоар

1
Інша ідея: передати параметр "Встановити як"? Помічна функція, я можу це повністю зрозуміти, але це визначає Набір поза всім, що змушує мене поставити галочку.
Олів'є Грегоар

@ OlivierGrégoire Добре, пішов за вашою другою пропозицією. Дійсно, має сенс і більше, тому я буду використовувати це відтепер. Дякую за чесні відгуки.
Kevin Cruijssen

1

Perl 6 ,  39  38 байт

*.comb.permutations».join.unique[1..*]

Спробуй це

*.comb.permutations».join.unique.skip

Спробуй це

Розширено

*               # WhateverCode lambda (this is the parameter)
.comb           # split into graphemes
.permutations\  # get all of the permutations
».join          # join each of them with a hyper method call
.unique         # make sure they are unique
.skip           # start after the first value (the input)

1

C ++, 142 байти

#include<algorithm>
void p(std::string s){auto b=s;sort(begin(s),end(s));do if(s!=b)puts(s.data());while(next_permutation(begin(s),end(s)));}

неозорий

#include <algorithm>

void p(std::string s)
{
    auto b = s;                    // use auto to avoid std::string
    sort(begin(s), end(s));        // start at first permutation
    do
      if (s != b)                  // only print permutation different than given string
        puts(s.data());
    while (next_permutation(begin(s), end(s))); // move to next permutation
}

1

K (oK) , 13 байт

Рішення:

1_?x@prm@!#x:

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

Пояснення:

Оцінювання проводиться справа наліво.

1_?x@prm@!#x: / the solution
           x: / store input in variable x
          #   / count length of x, #"abc" => 3
         !    / range, !3 => 0 1 2
     prm@     / apply (@) function permutations (prm) to range
   x@         / apply (@) these pumuted indixes back to original input
  ?           / return distinct values
1_            / drop the first one (ie the original input)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.