Dada uma lista de listas, encontre a lista mais curta que é uma sub-lista contígua de exatamente uma lista.
Por exemplo, se tivéssemos
[[1,2,3],
[1,2,3,4],
[2,4,5,6],
[1,2,4,5,6]]
a sub-lista contígua mais curta seria, uma [3,4]
vez que aparece apenas na segunda lista.
Se não houver uma sub-lista contígua exclusiva (isso requer pelo menos uma entrada duplicada), produza uma lista vazia. Aqui está um exemplo
[[1,2,3],
[1,2,3],
[1,2]]
Se houver várias sublistas contíguas de tamanho mínimo, você poderá gerar qualquer uma delas ou uma lista contendo todas elas. Por exemplo, se a entrada foi
[[1,2,3],[2],[1],[3]]
Você pode gerar ou [1,2]
, [2,3]
ou [[1,2],[2,3]]
. Se você optar por fazer a última opção, poderá gerar listas singleton para os casos em que houver apenas uma solução.
A saída pode ocorrer na mesma lista mais de uma vez, desde que não apareça em nenhuma outra lista. Por exemplo
[[1,2,1,2],[2,1]]
deve sair [1,2]
porque [1,2]
é uma sub-lista da primeira lista, mas não a segunda, mesmo sendo uma sub-lista da primeira lista de duas maneiras diferentes.
Você pode usar como entrada uma lista de listas contendo qualquer tipo, desde que esse tipo tenha mais de 100 valores possíveis, ou seja, sem Booleanos.
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
[[1,1]] : [1]
[[1],[1]] : []
[[1,1],[1]] : [1,1]
fonte
[[1,1]]
Pitão, 15 bytes
Suíte de teste
Primeiro, geramos todas as substrings de cada lista de entrada com
.:R)Q
. Em seguida, geramos todas as ordens possíveis desses grupos de substring.p
.Agora para a parte mais complicada:
-M
. Isso dobra a-
função sobre cada lista de pedidos. Começa com a primeira lista de substring e depois filtra todos os ocupantes de todas as outras listas.Em seguida, os resultados são concatenados, ordenados por comprimento, um
[]
é anexado e, em seguida, o primeiro elemento da lista resultante é extraídoh
.Isso seria 4 bytes mais curto se eu pudesse errar em nenhuma sublista exclusiva, em vez de gerar uma lista vazia.
fonte
hlDs-M.p.:R
é provavelmente o que ele quer dizer.Pitão - 20 bytes
Conjunto de Teste .
fonte
[[1,1]]
.Haskell ,
149128126113 bytesExperimente online!
Economizou 21 bytes graças ao Wheat Wizard, H.PWiz e Bruce Forte.
Economizou mais dois bytes graças ao H.PWiz.
Economizou 13 bytes graças a nimi.
EDIT Esta foi a explicação original:
fonte
i=
no final do seu programa, porque as funções sem pontos não precisam ser atribuídas de acordo com nossas regras.foldl1(++)
apenasconcat
?(length$filter(==x)l)
pode ser mais curto quantolength(filter(==x)l)
ou até mais curto quantosum[1|y<-l,y==x]
[]
que é, mas>>=id
é ainda mais curto;) Também @ jferard: Você pode incorporar muitas funções (por exemplof
,g
etc.), uma vez que você as usa apenas uma vez.Java 8, 251 + 19 = 270 bytes
Um lambda muito grosseiro de, minimamente,
List<List>
aList
(melhor para moldá-loFunction<List<List<Integer>>, List<Integer>>
). É uma solução de força bruta que itera os comprimentos dos fragmentos de 1 ao tamanho da maior lista, repetindo cada fragmento desse comprimento em cada lista e verificando cada fragmento desse tamanho em relação a cada fragmento de tamanho igual em qualquer outra lista.Tema-me, coletor de lixo.
Lambda ungolfed
Experimente Online
Java 8, 289 + 45 = 334 bytes
Essa é uma abordagem mais funcional usando fluxos. Se houvesse um método
Stream
para reduzir a apenas os elementos que aparecerem uma vez, essa solução teria superado o descrito acima. Atribua ao mesmo tipo que acima.Lambda ungolfed
Experimente Online
fonte
Gelatina , 15 bytes
Experimente online!
-3 bytes graças a Jonathan Allan
fonte
ċ1
ser substituído porS
?[1, 2, 1]
para entrada[[1,2],[1,2,1],[2,1,1]]
enquanto[1,1]
é mais curta.05AB1E , 15 bytes
Experimente online!
fonte
Pitão, 14 bytes
Experimente aqui.
fonte