A tarefa
Escreva um programa ou função cuja entrada seja uma lista / matriz X de números inteiros e cuja saída seja uma lista de conjuntos de números inteiros Y , de modo que para cada elemento e em cada conjunto Y [ i ], X [ e ] = i , e de tal modo que o número total de elementos nos conjuntos em Y é igual ao número de elementos em X .
(Esta é basicamente a mesma operação que reverter uma hashtable / dicionário, exceto aplicada a matrizes.)
Exemplos
Esses exemplos assumem a indexação baseada em 1, mas você pode usar a indexação baseada em 0, se preferir.
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}]
Esclarecimentos
- Você pode representar um conjunto como uma lista, se desejar. Se você fizer isso, a ordem de seus elementos não importa, mas você não pode repetir elementos.
- Você pode usar qualquer formato de E / S inequívoco razoável; por exemplo, você pode separar elementos de um conjunto com espaços e os conjuntos com novas linhas.
- Y deve ser finitamente longo e pelo menos longo o suficiente para ter todos os elementos de X como índices de matriz. No entanto, pode ser maior que o elemento máximo de X (os elementos extras seriam conjuntos vazios).
- Os elementos de X serão todos índices de matriz válidos, ou seja, números inteiros não negativos se você usar a indexação com base em 0 ou números inteiros positivos se você usar a indexação com base em 1.
Condição de vitória
Como um desafio do código-golfe , quanto menor, melhor.
[5,5,6,6]
e[6,6,5,5]
podem ser idênticas?[5,5,6,6]
e[6,6,5,5]
não pode ter saída idêntica, mas a saída para[5,5,6,6]
também poderia ter sido, por exemplo[{},{},{},{},{2,1},{4,3}]
,.[{0},{0},{0},{0},{1,2},{3,4}]
uma saída válida para[5,5,6,6]
?Respostas:
MATL , 8 bytes
Entrada é um vetor de coluna, com
;
como separador (por exemplo[2;2;2]
). Saída é a representação de seqüência de caracteres de uma matriz de células de vetores de linha (por exemplo{[]; [1 2 3]}
). Um vetor de linha de um único elemento é igual a um número (portanto,{1; 2; 3}
seria a saída em vez de{[1]; [2]; [3]}
).Experimente online! Ou verifique todos os casos de teste .
Explicação
A maior parte do trabalho é realizada pela função de ordem superior do Matlab
accumarray
, que agrupa elementos na segunda entrada de acordo com os valores correspondentes na primeira e aplica uma função especificada a cada grupo. A função nesse caso é@(x){sort(x).'}
, que gera os elementos classificados em cada grupo e faz com que os resultados de todos os grupos sejam compactados em uma matriz de células.fonte
Python, 69 bytes
Usa indexação baseada em 0.
fonte
Geléia ,
75 bytesExperimente online!
Como funciona
fonte
Gelatina , 8 bytes
Experimente online!
Como funciona
fonte
Mathematica, 36 bytes
Explicação
Para cada
n
in{1, 2, ..., Max@#}
, ondeMax@#
é o maior número inteiro na lista de entrada, calcula osPosition
s onden
aparece na lista de entrada#
. ComoPosition[{6,6,5,5},5]
(por exemplo) retorna{{3},{4}}
, passamosApply
Join
a todos os elementos no nível{1}
do resultado.fonte
Haskell , 45 bytes
s
pega uma lista de números inteiros e retorna uma lista de listas. Indexado em 1 para manter as entradas do caso de teste não modificadas (embora a saída obtenha algumas listas vazias extras).Experimente online!
Essas são compreensões de lista aninhadas bastante simples. O único pequeno ajuste é aproveitar a opção de fazer uma lista mais longa usando em
sum
vez demaximum
.fonte
PHP, 55 bytes
Indexado a 0.
fonte
R,
684947 bytesSurpreendentemente, muito mais direto do que as soluções mais longas. Pega um vetor
x
de STDIN, cria um vetor de1
paramax(x)
, gera implicitamente uma lista de comprimentomax(x)
e verifica quais índicesx
correspondem aos da nova lista. Imprime implicitamente a saída.Versão antiga:
Abordagem ligeiramente diferente da outra resposta R. Leva um vetor para STDIN, cria uma lista com comprimento igual ao valor máximo na entrada. Faz um loop na entrada e adiciona o índice no lugar certo.
Usa indexação baseada em 1.
fonte
Python 2 ,
918685 bytesEstou programando no meu telefone, mas gostei muito desse desafio. Definitivamente, ainda posso jogar golfe.
Experimente online!
fonte
Geléia , 9 bytes
Conjuntos vazios indexados em 1 representados como
0
, conjuntos de um item representado comoN
conjuntos de vários itens representados como[M,N,...]
Experimente online!
Quão?
fonte
JavaScript (ES6),
6462 bytesGuardado 2 bytes graças a @SteveBennett
Recebe entrada indexada em 0. Retorna uma lista de conjuntos separados por vírgula.
Casos de teste
Mostrar snippet de código
Versão alternativa, 53 bytes
Se uma saída simplificada como
'||||3,2|1,0'
é aceitável, podemos apenas fazer:fonte
`{${o.join`},{`}}`
é legal o ES2015."{" + o.join("},{") + "}"
, se isso tornar mais claro.join`
é equivalente ajoin('
. Não tinha ideia de que você poderia fazer isso.array.join` `
. Super confusa aqui porque você está incorporando isso em uma sequência de modelo, e ainda mais confusa, a sequência de junção é},{
, que coincidentemente parecia parte da sequência de modelo ... e é estranha e feia de qualquer maneira. :)Bash , 109 bytes
Pena que não há built-in para o valor máximo da matriz.
Experimente online!
fonte
Mathematica 62 bytes
Eu vou executá-lo para você
Experimente online (basta colar o código com ctrl-v e pressione Shift + Enter)
não se esqueça de colar a lista de entradas no final, como no exemplo acima
fonte
AppendTo
. Além disso,{j,1,Length[#1]}
poderia ser apenas{j,Length@#}
, ou até mais curto{j,Tr[1^#]}
,.Tr[1^#]
é um truque bastante comum para economizar um byteLength
.Perl 6 ,
36 3229 bytesTente
Tente
Tente
Expandido:
Retorna índices baseados em zero, para obter 1 uso cruzado entre operadores (
X
) combinado com+
op . (33 bytes)Para fazê-lo retornar Set s basta adicionar
set
lá (total de 37 bytes)fonte
R,
80bytes 721 indexado, leva
X
de stdin. Retorna uma lista de vetores dos índices, comNULL
o conjunto vazio.Experimente online!
versão antiga:
Experimente online!
fonte
Y=list();
funciona tão bemfew
bytes na minha resposta :) codegolf.stackexchange.com/a/120024/5953005AB1E , 10 bytes
Experimente online!
fonte
Röda , 51 bytes
É um porto da resposta em Python de Uriel .
Outra versão (88 bytes):
Experimente online!
Ambos um 1-indexado.
fonte
PowerShell, 81 bytes
Experimente online!
1 indexado.
fonte
GNU Make ,
214213208204 bytesE / S: matriz de entrada via argumentos, saída para stdout, uma por linha, separada por espaços.
Explicação
A ordem dos índices em conjuntos é revertida porque
P
chama recursivamente antes da atualizaçãoA$2
(chamada executada na avaliação do lado direito).fonte
make
alguma maneira de fazer aritmética em si? Chamar programas externos para fazer isso parece um pouco de trapaça, porque você provavelmente poderia colocar muito mais do algoritmo nesses programas e acabar com um programa mais curto.bc
egrep
. Eu também poderia usartest
e$?
.dc
tem uma sintaxe terser, mas francamente todos parecem iguais.Lisp comum, 91 bytes
Indexação baseada em 1, retorna os conjuntos como listas.
Experimente online!
fonte
k , 13 bytes
Este é o índice 0.
Experimente online!
fonte