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.


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:



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!


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

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.



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.


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


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!


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.


¡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

Perl 6 , 17 bytes

*.combinations(2)

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





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.


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.


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))),[])


1

Clojure, 42 bytes

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

Devuelve un 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
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]]);}}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.