Definição
Dada uma matriz de números inteiros não negativos e um número inteiro não negativo , definimos como a função "cortar" que remove todas as linhas e todas as colunas em que contêm . M k
Exemplo:
Sua tarefa
Dada e uma soma alvo S , sua tarefa é encontrar todos os valores possíveis de k tal que a soma dos elementos restantes F_k (M) é igual a S .S k F k ( M ) S
Exemplo:
Dada a matriz acima e :
- é uma solução, porque e
- é a única outra solução possível: e
Portanto, a saída esperada seria .
Esclarecimentos e regras
- A entrada é garantida para admitir pelo menos uma solução.
- A soma dos elementos da matriz original é garantida para ser maior do que .
- Você pode assumir . Isso significa que uma matriz vazia nunca levará a uma solução.
- Os valores de podem ser impressos ou retornados em qualquer ordem e em qualquer formato razoável e inequívoco.
- Você tem permissão para não deduplicar a saída (por exemplo, ou são consideradas respostas válidas para o exemplo acima).[ 1 , 5 , 1 , 5 ]
- Este é o código-golf .
Casos de teste
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}
code-golf
array-manipulation
matrix
Arnauld
fonte
fonte
[[1,5],[1],[5],[]]
para o primeiro caso de teste) seria um meio de saída válido?Respostas:
K (ngn / k) , 39 bytes
Experimente online!
obrigado @ Adám por esta explicação :
{
…}
Função,x
é M ey
é S,/x
achatar M (estes são os k candidatos)a:
atribuir aa
x{
…}/:
Aplique a seguinte função a cada um enquanto estiver usando M como argumento fixo à esquerda (x
):x=y
Matriz booleana indicando onde os elementos de M são iguais ao candidato atual k~
negar issob:
atribuir isso ab
&/
E redução (localiza colunas sem esse k )(
…)&\:
E com cada um dos seguintes:&/'b
E redução de cada (encontra linhas sem esse k )x*
multiplique M por isso+//
grande somay=
lista de booleanos indicando onde S é igual a essas somas&
índices de Truesa@
use isso para indexar nos elementos (os k candidatos)fonte
APL (Dyalog Unicode) ,
353328 bytes SBCS-7 graças a ngn.
Infix anônimo lambda. Toma S como argumento à esquerda e M como argumento à direita.
Experimente online!
{
…}
"Dfn"⍺
e⍵
são argumentos à esquerda e à direita ( S e M ), respectivamente:⍵[
…]
Índice M com as seguintes coordenadas:⊂⍵
coloque M para tratá-lo como um único elemento⍵=
compare cada elemento (ou seja, k candidato) de M com todo esse M(
…)¨
Aplique a seguinte função tácita a cada um:∧⌿
vertical AND redução (localiza colunas sem esse k candidato)…
∘.∧
Produto booleano cartesiano com:∧/
horizontal AND redução (localiza linhas sem esse k candidato)⍵×
multiplicar M com essa máscara+/∘,
somar a matriz achatada⍺=
Booleano indicando onde S é igual a essas somas⍸
índices onde isso é verdadefonte
{M[⍸⍺={+/,(∧⌿d)/M⌿⍨∧/d←M≠⍵}¨M←⍵]}
M
quando ainda não foi criado?⍵
como⍺
no DFN interior é igualmente confundindo-me{⍵[⍸⍺=+/¨(,⍵×∧/∘.∧∧⌿)¨⍵≠⊂⍵]}
R ,
7873 bytesExperimente online!
Não classifica nem desduplica a saída.
Crédito para J.Doe & Giuseppe por -5 bytes.
fonte
Geléia ,
2019171514 bytesEste é um link monádico que usa M como argumento e lê S de STDIN.
Experimente online!
Como funciona
fonte
Haskell ,
88868477 bytesVerifique todos os casos de teste .
Explicação
fonte
Pitão ,
27 23 22 2120 bytesSuíte de teste!
Não deduplicado.
Como funciona?
fonte
Python 2 ,
114108 bytesExperimente online!
fonte
Perl 6 ,
8074 bytesExperimente online!
Explicação
fonte
05AB1E , 21 bytes
Experimente online!
Somente depois de escrever essa resposta é que vi a de Kevin . Acredito que isso seja substancialmente diferente, por isso estou publicando separadamente. Minha intuição diz que a contagem ideal de bytes é de cerca de 18, então terei que revisar isso e ver o que mais posso fazer. Com o código atual, é impossível escrever um conjunto de testes, mas eu mesmo verifiquei todos os casos de teste e os resultados estão corretos.
Algoritmo de corte
Em seguida, passa pela transposição deM e para cada coluna C , realiza a operação ( max ( C) - 1 ) | | c ∀ c ∈ C (Onde | | é o OR bit a bit de 05AB1E - a adição também deve funcionar, então substitua
~
por+
se você quiser testar isso também), o que resulta em:Finalmente, mapeia0 0 para 1 e todos os outros números inteiros para 0 0 e executa multiplicação por elementos com M :
Após o qual a soma da matriz resultante é calculada.
fonte
[[1,1,0,1],[2,0,0,2],[2,0,1,0]]
qual me atrapalhava o número1
(que remove todas as colunas ...). Na verdade, eu tinha um pouco menos de 20 na minha cabeça, além de possibilidade. Pena que quase não há componentes para matrizes, apesar dos produtos adicionados recentemente. Quanto à1|2
(1 2~
na sintaxe 05AB1E) resultante em 3, isso ocorre porque oslogical OR
atos como abinary OR
quando números diferentes de0
/1
estão envolvidos (acho / assumo).+
qualquer forma eu acho, então eu espero que não haverá problemas com ele :)05AB1E (legado) ,
2726 bytesNão classifica nem unifica o resultado.
Só funciona no legado (por enquanto), porque soma-cada parece estar fazendo algumas coisas estranhas quando parte das listas internas são números inteiros e outras são listas.
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Gelatina , 22 bytes
Experimente online!
-6 bytes usando a abordagem geral da resposta 05AB1E do Sr. Xcoder.
fonte
Carvão , 33 bytes
Experimente online! Link é uma versão detalhada do código e inclui desduplicação. Explicação:
Nivele a primeira matriz de entrada
q
na lista predefinidau
.Para cada elemento da lista, some a matriz, mas se a linha contiver o elemento, use em
0
vez de sua soma e, ao somar linhas que não contêm o elemento, se a coluna contiver o elemento, use em0
vez do valor da coluna . Isso é muito mais fácil do que filtrar os elementos, pois o carvão não pode somar uma lista vazia.fonte
Limpo , 92 bytes
Experimente online!
Explicado:
fonte
MATLAB - 80 bytes
( Corrigido e ) Compactado:
E em uma versão totalmente desenvolvida:
Obrigado aos comentários para destacar meu erro inicial. Observe que esta versão não desduplica a saída.
É possível deduplicar a saída com mais 5 bytes:
fonte