Corta la matriz para obtener la suma deseada

21

Definición

Dada una matriz de enteros no negativos y un entero no negativo , definimos como la función de "corte" que elimina todas las filas y todas las columnas en que contienen .METROkFkMETROk

Ejemplo:

METRO=(6 615 51289 985 56 60 04 4)F5 5(METRO)=(126 60 0)

Tu tarea

Dada METRO y una suma de destino S , su tarea es encontrar todos los valores posibles de k tal que la suma de los elementos restantes en Fk(METRO) es igual a S .

Ejemplo:

Dada la matriz anterior METRO y S=9 9 :

  • k=5 5 es una solución, porque F5 5(METRO)=(126 60 0) y 1+2+6 6+0 0=9 9
  • k=1 es la única otra solución posible: F1(METRO)=(5 54 4) y 5 5+4 4=9 9

Entonces el resultado esperado sería {1,5 5} .

Aclaraciones y reglas.

  • La entrada está garantizada para admitir al menos una solución.
  • La suma de los elementos de la matriz original se garantiza que sea mayor que S .
  • Puede suponer S>0 0 . Significa que una matriz vacía nunca conducirá a una solución.
  • Los valores de k pueden imprimirse o devolverse en cualquier orden y en cualquier formato razonable y sin ambigüedades.
  • Se le permite no deduplicar la salida (por ejemplo, o se consideran respuestas válidas para el ejemplo anterior).[ 1 , 5 , 1 , 5 ][1,1,5 5,5 5][1,5 5,1,5 5]
  • Este es el .

Casos de prueba

M = [[6,1,5],[1,2,8],[9,8,5],[6,0,4]]
S = 9
Solution = {1,5}

M = [[7,2],[1,4]]
S = 7
Solution = {4}

M = [[12,5,2,3],[17,11,18,8]]
S = 43
Solution = {5}

M = [[7,12],[10,5],[0,13]]
S = 17
Solution = {0,13}

M = [[1,1,0,1],[2,0,0,2],[2,0,1,0]]
S = 1
Solution = {2}

M = [[57,8,33,84],[84,78,19,14],[43,14,81,30]]
S = 236
Solution = {19,43,57}

M = [[2,5,8],[3,5,8],[10,8,5],[10,6,7],[10,6,4]]
S = 49
Solution = {2,3,4,7}

M = [[5,4,0],[3,0,4],[8,2,2]]
S = 8
Solution = {0,2,3,4,5,8}
Arnauld
fuente
¿Retener la estructura original de la matriz de entrada (por ejemplo, [[1,5],[1],[5],[]]para el primer caso de prueba) sería un medio válido de salida?
Shaggy
@ Shaggy Sí. Eso parece razonable.
Arnauld

Respuestas:

10

K (ngn / k) , 39 bytes

{a@&y=x{+//x*(&/'b)&\:&/b:~x=y}/:a:,/x}

Pruébalo en línea!

gracias @ Adám por esta explicación :

{... }función, xes M y yes S

,/x aplanar M (estos son los k candidatos)

a: asignar a a

x{... }/: aplique la siguiente función a cada uno mientras usa M como argumento izquierdo fijo ( x):

  x=y Matriz booleana que indica dónde los elementos de M son iguales al candidato k actual

  ~ negar eso

  b: asignar eso a b

  &/ Reducción AND (encuentra columnas sin esa k )

  (... )&\: Y eso con cada uno de los siguientes:

   &/'b Y reducción de cada uno (encuentra filas sin esa k )

  x* multiplicar M por eso

  +// gran suma

y= lista de booleanos que indica dónde S es igual a esas sumas

& índices de Verdades

a@ use eso para indexar en los elementos (los k candidatos)

ngn
fuente
Siéntase libre de corregir la explicación.
Adám
Los peligros de la explicación de copiar y pegar ...
Adám
6

APL (Dyalog Unicode) , 35 33 28 bytes SBCS

-7 gracias a ngn.

Anónimo infijo lambda. Toma S como argumento izquierdo y M como argumento derecho.

{⍵[⍸⍺=(+/∘,⍵×∧/∘.∧∧⌿)¨⍵≠⊂⍵]}

Pruébalo en línea!

{... } "dfn", y son argumentos izquierdo y derecho ( S y M ) respectivamente:

⍵[] Indice M con las siguientes coordenadas:

  ⊂⍵ encierra M para tratarlo como un elemento único

  ⍵= compare cada elemento (es decir, k candidato) de M con toda esa M

  ( Aplique la siguiente función tácita a cada uno:

   ∧⌿ reducción Y vertical (encuentra columnas sin ese k candidato)

∘.∧ Producto booleano cartesiano con:

    ∧/ reducción horizontal Y (encuentra filas sin ese k candidato)

   ⍵× multiplica M con esa máscara

   +/∘, suma la matriz aplanada

  ⍺= Booleano que indica dónde S es igual a esas sumas

   índices donde eso es cierto

Adán
fuente
1
{M[⍸⍺={+/,(∧⌿d)/M⌿⍨∧/d←M≠⍵}¨M←⍵]}
ngn
@ngn Gracias. Sin embargo, no usaré el global, ya que hace que el orden de evaluación sea confuso: - ¿Cómo se puede indexar Mcuando aún no se ha creado?
Adám
pasando como en el dfn interior es igualmente confuso para mí
ngn
{⍵[⍸⍺=+/¨(,⍵×∧/∘.∧∧⌿)¨⍵≠⊂⍵]}
ngn
@ngn Sí, quería hacer algo así. ¡Gracias!
Adám
6

R , 78 73 bytes

function(m,s)m[Map(function(y)sum(m[(w=-which(m==y,T))[,1],w[,2]]),m)==s]

Pruébalo en línea!

No ordena ni deduplica la salida.

Crédito a J.Doe y Giuseppe por -5 bytes.

Kirill L.
fuente
44
76 bytes
J.Doe
44
@ J.Doe 73 bytes
Giuseppe
5

Jalea , 20 19 17 15 14 bytes

pZnⱮFȦ€€ḋFẹƓịF

Este es un enlace monádico que toma M como argumento y lee S desde STDIN.

Pruébalo en línea!

Cómo funciona

pZnⱮFȦ€€ḋFẹƓịF  Main link. Argument: M

 Z              Zip; transpose the rows and columns of M.
p               Take the Cartesian product of M and its transpose, yielding all pairs
                (r, c) of rows and columns of M.
    F           Flatten; yield the elements of M.
  nⱮ            Not equal map; for each element e of M, compare the elements of the
                pairs (r, c) with e.
     Ȧ€€        All each each; for each array of Booleans corresponding to an (r, c)
                pair, test if all of them are true.
         F      Flatten; yield the elements of M.
        ḋ       Take the dot product of each list of resulting Booleans and the
                elements of M.
           Ɠ    Read an integer S from STDIN.
          ẹ     Find all indices of S in the dot products.
             F  Flatten; yield the elements of M.
            ị   Retrieve the elements of the right at the indices from the left.
Dennis
fuente
Marque mis palabras jajaja :) Buena respuesta, +1
Sr. Xcoder
5

Haskell , 88 86 84 77 bytes

m!s=[k|k<-m>>=id,s==sum[x|r<-m,all(/=k)r,(i,x)<-zip[0..]r,all((/=k).(!!i))m]]

Verifique todos los casos de prueba .

Explicación

m ! s =                                         -- function !, taking m and s as input
    [k |                                        -- the list of all k's such that
        k <- m >>= id,                          -- * k is an entry of m
        s == sum                                -- * s equals the sum of
            [x |                                --     the list of x's such that
                r <- m,                         --     * r is a row of m
                all (/= k) r,                   --     * r does not contain k
                (i, x) <- zip [0 ..] r,         --     * i is a valid column index; also let x = r[i]
                all ((/= k) . (!! i)) m         --     * none of the rows contain k at index i
            ]
    ]
Delfad0r
fuente
¿Debería decir "función f"?
Quintec
1
@Quintec De hecho, debería haberlo hecho, pero lo cambié a "función". para ahorrar 2 bytes gracias a BWO
Delfad0r
5

Pyth ,  27 23 22 21  20 bytes

fqvzss.DRsxLTQ-I#TQs

¡Banco de pruebas!

No deduplica.

¿Cómo funciona?

fqvzss.DRsxLTQ-I#TQs     Full program.
f                  s     Flatten M and keep only those elements T which satisfy:
 qvzss.DRsxLTQ-I#TQ      The filtering function. Breakdown:
              -I#TQ      Discard the rows that contain T. More elaborate explanation:
                # Q         |-> In M, keep only those elements that are...
               I            |-> Invariant under (equal to themselves after...)
              -  T          |-> Removing T.
                         Let's call the result of this expression CR (chopped rows).
          xLTQ           Map over the rows M and retrieve all indices of T.
         s               Collect indices in 1D list (flatten). Call this I.
      .DR                For each row left in CR, remove the elements at indices in I.
    ss                   Sum all the elements of this matrix flattened.
 qvz                     And then finally check whether they equal S.
Sr. Xcoder
fuente
4

Python 2 , 114108 bytes

lambda m,s:{a for a in sum(m,[])if s==sum(v for l in m for i,v in enumerate(l)if{a}-set(l)-set(zip(*m)[i]))}

Pruébalo en línea!

TFeld
fuente
4

Perl 6 , 80 74 bytes

->\m,\s{grep {s==sum m[m.$_;[[Z](m).$_]]}o{*.grep(:k,!*.grep($_))},m[*;*]}

Pruébalo en línea!

Explicación

->\m,\s{...}  # Anonymous block taking arguments m and s
  grep {...}o{...},m[*;*]   # Filter matrix elements
                            # with combination of two functions
    *.grep(:k,!*.grep($_))  # (1) Whatever code returning matching rows
    s==sum m[               # (2) s equals sum of elements
      m.$_;                 #     in matched rows
      [                     #     (array supporting multiple iterations)
       [Z](m).$_            #     and matched columns (matched rows
                            #     of m transposed with [Z])
      ]
    ]
nwellnhof
fuente
3

05AB1E , 21 bytes

²˜ʒQεZ+}øεZ<~}ø_*OO¹Q

Pruébalo en línea!

Solo después de escribir esta respuesta, vi la de Kevin . Creo que esto es sustancialmente diferente, así que lo publico por separado. Mi intuición dice que el conteo de bytes óptimo es de alrededor de 18, así que tendré que volver a visitar esto y ver qué más puedo hacer. Con el código actual, es imposible escribir un conjunto de pruebas, pero yo mismo he verificado todos los casos de prueba y los resultados son correctos.

Algoritmo de Recorte

k=5 5

METRO=(6 615 51289 985 56 60 04 4)

k

(0 00 010 00 00 00 00 010 00 00 0)

METRORmax(R)R

(1120 00 00 01120 00 00 0)

METROdo(max(do)-1) El |El | do  dodoEl |El |~+

(1130 00 011130 00 01)

0 010 0METRO

(0 00 00 0110 00 00 00 0110 0)(0 00 00 0120 00 00 00 06 60 00 0)

Después de lo cual se calcula la suma de la matriz resultante.

Sr. Xcoder
fuente
1
¡Buena respuesta! Sabía que el mío sería golfable con seguridad. Ya estaba lo suficientemente feliz como para que funcionara, incluido el molesto caso [[1,1,0,1],[2,0,0,2],[2,0,1,0]]que me atormentó por el número 1(que elimina cada columna ...) De hecho, tenía un poco menos de 20 en mi cabeza, así como la posibilidad. Lástima que apenas haya incorporados matrices, a pesar de los productos agregados recientemente. En cuanto al 1|2( 1 2~en 05AB1E Synthax) que resulta en 3, esto se debe a que logical ORactúa como un binary ORcuando otros números que no están 0/ 1están involucrados (creo / asumo).
Kevin Cruijssen
@KevinCruijssen ¡Oh, tienes razón! Entonces, los documentos deben escribir OR bit a bit , no OR lógico . Voy a tener que corregir eso pronto. De todos modos, bitwise O debería funcionar tan bien, creo. +Supongo que puede reemplazarse de todos modos, así que espero que no haya problemas con él :)
Sr. Xcoder
2

05AB1E (heredado) , 27 26 bytes

˜ʒ©¹ε®å_}¹ζʒ®å_}ζ‚ζ€€OPOIQ

No clasifica ni descalifica el resultado.
Solo funciona en el legado (por ahora), porque la suma de cada uno parece estar haciendo algunas cosas extrañas cuando parte de las listas internas son enteros y otras son listas ...

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

˜              # Flatten the (implicit) matrix-input
               #  i.e. [[6,1,5],[1,2,8],[9,8,5],[6,0,4]] → [6,1,5,1,2,8,9,8,5,6,0,4]
 ʒ             # Filter this list by:
  ©            #  Store the current value in a register-variable
   ¹           #  Take the matrix-input
    ε   }      #  Map it to:
     ®å_       #   0 if the current number is in this row, 1 if not
               #    i.e. [[6,1,5],[1,2,8],[9,8,5],[6,0,4]] and 6 → [0,1,1,0]
   ¹           #  Take the matrix-input again
    ζ          #  Swap its rows and columns
               #   i.e. [[6,1,5],[1,2,8],[9,8,5],[6,0,4]] → [[6,1,9,6],[1,2,8,0],[5,8,5,4]]
     ʒ   }     #  Filter it by:
      ®å_      #   Only keep the inner lists that does not contain the current number
               #    i.e. [[6,1,9,6],[1,2,8,0],[5,8,5,4]] and 6 → [[1,2,8,0],[5,8,5,4]]
               #    i.e. [[1,2,2],[1,0,0],[0,0,1],[1,2,0]] and 1 → []
          ζ    #  After filtering, swap it's rows and columns back again
               #   i.e. [[1,2,8,0],[5,8,5,4]] → [[1,5],[2,8],[8,5],[0,4]]
   ‚ζ          #  Pair both lists together and zip them
               #   i.e. [0,1,1,0] and [[1,5],[2,8],[8,5],[0,4]]
               #    → [[0,[1,5]],[1,[2,8]],[1,[8,5]],[0,[0,4]]]
               #   i.e. [0,1,0] and [] → [[0,' '],[1,' '],[0,' ']]
              #  Map each inner list / value to:
      O       #   Sum each
               #    i.e. [[0,[1,5]],[1,[2,8]],[1,[8,5]],[0,[0,4]]]
               #     → [[0,6],[1,10],[1,13],[0,4]]
               #    i.e. [[0,' '],[1,' '],[0,' ']]
               #     → [[0,0],[1,0],[0,0]]
               #  (NOTE: For most test cases just `O` instead of `€€O` would be enough,
               #   but not if we removed ALL zipped inner lists for a number, like the 
               #   second example above with input [[1,1,0,1],[2,0,0,2],[2,0,1,0]] and 1)
        P      #  Now take the product of each inner list
               #   i.e. [[0,6],[1,10],[1,13],[0,4]] → [0,10,13,0]
         O     #  Then take the sum of those
               #   i.e. [0,10,13,0] → 23
          IQ   #  And only keep those that are equal to the number-input
               #   i.e. 23 and 9 → 0 (falsey), so it's removed from the flattened input
Kevin Cruijssen
fuente
1

Jalea , 22 bytes

=+Ṁ$€Z$⁺’¬×⁸FS
F³ç=⁹ƲƇ

Pruébalo en línea!

-6 bytes usando el enfoque general de la respuesta 05AB1E del Sr. Xcoder.

Hiperneutrino
fuente
1

Carbón , 33 bytes

FθFι⊞υκIΦυ⁼ηΣEθ∧¬№λιΣEλ∧¬№Eθ§πξιν

Pruébalo en línea! El enlace es a una versión detallada del código e incluye deduplicación. Explicación:

FθFι⊞υκ

Acoplar la primera matriz de entrada qen la lista predefinida u.

  υ                          Flattened array
 Φ                           Filter elements
       θ                     Input array
      E                      Map over rows
            ι                Current element
           λ                 Current row
          №                  Count matching elements
         ¬                   Logical Not
        ∧                    Logical And
               λ             Current row
              E              Map over columns
                    θ        Input array
                   E         Map over rows
                      π      Inner row
                       ξ     Column index
                     §       Inner element
                        ι    Current element
                  №          Count matching elements
                 ¬           Logical Not
                ∧            Logical And
                         ν   Current element
             Σ               Sum
     Σ                       Sum
    η                        Second input
   ⁼                         Equals
I                            Cast to string
                             Implicitly print each result on its own line

Para cada elemento de la lista, sume la matriz, pero si la fila contiene el elemento, use en 0lugar de su suma, y ​​al sumar filas que no contengan el elemento, si la columna contiene el elemento, use en 0lugar del valor de la columna . Esto es un poco más golfístico que filtrar los elementos, ya que el carbón no puede sumar una lista vacía.

Neil
fuente
1

Limpio , 92 bytes

import StdEnv
$m s=[c\\r<-m,c<-r|sum[b\\a<-m|all((<>)c)a,b<-a&x<-[0..]|all(\u=u!!x<>c)m]==s]

Pruébalo en línea!

Explicado:

$ m s                       // the function $ of `m` and `s`
 = [                        // is equal to
  c                         // the value `c`
  \\ r <- m                 // for every row `r` in `m`
  , c <- r                  // for every value `c` in `r`
  | sum [                   // where the sum of
   b                        // the value `b`
   \\ a <- m                // for every row `a` in `m`
   | all ((<>)c) a          // where `c` isn't in `a`
   , b <- a                 // for every value `b` in `a`
   & x <- [0..]             // with every column index `x` from zero
   | all (\u = u!!x <> c) m // where `c` isn't in column `x`
  ] == s                    // equals `s`
 ]
Οurous
fuente
1

MATLAB - 80 bytes

( Corregido y ) Compactado:

function f(M,s);for k=M(:)';if sum(sum(M(~sum(M==k,2),~sum(M==k))))==s;k,end;end

Y en una versión completamente desarrollada:

function getthesum(M,s)

for k=M(:)'                         % For each element of M
    x = M==k ;                      % Index elements equal to "k"
    N = M( ~sum(x,2) , ~sum(x) ) ;  % New matrix with only the appropriate rows/columns
    if sum(sum(N))==s               % sum rows and columns and compare to "s"
        k                           % display "k" in console if "k" is valid
    end
end

Gracias a los comentarios para resaltar mi error inicial. Tenga en cuenta que esta versión no deduplica la salida.

Es posible deduplicar la salida con 5 bytes más:

% This will only cycle through the unique elements of 'M' (85 bytes):

function f(M,s);for k=unique(M)';if sum(sum(M(~sum(M==k,2),~sum(M==k))))==s;k,end;end
Hoki
fuente
1
k podría ser cualquier elemento de la matriz.
Dennis
@ Dennis, oops, eso es correcto ... Lo malo, lo corregiré más tarde hoy. Gracias por mencionarlo.
Hoki
1
@Arnauld. Lo siento, estaba de vacaciones, eso se arregló ahora.
Hoki