Todos os pares não ordenados entre os elementos de uma matriz


11

Tarefa:

Retorne uma matriz com todos os pares possíveis entre os elementos de uma matriz.

Exemplo

De a=["a", "b", "c", "d"];volta b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Os pares podem estar em qualquer ordem, desde que todas as combinações possíveis estejam incluídas e obviamente ["b","d"]sejam iguais ["d","b"].

Entrada

Matriz de elementos string única compostas de caracteres da classe [a-z].

Resultado

2d array contendo todos os pares possíveis de elementos do array de entrada.

Casos de teste

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"]]

Nota: Não foi possível encontrar uma duplicata para este desafio. Se houver, me avise com um comentário para deixar a pergunta.


2
Não sei ao certo o que acontece quando os valores de entrada se repetem ou não estão na ordem de classificação. Alguns casos de teste mais gerais ajudariam lá.
xnor

@ Adám Não é um idiota, isso envolve ter 2 listas.
Mr. Xcoder

Esse problema exclui o emparelhamento de um elemento consigo mesmo, ainda mais não duplicado.
CalculatorFeline

A @xnor não pensou em repetir valores porque meu problema original no trabalho tinha a ver com um conjunto único de indivíduos. Acho que devo adicionar exclusividade como condição?
alexandros84

@ alexandros84 Exclusividade seria bom. O que deve ["c","b","a"]retornar?
xnor

Respostas:



8

Haskell , 29 bytes

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

Experimente online! Exemplo de uso: f ["a","b","c"]rendimentos [("a","b"),("a","c"),("b","c")].


Com o sinalizador, -XTupleSectionsisso pode ser reduzido para 27 bytes; no entanto, o sinalizador precisa ser contado:

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

Experimente online!


Eu acho que você pode salvar um byte, modificando o caso para f l=l.
Kritzefitz

@Kritzefitz Receio que isso não funcione, pois as duas listas vazias têm um tipo diferente, então o verificador de tipo de Haskell se queixará.
Laikoni

Bom ponto. Eu não pensei nisso.
Kritzefitz


6

Haskell, 25 bytes

f l=[(x,y)|x<-l,y<-l,x<y]

Experimente online!

Externo ( x) e interno ( y) passam pela lista de entrada e mantêm o par (x,y)apenas se x < y.



5

vim, 50 48

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

Recebe entrada no formulário

abcd

e saídas como

ad
ac
ab
bd
bc
cd

Explicação

Primeiro, AX<esc>anexa um Xà entrada para manipular a entrada de 2 comprimentos, o que é necessário por razões que ficarão claras em breve.

Em seguida, vem a primeira macro recursiva, do formulário qq...@qq@q. (Grave a macro q, execute-se novamente no final, termine a gravação e execute-se uma vez.) No corpo da macro, Ypduplica a linha atual, linterrompe a macro se a linha tiver agora um caractere e Xexclui o primeiro caractere na linha. Isso tem como resultado final a produção

abcdX
abcX
abX
aX
X
X

Ignorando os Xs por enquanto, tudo o que precisamos fazer é transformar abcdX, por exemplo, em ab / ac / ad / aX. Isto é conseguido com a segunda macro recursiva qr...@rq,.

Nesta macro, duplicamos a linha ( Yp) e excluímos tudo, exceto os dois primeiros caracteres, movendo para a direita dois ( ll) e excluindo até o final da linha ( D). Como o cursor está agora no segundo caractere da linha, kxexcluirá o segundo caractere da linha anterior, que passa a ser o que acabou de emparelhar com o primeiro caractere da linha. Esse processo é repetido, iniciando novamente do início da linha ( h) quantas vezes for necessário, devido à natureza recursiva da macro.

Agora é apenas uma questão de executar a macro em todas as linhas, o que pode ser alcançado com :g/./norm@r(não sei por que isso se comporta de maneira diferente :%norm@r, mas basta dizer que a última não funciona conforme o esperado). As linhas com Xsão excluídas com :g/X/d, e as linhas em branco no final deixadas como resultado da construção da rmacro são limpas dG.


Ótima resposta. Vai levar tempo para eu passar por isso.
alexandros84



4

Braquilog , 5 bytes

{⊇Ċ}ᶠ

Experimente online!

Como funciona

{⊇Ċ}ᶠ
    ᶠ   find all the possible outputs of the following predicate
 ⊇          the output is an ordered subset of the input
  Ċ         the output is a list with two elements



3

Oitava , 49 48 bytes

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

Função anônima que evita o built-in ( nchoosek).

Experimente online!

Explicação

x+j*x'usa a transmissão para criar uma matriz de números complexos, onde as partes reais e imaginárias são todos pares de pontos de código da entrada x.

y=triu(...,1)mantém a parte triangular superior excluindo a diagonal, zerando o restante dos elementos. O resultado é atribuído à variável y.

y=(...)(~~y)mantém os elementos diferentes de zero na forma de um vector de coluna, que é atribuído a variável y.

imag(...)e real(...)extrair as partes reais e imaginárias.

[... ... ''] converte de volta em char para criar a saída.


Agradável! Todo o desafio é realmente interessante. Levei cerca de uma hora e meia para criar o meu código es5 (apresentado abaixo). Estou feliz que tenha gerado tantas respostas interessantes ..
alexandros84



2

Perl 6 , 17 bytes

*.combinations(2)

Ufa, esse é um nome de método longo.





1

JavaScript ES6, 52 bytes

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

Se houvesse um flatMapque economizaria muitos bytes.


Hey boa resposta! confira minha resposta es5 enquanto eu estudo a sua, se você quiser. qualquer feedback será apreciado (ha ha positiva / construtiva)
alexandros84

1
As compreensões de matriz do Firefox 30 podem simular um mapa plano, por exemplo a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
19417 Neil

@ Neil, alguma sintaxe realmente avançada lá ... Eu teria que pesquisar no google pelo menos três coisas para começar a entender sua expressão. Nomeadamente o operador spread, o que é compreensão de array e qual é o [x, y] no final (ainda não foi encontrada resposta para isso).
alexandros84

1
@ alexandros84 O [x,y]final é fácil, é apenas uma matriz literal.
Neil

1
Além disso, o operador spread está lá apenas para copiar a matriz, já que a estou mutando dentro do loop.
19417 Neil

1

Python , 55 bytes

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

Experimente online!

Mais do que outras respostas do Python, mas ele usa uma técnica diferente, então acho que vale a pena postar.


Não tenho tempo para verificar, espero que seja uma técnica realmente diferente, porque eu votei.
alexandros84

Penso que esta é uma abordagem muito semelhante à resposta Python 3 da @ ovs.
Neil


1

Python, 64 bytes

f=lambda a:sum((list(zip(a, a[i:]))for i in range(1,len(a))),[])


1

Clojure, 42 bytes

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

Retorna um conjunto de conjuntos :)


1

Python, 74 bytes

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

1
Bem-vindo ao PPCG! Você pode jogar isto: 1) substituir nomes de variáveis ​​de 2 caracteres por 1 caractere 2) remover espaços em branco desnecessários 3) este é um trecho, é necessário transformá-lo em um lambda, função ou programa completo
Erik the Outgolfer

Jogando fora de 10 bytes: 64 bytes
Sr. Xcoder

1

Javascript (ES 5), de 108 a 78 bytes

Hoje posto minha resposta, mas obviamente prometo não aceitar minha própria resposta:

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
Bem-vindo ao PPCG; esperamos submissões a serem golfed, incluindo a remoção de espaços em branco desnecessários
HyperNeutrino

Ty. Eu queria saber também o seguinte: eu deveria ter incluído o x = input; a = []; na minha resposta ou não? Eu vou editar amanhã.
alexandros84

Você pode simplesmente enviar uma função ou executar um programa completo. Desde que você o usa a, é necessário defini-lo, mas é possível criar uma função x.
HyperNeutrino

muito melhor agora @HyperNeutrino.
Alexandros84

1
Eu acho que você pode excluir alguns pontos e vírgulas e a linha vazia para economizar espaço. Eu também acho que você pode mudar for(i=n+1;i<(x.length);i++)para for(i=n;++i<x.length;). Da mesma forma, você pode mudar n<(x.length-1);n++paran++<x.length-1
musicman523

0

J , 17 bytes

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

Experimente online!

Explicação

({~$#: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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.