(Adaptado do Problema C do primeiro qualificador do Concurso de Programação ACM de 2012/2013 )
Você tem várias matrizes, denominadas A 1 , A 2 , ..., A n , cada uma classificada em ordem crescente. Cada item da matriz será um número inteiro de 32 bits.
Um sanduíche é um conjunto de índices j 1 , j 2 , ..., j n de modo que A 1 [j 1 ] ≤ A 2 [j 2 ] ≤ .... ≤ A n [j n ].
A i [0] é o primeiro elemento de A i .
Dadas algumas matrizes, produza todos os sanduíches possíveis que você puder obter dessas matrizes, separados por uma nova linha.
Se houver alguma função interna que faça isso no seu idioma, não a utilize.
A entrada pode ser fornecida de qualquer forma, a saída deve ser separada por espaços em branco, mas pode ser fornecida em qualquer ordem.
Caso de teste:
[[1, 5, 7, 10], [2, 6, 6, 8, 12], [4, 5, 9]]
Resultado:
0 0 0
0 0 1
0 0 2
0 1 2
0 2 2
0 3 2
1 1 2
1 2 2
1 3 2
2 3 2
Caso de teste:
[[10, 20, 30], [1, 2, 3]]
Resultado:
O menor código vence.
fonte
Respostas:
APL (33)
A entrada é lida no keyboad, mas deve ser fornecida como uma lista de APL, ou seja,
Explicação:
B←,⍳⊃∘⍴¨A←⎕
: A é entrada avaliada, B é todos os conjuntos possíveis de índices nas listas fornecidas em A.{(⍳⍴A)∘≡⍋⍵⌷¨A}¨B
: para cada conjunto de índices, obtenha os valores das listas (⍵⌷¨A
) e veja se eles estão classificados ((⍳⍴A)∘=⍋
)B/⍨
: selecione de B todos os conjuntos de índices onde a expressão anterior era verdadeira (ou seja, todos os sanduíches)1-⍨
: subtraia um de todos os índices, porque esta pergunta assumiu que matrizes baseadas em 0 e matrizes de APL são baseadas em 1 por padrão.↑
: organize a lista de conjuntos de índices como uma matriz (para que cada conjunto esteja em sua própria linha)fonte
Mathematica
120130Editar
Esta versão funciona com matrizes de tamanhos variados.
Uso
Explicação
Usando o primeiro exemplo de cima,
MapIndexed
define índices para todos os elementos. NB: O Mathematica começa a contar com 1. (Mais tarde, levaremos isso em conta.)Outer
gera todas as listas, cada uma candidata como uma matriz sanduíche, e os índices de seus elementos;%
contém os resultados da saída anterior. Os números,10
e22
que destaquei após a saída, referem-se a uma matriz sanduíche{10,22}
que ainda não foi identificada como tal.Cases
testa cada elemento acima para determinar se uma relaçãoLessEqual
(menor ou igual) é válida. Os resultados mostrados abaixo são aqueles em que os sanduíches de matriz foram detectados. Mais uma vez, destaquei{10,22}
na saída.%%
refere-se aos penúltimos resultados.:>
, [RuleDelayed] retorna essas partes das instâncias de interesse, ou seja, os índices dos sanduíches da matriz.-1
corrige o fato de o Mathematica iniciar matrizes com 1 em vez de 0.x_ /; LessEqual @@ x [[Todos, 1]] == Verdadeiro:> x [[Todos, 2, 2]] - 1]
Grid
exibe os resultados em uma grade. A primeira linha0 1
significa que o elemento 0 da primeira sub-lista (ou seja, 10 ) e o elemento 1 da segunda sub-lista (ou seja 22 ) constituem a primeira matriz sanduíche encontrada.fonte
LessEqual
trabalhar com matrizes de tamanho indeterminado. Pode haver outros casos em que a mesma suposição impede a generalidade. Quando tiver uma chance, generalizarei a abordagem.GolfScript, 51 caracteres
Exemplo de entrada (em stdin):
Exemplo de saída (para stdout):
(Observe que a entrada deve ser fornecida sem vírgulas; caso contrário, o programa provavelmente travará.)
Acho que devo adicionar alguma explicação sobre como esse código funciona:
~:A
apenas avalia a entrada como código GolfScript e atribui o resultado (uma matriz de matrizes) aA
. Ele também deixa uma cópiaA
na pilha para a próxima etapa.{,}%
substitui cada sub-matriz pelo seu comprimento e{*}*
multiplica esses comprimentos juntos, fornecendo o número total de possíveis candidatos a sanduíche. Esse número é então convertido por,
em uma matriz com tantos números inteiros sucessivos começando em 0.{A{,.@.@/\@%}%\;}%
converte cada número em um candidato sanduíche correspondente (ou seja, uma matriz de índices válidos em cada sub-matriz emA
). Por exemplo, dada a entrada acima,0
seria mapeada para[0 0 0]
,1
para[1 0 0]
,2
para[2 0 0]
,3
para[3 0 0]
,4
para[0 1 0]
e assim por diante. (Descobrir exatamente como o código realiza isso é deixado como um exercício para o leitor interessado.){:k,,{.A=\k==}%.$=},
filtra os candidatos a sanduíche mapeando cada um deles para os elementos correspondentes das sub-matrizes deA
(para que, por exemplo[0 0 0]
, produza[1 2 4]
,[1 0 0]
produza[5 2 4]
e assim por diante, para a entrada acima), classificando a matriz resultante e comparando-a com uma cópia não classificada . Se forem iguais, a matriz já foi classificada e, portanto, o candidato é realmente um sanduíche.Finalmente,
`
apenas transforma a matriz filtrada de sanduíches em uma sequência de saída.fonte
R - 89 caracteres
Onde
ou
fonte
Pitão,
149141140O Python possui uma biblioteca de ferramentas úteis que pode gerar permutações. Isso apenas repete todas as permutações possíveis de índices válidos e verifica se eles atendem aos critérios.
Eu acho que posso fazer isso mais curto, ainda trabalhando nisso.
Edit: Agora, toda uma linha para a sua leitura (in) conveniência!
fonte
r=range
irá salvar um caractere.Python 120
... ainda pensa, "enumerar" é uma palavra muito longa.
fonte
GolfScript (44 caracteres)
O mesmo formato de entrada e saída da entrada de Ilmari.
Demo
Repartição aproximada:
Mapeie cada linha de entrada em uma matriz de pares
[value index]
Dobre um produto cartesiano sobre as linhas
Filtre para aqueles cujas entradas 0, 2, 4, etc. não são decrescentes.
Mapeie cada um deles até as entradas 1, 3, 5, etc.
fonte
Q, 43
fonte