La tarea
Escriba un programa o función cuya entrada sea una lista / matriz X de enteros, y cuya salida sea una lista de conjuntos de enteros Y , de modo que para cada elemento e en cada conjunto Y [ i ], X [ e ] = i , y tal que el número total de elementos de los sistemas en Y es igual al número de elementos en X .
(Esta es básicamente la misma operación que invertir una tabla hash / diccionario, excepto que se aplica a las matrices).
Ejemplos
Estos ejemplos suponen una indexación basada en 1, pero puede usar una indexación basada en 0 si lo prefiere.
X Y
[4] [{},{},{},{1}]
[1,2,3] [{1},{2},{3}]
[2,2,2] [{},{1,2,3}]
[5,5,6,6] [{},{},{},{},{1,2},{3,4}]
[6,6,5,5] [{},{},{},{},{3,4},{1,2}]
Aclaraciones
- Puede representar un conjunto como una lista, si lo desea. Si lo hace, el orden de sus elementos no importa, pero no puede repetir elementos.
- Puede usar cualquier formato de E / S razonablemente inequívoco; por ejemplo, podría separar elementos de un conjunto con espacios y los conjuntos con líneas nuevas.
- Y debe ser finitamente largo, y al menos lo suficientemente largo como para tener todos los elementos de X como índices de matriz. Sin embargo, puede ser más largo que el elemento máximo de X (los elementos adicionales serían conjuntos vacíos).
- Todos los elementos de X serán índices de matriz válidos, es decir, enteros no negativos si usa indexación basada en 0, o enteros positivos si usa indexación basada en 1.
Condición de victoria
Como un desafío de código de golf , más corto es mejor.
[5,5,6,6]
y[6,6,5,5]
pueden ser idénticos?[5,5,6,6]
, y[6,6,5,5]
no puede tener salida idéntica, pero la salida de[5,5,6,6]
también podría haber sido, por ejemplo,[{},{},{},{},{2,1},{4,3}]
.[{0},{0},{0},{0},{1,2},{3,4}]
sería una salida válida para[5,5,6,6]
?Respuestas:
MATL , 8 bytes
La entrada es un vector de columna, con un
;
separador (por ejemplo[2;2;2]
). La salida es la representación de cadena de una matriz de celdas de vectores de fila (por ejemplo{[]; [1 2 3]}
). Un vector de fila de un solo elemento es lo mismo que un número (por{1; 2; 3}
lo que se generaría en lugar de{[1]; [2]; [3]}
).Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
La mayor parte del trabajo se realiza mediante la función de orden superior de Matlab
accumarray
, que agrupa elementos en la segunda entrada de acuerdo con valores coincidentes en la primera, y aplica una función específica a cada grupo. La función en este caso es@(x){sort(x).'}
, que genera los elementos ordenados en cada grupo y hace que los resultados para todos los grupos se empaqueten en una matriz de celdas.fuente
Python, 69 bytes
Utiliza indexación basada en 0.
fuente
Jalea ,
75 bytesPruébalo en línea!
Cómo funciona
fuente
Jalea , 8 bytes
Pruébalo en línea!
Cómo funciona
fuente
Mathematica, 36 bytes
Explicación
Para cada uno
n
de{1, 2, ..., Max@#}
dondeMax@#
es el mayor número entero en la lista de entrada, calcula losPosition
s donden
aparece en la lista de entrada#
. ComoPosition[{6,6,5,5},5]
(por ejemplo) regresa{{3},{4}}
, pasamosApply
Join
a todos los elementos a nivel{1}
del resultado.fuente
Haskell , 45 bytes
s
toma una lista de enteros y devuelve una lista de listas. 1 indexado para mantener las entradas del caso de prueba sin modificar (aunque la salida obtiene algunas listas vacías adicionales).Pruébalo en línea!
Estas son comprensiones de listas anidadas bastante sencillas. El único pequeño ajuste es aprovechar la opción de hacer una lista más larga usando en
sum
lugar demaximum
.fuente
PHP, 55 bytes
0 indexado.
fuente
R,
684947 bytesSorprendentemente, mucho más sencillo que las soluciones más largas. Toma un vector
x
de STDIN, crea un vector de1
amax(x)
, genera implícitamente una lista de longitudmax(x)
y comprueba qué índices sex
corresponden con los de la nueva lista. Imprime implícitamente la salida.Versión antigua:
Enfoque ligeramente diferente a la otra respuesta R. Toma un vector para STDIN, crea una lista con una longitud igual al valor máximo en la entrada. Recorre la entrada y agrega el índice en el lugar correcto.
Utiliza indexación basada en 1.
fuente
Python 2 ,
918685 bytesEstoy programando en mi teléfono pero realmente me gustó este desafío. Definitivamente puedo jugar golf más allá.
Pruébalo en línea!
fuente
Jalea , 9 bytes
Conjuntos vacíos indexados en 1 representados como
0
conjuntos de un elemento representados comoN
conjuntos de elementos múltiples representados como[M,N,...]
Pruébalo en línea!
¿Cómo?
fuente
JavaScript (ES6),
6462 bytesGuardado 2 bytes gracias a @SteveBennett
Toma entrada indexada 0. Devuelve una lista de conjuntos separados por comas.
Casos de prueba
Mostrar fragmento de código
Versión alternativa, 53 bytes.
Si una salida simplificada como
'||||3,2|1,0'
es aceptable, simplemente podemos hacer:fuente
`{${o.join`},{`}}`
es legal ES2015."{" + o.join("},{") + "}"
, si eso lo aclara más.join`
es equivalente ajoin('
. No tenía idea de que pudieras hacer eso.array.join` `
. Súper confuso aquí porque está incrustando eso dentro de una cadena de plantilla, y aún más confusamente, la cadena de unión es},{
, que casualmente parecía parte de la cadena de plantilla ... y de todos modos es extraña y fea. :)Bash , 109 bytes
Lástima que no haya incorporado un valor máximo de matriz.
Pruébalo en línea!
fuente
Mathematica 62 bytes
Lo correré por ti
Pruébelo en línea (solo pegue el código con ctrl-v y presione shift + enter)
no olvide pegar la lista de entrada al final como en el ejemplo anterior
fuente
AppendTo
. Además,{j,1,Length[#1]}
solo podría ser{j,Length@#}
, o incluso más corto,{j,Tr[1^#]}
.Tr[1^#]
Es un truco bastante común para guardar un byte sobre el usoLength
.Perl 6 ,
36 3229 bytesIntentalo
Intentalo
Intentalo
Expandido:
Devuelve índices basados en cero; para obtener 1, utilice el operador cruzado (
X
) combinado con+
op . (33 bytes)Para que regrese , solo agregue
set
allí (total 37 bytes)fuente
R,
8072 bytes1 indexado, toma
X
de stdin. Devuelve una lista de vectores de los índices, conNULL
el conjunto vacío.Pruébalo en línea!
versión antigua:
Pruébalo en línea!
fuente
Y=list();
funciona igual de bienfew
bytes en mi respuesta :) codegolf.stackexchange.com/a/120024/5953005AB1E , 10 bytes
Pruébalo en línea!
fuente
Röda , 51 bytes
Es un puerto de la respuesta Python de Uriel .
Otra versión (88 bytes):
Pruébalo en línea!
Ambos un 1 indexado.
fuente
PowerShell, 81 bytes
Pruébalo en línea!
1 indexado.
fuente
Marca GNU ,
214213208204 bytesI / O: matriz de entrada a través de argumentos, salida a stdout, uno por línea, separados por espacios.
Explicación
El orden de los índices en conjuntos se invierte porque se
P
llama recursivamente antes de actualizarA$2
(llamada ejecutada en la evaluación del lado derecho).fuente
make
Tiene alguna forma de hacer aritmética en sí? Llamar a programas externos para hacerlo se siente un poco como hacer trampa, porque probablemente podrías poner mucho más del algoritmo en esos programas y terminar con un programa más corto.bc
ygrep
. También podría usartest
y$?
.dc
tiene una sintaxis terser, pero, francamente, todos sienten lo mismoLisp común, 91 bytes
Indexación basada en 1, devuelve los conjuntos como listas.
Pruébalo en línea!
fuente
k , 13 bytes
Esto está indexado a 0.
Pruébalo en línea!
fuente