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.

alexandros84
fonte
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:

5

Gelatina , 2 bytes

Œc

Experimente online!

HyperNeutrino
fonte
Você ninja'd me - bonito imprimir a saída usando algo como ÇK€Yno rodapé.
Jonathan Allan
@JonathanAllan Oh, obrigado!
HyperNeutrino
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!

Laikoni
fonte
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

Mathematica, 14 bytes

#~Subsets~{2}&

entrada

[{"a", "b", "c"}]

J42161217
fonte
Eu faria isso :(
CalculatorFeline
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.

nimi
fonte
5

05AB1E , 3 bytes

Código:

æ2ù

Usa a codificação 05AB1E . Experimente online!

Explicação:

æ      # Powerset of the input
 2ù    # Keep the items of length two
Adnan
fonte
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.

Maçaneta da porta
fonte
Ótima resposta. Vai levar tempo para eu passar por isso.
alexandros84
4

Python 3 , 44 bytes

f=lambda k,*s:[*s]and[[k,x]for x in s]+f(*s)

Experimente online!

Recebe entrada como parâmetros de função individuais.

ovs
fonte
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
Freira Furada
fonte
3

R , 18 bytes

combn(scan(,''),2)

lê a lista de stdin, retorna uma matriz onde as colunas são pares.

Experimente online!

Giuseppe
fonte
3

Python, 53 bytes

2 bytes salvos graças a @CalculatorFeline

lambda a:[(x,y)for i,x in enumerate(a)for y in a[:i]]

Experimente online!

Uriel
fonte
1
a[i+1:]pode ser #a[:i]
CalculatorFeline
Ter um nome de usuário longo facilita os pequenos comentários, basta mencionar o usuário mencionado acima.
CalculatorFeline
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.

Luis Mendo
fonte
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

Python ≥ 2,7, 55 bytes

lambda l:list(combinations(l,2))
from itertools import*

repl.it!

Mr. Xcoder
fonte
2

Perl 6 , 17 bytes

*.combinations(2)

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

Sean
fonte
2

Scala, 17 bytes

_.combinations(2)
musicman523
fonte
2

Pitão , 7 4 bytes

-3 bytes graças a Leaky Nun !

.cQ2

Experimente online!

notjagan
fonte
1
.cQ2?
Freira vazada
@LeakyNun Eu poderia jurar que havia uma função que fazia exatamente o que esse desafio precisava, mas só vi .Cao olhar a lista. Boa pegada!
notjagan
2

Ruby , 38 34 24 bytes

->x{[*x.combination(2)]}

Obrigado Parece pela idéia que salvou 10 bytes.

Experimente online!

GB
fonte
1
->x{x.combination(2).to_a}salva alguns bytes :)
Seims
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.

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

musicman523
fonte
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

Japonês , 2 bytes

à2

Teste ( -Qsinalize apenas para fins de visualização)

Shaggy
fonte
1

Python, 64 bytes

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

Oitava, 38 bytes

@(s)s([[x y]=find(s|s'),y](y<x,[2 1]))

Outra resposta para evitar o nchoosekbuilt-in.

Experimente online!

rahnema1
fonte
1

Clojure, 42 bytes

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

Retorna um conjunto de conjuntos :)

NikoNyrh
fonte
1

Python, 74 bytes

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]
Oren
fonte
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]]);}}
alexandros84
fonte
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
milhas
fonte