Taglia la matrice per ottenere la somma desiderata


21

Definizione

Data una matrice M di numeri interi non negativi e un numero intero non negativo K , definiamo Fk come funzione "chop-off" che rimuove tutte le righe e tutte le colonne in M che contengono .k

Esempio:

M=(615128985604)F5(M)=(1260)

Il tuo compito

Dato e una somma bersaglio S , il vostro compito è quello di trovare tutti i possibili valori di k tale che la somma degli elementi rimanenti F_k (M) è pari a S .S k F k ( M ) SMSkFk(M)S

Esempio:

Data la matrice sopra e :S = 9MS=9

  • k=5 è una soluzione, perché e 1 + 2 + 6 + 0 = 9F5(M)=(1260)1+2+6+0=9
  • k=1 è l'unica altra soluzione possibile: eF1(M)=(54)5+4=9

Quindi l'output previsto sarebbe .{1,5}

Chiarimenti e regole

  • L'ingresso è garantito per ammettere almeno una soluzione.
  • La somma degli elementi della matrice originale è garantita per essere maggiore di .S
  • Puoi assumere . Significa che una matrice vuota non porterà mai a una soluzione.S>0
  • I valori di possono essere stampati o restituiti in qualsiasi ordine e in qualsiasi formato ragionevole e inequivocabile.k
  • È consentito non deduplicare l'output (es. o sono considerati risposte valide per l'esempio sopra).[ 1 , 5 , 1 , 5 ][1,1,5,5][1,5,1,5]
  • Questo è .

Casi test

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}

Il mantenimento della struttura originale dell'array di input (ad es. [[1,5],[1],[5],[]]Per il primo caso di test) sarebbe un valido mezzo di output?
Shaggy

@Shaggy Sì. Sembra ragionevole.
Arnauld,

Risposte:


10

K (ngn / k) , 39 byte

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

Provalo online!

grazie @Adám per questa spiegazione :

{... }funzione, xè M ed yè S

,/x appiattisci M (questi sono i k candidati)

a: assegnato a a

x{... }/: applica la seguente funzione a ciascuna mentre usi M come argomento sinistro fisso ( x):

  x=y Matrice booleana che indica dove gli elementi di M equivalgono all'attuale k candidato

  ~ negalo

  b: assegnalo a b

  &/ Riduzione AND (trova colonne senza quella k )

  (... )&\: E quello con ciascuno dei seguenti:

   &/'b E riduzione di ciascuno (trova le righe senza quella k )

  x* moltiplicare M per quello

  +// grande somma

y= elenco di valori booleani che indicano dove S è uguale a tali somme

& indici di Trues

a@ usalo per indicizzare gli elementi (i k candidati)


Sentiti libero di correggere la spiegazione.
Adám,

I pericoli della spiegazione di copia e incolla ...
Adám,

6

APL (Dyalog Unicode) , 35 33 28 byte SBCS

-7 grazie a ngn.

Infografica anonima lambda. Prende S come argomento di sinistra e M come argomento di destra.

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

Provalo online!

{... } "dfn", e sono rispettivamente argomenti sinistro e destro ( S e M ):

⍵[] Indice M con le seguenti coordinate:

  ⊂⍵ racchiudere M per trattarlo come un singolo elemento

  ⍵= confrontare ogni elemento (cioè k candidato) di M con quella intera M

  (...  applica la seguente funzione tacita a ciascuno:

   ∧⌿ riduzione AND verticale (trova colonne senza quel k candidato)

∘.∧ Prodotto booleano cartesiano con:

    ∧/ riduzione AND orizzontale (trova righe senza quel k candidato)

   ⍵× moltiplica M con quella maschera

   +/∘, sommare la matrice appiattita

  ⍺= Booleano che indica dove S è uguale a tali somme

   indici in cui è vero


1
{M[⍸⍺={+/,(∧⌿d)/M⌿⍨∧/d←M≠⍵}¨M←⍵]}
ngn,

@ngn Grazie. Non userò il globale, tuttavia, poiché confonde l'ordine di valutazione: - Come si può indicizzare Mquando non è stato ancora creato?
Adám,

passare come nel dfn interiore è ugualmente confuso per me
ngn

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

@ngn Sì, volevo fare qualcosa del genere. Grazie!
Adám,


5

Gelatina , 20 19 17 15 14 byte

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

Questo è un collegamento monadico che prende M come argomento e legge S da STDIN.

Provalo online!

Come funziona

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.

Segna le mie parole lol :) Bella risposta, +1
Mr. Xcoder,

5

Haskell , 88 86 84 77 byte

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

Verifica tutti i test .

Spiegazione

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
            ]
    ]

Dovrebbe dire "funzione f"?
Quintec,

1
@Quintec In effetti avrebbe dovuto, ma l'ho cambiato in "funzione!" per salvare 2 byte grazie a BWO
Delfad0r

5

Pyth ,  27 23 22 21  20 byte

fqvzss.DRsxLTQ-I#TQs

Suite di test!

Non deduplica.

Come funziona?

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.


4

Perl 6 , 80 74 byte

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

Provalo online!

Spiegazione

->\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])
      ]
    ]

3

05AB1E , 21 byte

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

Provalo online!

Solo dopo aver scritto questa risposta ho visto Kevin . Credo che questo sia sostanzialmente diverso, quindi lo sto postando separatamente. La mia intuizione dice che il conteggio dei byte ottimale è di circa 18, quindi dovrò rivisitare questo e vedere cos'altro posso fare. Con il codice attuale, è impossibile scrivere una suite di test ma ho verificato personalmente tutti i casi di test e i risultati sono corretti.

Algoritmo di ritaglio

K=5

M=(615128985604)

K

(001000001000)

MRmax(R)R

(112000112000)

Quindi, passa attraverso la trasposizione di M e per ogni colonna C, esegue l'operazione (max(C)-1) || c  cC (dove ||è OR bit per bit di 05AB1E - anche l'addizione dovrebbe funzionare, quindi sostituiscila ~con +se vuoi testare anche quella), che si traduce in:

(113001113001)

Infine, mappa 0 a 1 e tutti gli altri numeri interi a 0 ed esegue la moltiplicazione degli elementi con M:

(000110000110)(000120000600)

Dopo di che viene calcolata la somma della matrice risultante.


1
Bella risposta! Sapevo che il mio sarebbe stato sicuramente giocabile a golf. Ero già abbastanza felice di farlo funzionare, incluso il fastidioso caso in [[1,1,0,1],[2,0,0,2],[2,0,1,0]]cui mi ha fregato per il numero 1(che rimuove ogni colonna ..) In effetti avevo leggermente meno di 20 nella mia testa e possibilità. Peccato che non ci siano quasi nessun builtin per matrici, nonostante quelli aggiunti di recente. Per quanto riguarda il 1|2( 1 2~nel sintassi 05AB1E) risultante in 3, questo è perché si logical ORcomporta come un binary ORquando sono coinvolti numeri diversi da 0/ 1(penso / presumo).
Kevin Cruijssen,

@KevinCruijssen Oh hai ragione! Quindi, i documenti dovrebbero scrivere OR bit per bit , non OR logico . Dovrò correggerlo presto. Ad ogni modo, penso che anche OR bit per bit dovrebbe funzionare. Può essere sostituito da +comunque suppongo, quindi spero che non ci saranno problemi :)
Mr. Xcoder,

2

05AB1E (legacy) , 27 26 byte

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

Non ordina né unifica il risultato.
Funziona solo nell'eredità (per ora), perché la somma-ciascuno sembra fare alcune cose strane quando parte degli elenchi interni sono numeri interi e altri sono elenchi.

Provalo online o verifica tutti i casi di test .

Spiegazione:

˜              # 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


1

Carbone , 33 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice e include la deduplicazione. Spiegazione:

FθFι⊞υκ

Appiattire il primo array di input qnell'elenco predefinito 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

Per ogni elemento dell'elenco, sommare l'array, ma se la riga contiene l'elemento, utilizzare 0invece della sua somma e quando si sommano le righe che non contengono l'elemento, se la colonna contiene l'elemento, utilizzare 0invece il valore della colonna . Questo è leggermente più golfoso del filtraggio degli elementi poiché il carbone non può sommare un elenco vuoto.


1

Pulito , 92 byte

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]

Provalo online!

Ha spiegato:

$ 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`
 ]

1

MATLAB - 80 byte

( Corretto e ) compattato:

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

E in una versione completamente sviluppata:

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

Grazie ai commenti per evidenziare il mio errore iniziale. Si noti che questa versione non duplica l'output.

È possibile deduplicare l'output con altri 5 byte:

% 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

1
k potrebbe essere qualsiasi elemento della matrice.
Dennis,

@Dennis, oops, è vero ... Mio Dio, lo correggerò più tardi oggi. Grazie per segnalarlo.
Hoki,

1
@Arnauld. Mi dispiace che ero in vacanza, che ora è stato risolto.
Hoki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.