Todos los pares no ordenados entre los elementos de una matriz.

11

Tarea:

Devuelve una matriz con todos los pares posibles entre los elementos de una matriz.

Ejemplo

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

Los pares pueden estar en cualquier orden siempre que se incluyan todas las combinaciones posibles y obviamente ["b","d"]sea ​​lo mismo ["d","b"].

Entrada

Matriz de elementos de cadena únicos compuestos por caracteres de la clase [a-z].

Salida

Matriz 2D que contiene todos los pares posibles de elementos de la matriz de entrada.

Casos de prueba

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: No pude encontrar un duplicado para este desafío. Si hay uno, avíseme con un comentario para dejar la pregunta.

alexandros84
fuente
2
No tengo claro qué sucede cuando los valores de entrada se repiten o no están ordenados. Algunos casos de prueba más generales ayudarían allí.
xnor
@ Adám No es un engañado, eso implica tener 2 listas.
Sr. Xcoder
Este problema excluye el emparejamiento de un elemento consigo mismo, incluso más no duplicado.
CalculatorFeline
@xnor no ha pensado en repetir valores porque mi problema original en el trabajo tenía que ver con un conjunto único de individuos. ¿Supongo que debería agregar singularidad como condición?
alexandros84
@ alexandros84 La singularidad estaría bien. ¿Qué debería ["c","b","a"]volver?
xnor

Respuestas:

5

Jalea , 2 bytes

Œc

Pruébalo en línea!

Hiperneutrino
fuente
Usted me ninja, imprime la salida usando algo como ÇK€Yen el pie de página
Jonathan Allan
@ JonathanAllan ¡Oh, gracias!
HyperNeutrino
8

Haskell , 29 bytes

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

Pruébalo en línea! Ejemplo de uso: f ["a","b","c"]rendimientos [("a","b"),("a","c"),("b","c")].


Con el indicador, -XTupleSectionsesto se puede acortar a 27 bytes, sin embargo, el indicador debería contarse:

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

Pruébalo en línea!

Laikoni
fuente
Creo que puede guardar un byte modificando el caso be f l=l.
Kritzefitz
@Kritzefitz Me temo que esto no funcionará, ya que las dos listas vacías tienen un tipo diferente, por lo que el verificador de tipo de Haskell se quejará.
Laikoni
Buen punto. No pensé en eso.
Kritzefitz
6

Mathematica, 14 bytes

#~Subsets~{2}&

entrada

[{"a B C"}]

J42161217
fuente
Iba a hacer eso :(
CalculatorFeline
6

Haskell, 25 bytes

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

Pruébalo en línea!

Outer ( x) e inner ( y) recorren la lista de entrada y mantienen el par (x,y)solo si x < y.

nimi
fuente
5

05AB1E , 3 bytes

Código:

æ2ù

Utiliza la codificación 05AB1E . Pruébalo en línea!

Explicación:

æ      # Powerset of the input
 2ù    # Keep the items of length two
Adnan
fuente
5

vim, 50 48

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

Toma entrada en el formulario

abcd

y salidas como

ad
ac
ab
bd
bc
cd

Explicación

Primero, AX<esc>agrega un an Xa la entrada para manejar la entrada de 2 longitudes, lo cual es necesario por razones que se aclararán en breve.

Luego viene la primera macro recursiva, de la forma qq...@qq@q. (Grabe macro q, vuelva a ejecutarse al final, finalice la grabación, luego ejecútese una sola vez). En el cuerpo de la macro, Ypduplica la línea actual, lsale de la macro si la línea tiene ahora un carácter y Xborra el primer personaje de la línea. Esto tiene el resultado final de producir

abcdX
abcX
abX
aX
X
X

Ignorando la Xs por ahora, todo lo que tenemos que hacer es convertir abcdX, por ejemplo, en ab / ac / ad / aX. Esto se consigue con la segunda macro recursiva, qr...@rq.

En esta macro, primero duplicamos la línea ( Yp), luego eliminamos todo menos los dos primeros caracteres moviendo dos ( ll) a la derecha y eliminando al final de la línea ( D). Dado que el cursor está ahora en el segundo carácter de la línea, kxeliminará el segundo carácter de la línea anterior, que es el que acaba de emparejarse con el primer carácter de la línea. Este proceso se repite comenzando nuevamente desde el principio de la línea ( h) tantas veces como sea necesario debido a la naturaleza recursiva de la macro.

Ahora es solo cuestión de ejecutar la macro en cada línea, lo que se puede lograr con :g/./norm@r(no estoy seguro de por qué esto se comporta de manera diferente :%norm@r, pero es suficiente decir que este último no funciona como se esperaba). Las líneas con Xse eliminan con :g/X/d, y las líneas en blanco al final a la izquierda como resultado de la construcción de la rmacro se limpian con dG.

Pomo de la puerta
fuente
Gran respuesta. Me llevará tiempo pasar por eso.
alexandros84
4

Brachylog , 5 bytes

{⊇Ċ}ᶠ

Pruébalo en línea!

Cómo 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
Monja permeable
fuente
3

R , 18 bytes

combn(scan(,''),2)

lee la lista de stdin, devuelve una matriz donde las columnas son pares.

Pruébalo en línea!

Giuseppe
fuente
3

Python, 53 bytes

2 bytes guardados gracias a @CalculatorFeline

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

Pruébalo en línea!

Uriel
fuente
1
a[i+1:]puede sera[:i]
CalculatorFeline
Tener un nombre de usuario largo facilita los comentarios cortos simplemente mencionando al usuario mencionado anteriormente.
CalculatorFeline
3

Octava , 49 48 bytes

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

Función anónima que evita el incorporado ( nchoosek).

Pruébalo en línea!

Explicación

x+j*x'usa la transmisión para construir una matriz de números complejos donde las partes reales e imaginarias son todos pares de puntos de código de la entrada x.

y=triu(...,1)mantiene la parte triangular superior excluyendo la diagonal, haciendo que el resto de elementos sea cero. El resultado se asigna a la variable y.

y=(...)(~~y)retiene los elementos distintos de cero en forma de un vector de columna, que se asigna a la variable y.

imag(...)y real(...)extraer las partes reales e imaginarias.

[... ... ''] convierte de nuevo a char para generar la salida.

Luis Mendo
fuente
¡Agradable! Todo el desafío es realmente interesante. Me llevó aproximadamente una hora y media encontrar mi código es5 (que se muestra a continuación). Estoy feliz que generó tantas respuestas interesantes ..
alexandros84
2

Python ≥ 2.7, 55 bytes

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

repl.it!

Sr. Xcoder
fuente
2

Perl 6 , 17 bytes

*.combinations(2)

Vaya, ese es un nombre de método largo.

Sean
fuente
2

Scala, 17 bytes

_.combinations(2)
musicman523
fuente
2

Pyth , 7 4 bytes

-3 bytes gracias a Leaky Nun !

.cQ2

Pruébalo en línea!

notjagan
fuente
1
.cQ2?
Leaky Nun
@LeakyNun Podría haber jurado que había una función que hacía exactamente lo que este desafío necesitaba, pero solo vi .Ccuando revisé la lista. ¡Buena atrapada!
notjagan
2

Ruby , 38 34 24 bytes

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

Gracias Seims por la idea que ahorró 10 bytes.

Pruébalo en línea!

GB
fuente
1
->x{x.combination(2).to_a}guarda algunos bytes :)
Seims
1

JavaScript ES6, 52 bytes

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

Si hubiera una, flatMapeso ahorraría muchos bytes.

Downgoat
fuente
Hola buena respuesta! mira mi respuesta es5 mientras estudio la tuya si quieres. cualquier comentario será apreciado (positivo / constructivo jaja)
alexandros84
1
Las comprensiones de la matriz de Firefox 30 pueden simular un mapa plano, por ejemplo a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil
@Neil, hay una sintaxis realmente avanzada ... Tendría que buscar en Google al menos tres cosas para comenzar a entender su expresión. Es decir, el operador de propagación, qué es la comprensión de matriz y cuál es el [x, y] al final (todavía no he encontrado respuesta a eso).
alexandros84
1
@ alexandros84 El [x,y]final es el bit fácil, es solo una matriz literal.
Neil
1
Además, el operador de propagación solo está allí para copiar la matriz, ya que la estoy mutando dentro del bucle.
Neil
1

Python , 55 bytes

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

Pruébalo en línea!

Más tiempo que otras respuestas de Python, pero utiliza una técnica diferente, así que creo que vale la pena publicarlo.

musicman523
fuente
No tengo tiempo para verificar, espero que sea una técnica realmente diferente porque he votado.
alexandros84
Creo que este es un enfoque muy similar a la respuesta Python 3 de @ ovs.
Neil
1

Python, 64 bytes

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

Octava, 38 bytes

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

Otra respuesta para evitar nchoosekincorporados.

Pruébalo en línea!

rahnema1
fuente
1

Clojure, 42 bytes

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

Devuelve un conjunto de conjuntos :)

NikoNyrh
fuente
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
fuente
1
Bienvenido a PPCG! Puede jugar esto: 1) reemplazar nombres de variables de 2 caracteres por 1-caracteres 2) eliminar espacios en blanco innecesarios 3) este es un fragmento, debe convertirlo en una lambda, función o programa completo
Erik the Outgolfer
Golf de 10 bytes: 64 bytes
Sr. Xcoder
1

Javascript (ES 5), de 108 a 78 bytes

Publico mi respuesta hoy, pero obviamente prometo no aceptar mi propia respuesta:

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
fuente
1
Bienvenido a PPCG; esperamos que se envíen propuestas, incluida la eliminación de espacios en blanco innecesarios
HyperNeutrino
Ty También me preguntaba esto: ¿debería haber incluido la entrada x =; a = []; en mi respuesta o no? Lo editaré mañana.
alexandros84
Puede enviar una función o hacer un programa completo. Como lo usa a, debe definirlo, pero puede hacer una función de x.
HyperNeutrino
mucho mejor ahora @HyperNeutrino.
alexandros84
1
Creo que puede excluir algunos puntos y comas y la línea vacía para ahorrar espacio. También creo que puedes cambiar for(i=n+1;i<(x.length);i++)a for(i=n;++i<x.length;). Del mismo modo, puede cambiar n<(x.length-1);n++an++<x.length-1
musicman523
0

J , 17 bytes

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

Pruébalo en línea!

Explicación

({~$#: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
millas
fuente