Усі не упорядковані пари між елементами масиву


11

Завдання:

Повернути масив з усіма можливими парами між елементами масиву.

Приклад

З a=["a", "b", "c", "d"];повернення b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Пари можуть бути в будь-якому порядку, якщо всі можливі комбінації включені і, очевидно ["b","d"], однакові ["d","b"].

Вхідні дані

Масив унікальних рядкових елементів, складених символами класу [a-z].

Вихідні дані

2d масив, що містить усі можливі пари елементів вхідного масиву.

Випробування

input=["a","b","c"];
//output=[["a","b"],["a","c"],["b","c"]]

input=["a","b","c","d","e"];
//output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]]

Примітка. Не вдалося знайти копію цього виклику. Якщо такий є, попередити мене з коментарем, щоб кинути питання.


2
Мені не ясно, що відбувається, коли вхідні значення повторюються чи не впорядковані. Там допоможуть ще деякі загальні тестові випадки.
xnor

@ Adám Не обман, що передбачає наявність 2 списків.
Містер Xcoder

Ця проблема виключає сполучення елемента з самим собою, таким чином, більше не повторюється.
CalculatorFeline

@xnor не замислювався над повторенням цінностей, оскільки моя первісна проблема на роботі була пов'язана з унікальним набором людей. Я думаю, я повинен додати унікальність як умову?
alexandros84

@ alexandros84 Унікальність буде добре. Що слід ["c","b","a"]повернути?
xnor

Відповіді:



8

Хаскелл , 29 байт

f(a:b)=map((,)a)b++f b
f _=[]

Спробуйте в Інтернеті! Приклад використання: f ["a","b","c"]врожайність [("a","b"),("a","c"),("b","c")].


Якщо прапор -XTupleSectionsможе бути скорочений до 27 байт, однак прапор потрібно буде порахувати:

f(a:b)=map(a,)b++f b
f _=[]

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


Я думаю, що ви можете зберегти один байт, змінивши файл case f l=l.
Kritzefitz

@Kritzefitz Я боюсь, що це не спрацює, оскільки два порожні списки мають різний тип, тому перевірка типу Haskell скаржиться.
Laikoni

Гарна думка. Я про це не думав.
Kritzefitz




5

vim, 50 48

AX<esc>qqYplX@qq@qqrYpllDkxh@rq:g/./norm@r<cr>:g/X/d<cr>dG

Бере введення у формі

abcd

і виводи як

ad
ac
ab
bd
bc
cd

Пояснення

По-перше, AX<esc>додає Xвхід до того, щоб обробляти вкладення 2 довжини, що необхідно з причин, які стануть зрозумілими незабаром.

Потім з'являється перший рекурсивний макрос форми qq...@qq@q. (Запишіть макрос q, запустіть себе ще в кінці, закінчіть запис, а потім запустіть себе один раз.) У тілі макроса Ypдублюється поточний рядок, lвиривається з макросу, якщо рядок зараз один символ, і Xвидаляє перший символ у рядку. Це має кінцевий результат виробництва

abcdX
abcX
abX
aX
X
X

На Xданий момент, ігноруючи s, все, що нам потрібно зробити, це перетворитись abcdX, наприклад, на ab / ac / ad / aX. Це досягається за допомогою другого рекурсивного макросу,qr...@rq .

У цьому макросі ми спочатку дублюємо рядок ( Yp), потім видаляємо все, крім перших двох символів, переміщуючи праворуч два ( ll) та видаляючи до кінця рядка ( D). Оскільки курсор зараз знаходиться на другому діаграмі рядка, kxвін видалить другий символ із попереднього рядка, який, як буває, той, що щойно спарений з першим символом у рядку. Потім цей процес повторюється, починаючи знову з початку рядка ( h) стільки разів, скільки необхідно через рекурсивний характер макросу.

Тепер справа лише в тому, щоб запустити макрос у кожному рядку, чого можна досягти :g/./norm@r(я не впевнений, чому це поводиться інакше :%norm@r, але достатньо сказати, що останній працює не за призначенням.) Рядки з Xвидаляються :g/X/d, і порожні рядки в кінці зліва в результаті побудови rмакросу очищаються dG.


Чудова відповідь. Знадобиться час, щоб я пройшов це.
alexandros84






3

Октава , 49 48 байт

@(x)[imag(y=(y=triu(x+j*x',1))(~~y)) real(y) '']

Анонімна функція, яка уникає вбудованого (nchoosek ).

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

Пояснення

x+j*x' використовує мовлення для побудови матриці складних чисел, де реальна і уявна частини - це всі пари кодових точок з вхідних даних x .

y=triu(...,1)зберігає верхню трикутну частину, виключаючи діагоналі, роблячи решту елементів нульовими. Результат присвоюється змінній y.

y=(...)(~~y)зберігає ненульові елементи у вигляді вектора стовпця, який присвоюється змінній y.

imag(...)і real(...)витягувати реальні та уявні частини.

[... ... ''] перетворює назад в char для створення результату.


Приємно! Весь виклик справді цікавий. На те, щоб придумати свій код es5 (представлений нижче), мені знадобилося приблизно півтори години. Я щасливий, що він створив так багато цікавих відповідей ..
alexandros84







1

JavaScript ES6, 52 байти

a=>a.map((x,i)=>a.slice(0,i).map(y=>[x,y])).slice(1)

Якби таке було, це flatMapдозволило б заощадити багато байтів.


Гей приємна відповідь! перевіри мою відповідь es5, поки я вивчаю твою, якщо ти хочеш. будь-які відгуки будуть оцінені (позитивні / конструктивні ха-ха)
alexandros84

1
Ознаки масиву Firefox 30 можуть імітувати плоску карту, наприклад a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Ніл

@Neil, там справді просунутий синтаксис ... Мені б довелося гуглити хоча б три речі, щоб почати розуміти ваше вираження. А саме оператор розповсюдження, що таке розуміння масиву та що є [x, y] у підсумку (все ще не знайшов відповіді на це).
alexandros84

1
@ alexandros84 [x,y]Зрештою, це легкий біт, це просто літеральний масив.
Ніл

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

1

Пітон , 55 байт

f=lambda s:[(s[0],j)for j in s[1:]]+f(s[1:])if s else[]

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

Більше, ніж інші відповіді Python, але він використовує іншу техніку, тому я думаю, що це варто опублікувати.


У вас немає часу на перевірку, я сподіваюся, що це дійсно інша техніка, тому що я був прихильний.
alexandros84

Я думаю, що це дуже схожий підхід до відповіді Python 3 @ ovs.
Ніл




1

Clojure, 42 байти

#(set(for[i % j(remove #{i}%)](set[i j])))

Повертає набір наборів :)


1

Пітон, 74 байти

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]

1
Ласкаво просимо до PPCG! Ви можете пограти в це: 1) замінити 2-char назви змінних на 1-char 2) видалити зайві пробіли 3) це фрагмент, вам потрібно перетворити його на лямбда, функцію або повну програму
Ерік the Outgolfer

Гольф від 10 байт: 64 байти
Містер Xcoder

1

Javascript (ES 5), від 108 до 78 байт

Я сьогодні розміщую свою відповідь, але я очевидно обіцяю не приймати власну відповідь:

x=input;
a=[];

for(n=0;n<(x.length-1);n++){for(i=n+1;i<(x.length);i++){a.push([x[n],x[i]]);}}

1
Ласкаво просимо до PPCG; ми очікуємо, що подання буде розіграно, включаючи видалення зайвого пробілу
HyperNeutrino

Тай. Мені було цікаво і це: чи повинен я включити вхід x =; a = []; у моїй відповіді чи ні? Я відредагую завтра.
alexandros84

Можна або просто подати функцію, або виконати повну програму. Оскільки ви користуєтеся a, вам потрібно визначити це, але ви можете зробити функцію x.
HyperNeutrino

набагато краще зараз @HyperNeutrino.
alexandros84

1
Я думаю, ви можете виключити деякі крапки з комою та порожній рядок, щоб заощадити місце. Я також думаю , що ви можете змінити for(i=n+1;i<(x.length);i++)в for(i=n;++i<x.length;). Так само ви можете змінитись n<(x.length-1);n++наn++<x.length-1
musicman523

0

J , 17 байт

({~$#:I.@,)#\</#\

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

Пояснення

({~$#:I.@,)#\</#\  Input: string S
               #\  Get the length of each prefix of S
           #\      Get the length of each prefix of S again
             </    Test using greater than (<) between each
         ,         Flatten
      I.@          Find the indices where the value is 1
   $               Shape of that table
    #:             Convert the indices to the base represented by the shape
 {~                Index into S at those values
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.