(Adaptado del problema C del primer calificador del Concurso de programación ACM de 2012/2013 )
Tiene varias matrices, llamadas A 1 , A 2 , ..., A n , cada una ordenada en orden ascendente. Cada elemento de la matriz será un entero de 32 bits.
Un sándwich es un conjunto de índices j 1 , j 2 , ..., j n tal que A 1 [j 1 ] ≤ A 2 [j 2 ] ≤ .... ≤ A n [j n ].
A i [0] es el primer elemento de A i .
Dados algunos arreglos, genere todos los emparedados posibles que pueda obtener de esos arreglos, separados por una nueva línea.
Si de alguna manera hay una función incorporada que hace esto en su idioma, no la use.
La entrada se puede dar de cualquier manera, la salida se debe separar con espacios en blanco, pero se puede dar en cualquier orden.
Caso de prueba:
[[1, 5, 7, 10], [2, 6, 6, 8, 12], [4, 5, 9]]
Salida:
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 prueba:
[[10, 20, 30], [1, 2, 3]]
Salida:
El código más corto gana.
fuente
Respuestas:
APL (33)
La entrada se lee desde el teclado, pero debe darse como una lista APL, es decir
Explicación:
B←,⍳⊃∘⍴¨A←⎕
: A es la entrada evaluada, B es todos los conjuntos posibles de índices en las listas dadas en A.{(⍳⍴A)∘≡⍋⍵⌷¨A}¨B
: para cada conjunto de índices, obtenga los valores de las listas (⍵⌷¨A
) y vea si están ordenados ((⍳⍴A)∘=⍋
)B/⍨
: seleccione de B todos los conjuntos de índices donde la expresión anterior era verdadera (es decir, todos los sándwiches)1-⍨
: resta uno de todos los índices, porque esta pregunta supone que las matrices basadas en 0 y las matrices APL están basadas en 1 por defecto.↑
: organiza la lista de conjuntos de índices como una matriz (de modo que cada conjunto esté en su propia línea)fuente
Mathematica
120130Editar
Esta versión funciona con matrices de diferentes tamaños.
Uso
Explicación
Usando el primer ejemplo de arriba,
MapIndexed
establece índices para todos los elementos. NB: Mathematica comienza a contar con 1. (Luego lo tendremos en cuenta).Outer
genera todas las listas, cada una candidata como un conjunto de sándwiches y los índices de sus elementos;%
contiene los resultados de la salida anterior. Los números,10
y22
que destaqué después de que salieron, se refieren a una matriz de sándwich{10,22}
que aún no se ha identificado como tal.Cases
prueba cada elemento de lo anterior para determinar si seLessEqual
cumple una relación (menor o igual). Los resultados que se muestran a continuación son aquellos casos en los que se detectaron emparedados de matriz. Una vez más, destaqué{10,22}
en la salida.%%
se refiere a los penúltimos resultados.:>
, [RuleDelayed] devuelve las partes de las instancias de interés, a saber, los índices de los sandwiches de matriz.-1
corrige el hecho de que Mathematica comienza matrices con 1 en lugar de 0.X_ /; LessEqual @@ x [[All, 1]] == True:> x [[All, 2, 2]] - 1]
Grid
muestra los resultados en una cuadrícula. La primera fila0 1
significa que el elemento 0 de la primera sublista (es decir, 10 ) y el elemento 1 de la segunda sublista (es decir, 22 ) constituyen el primer conjunto sándwich que se encontró.fuente
LessEqual
trabajar con matrices de tamaño indeterminado. Puede haber otros casos en los que la misma suposición impida la generalidad. Cuando tenga la oportunidad, generalizaré el enfoque.GolfScript, 51 caracteres
Entrada de ejemplo (en stdin):
Ejemplo de salida (a stdout):
(Tenga en cuenta que la entrada debe darse sin comas, de lo contrario, el programa probablemente se bloqueará).
Supongo que debería agregar alguna explicación sobre cómo funciona este código:
~:A
solo evalúa la entrada como código GolfScript y asigna el resultado (una matriz de matrices) aA
. También deja una copia deA
en la pila para el siguiente paso.{,}%
reemplaza cada subconjunto con su longitud, y{*}*
multiplica esas longitudes juntas, dando el número total de posibles candidatos sandwich. Este número luego se convierte,
en una matriz de tantos enteros sucesivos a partir de 0.{A{,.@.@/\@%}%\;}%
convierte cada número en un candidato emparedado correspondiente (es decir, una matriz de índices válidos en cada sub-matriz enA
). Por ejemplo, dada la entrada anterior,0
se asignaría a[0 0 0]
,1
a[1 0 0]
,2
a[2 0 0]
,3
a[3 0 0]
,4
a ,[0 1 0]
etc. (Averiguar exactamente cómo se logra el código que se deja como ejercicio para el lector interesado).{:k,,{.A=\k==}%.$=},
filtra los candidatos sandwich al mapear cada uno de ellos con los elementos correspondientes de las sub-matrices deA
(de modo que, por ejemplo[0 0 0]
, produciría[1 2 4]
,[1 0 0]
produciría[5 2 4]
, y así sucesivamente, para la entrada anterior), clasifica la matriz resultante y la compara con una copia no ordenada . Si son iguales, la matriz ya estaba ordenada y, por lo tanto, el candidato es un sándwich.Finalmente,
`
solo convierte la matriz filtrada de sándwiches en una cadena para la salida.fuente
R - 89 caracteres
dónde
o
fuente
Pitón,
149141140Python tiene una biblioteca útil de itertools que puede generar permutaciones. Esto solo itera sobre todas las permutaciones posibles de índices válidos y verifica si satisfacen los criterios.
Creo que puedo acortar esto, aún trabajando en ello.
Editar: ¡Ahora todas una línea para su lectura (en) conveniencia!
fuente
r=range
salvará un personaje.Python 120
... todavía pienso, "enumerar" es una palabra muy larga.
fuente
GolfScript (44 caracteres)
Mismo formato de entrada y salida que la entrada de Ilmari.
Manifestación
Desglose en bruto:
Asigna cada fila de entrada en una matriz de pares
[value index]
Doblar un producto cartesiano sobre las filas
Filtre a aquellos cuyas entradas 0th, 2nd, 4th, etc. no disminuyan.
Asigne cada uno a sus entradas 1ra, 3ra, 5ta, etc.
fuente
Q, 43
fuente