Minha matriz deve ser igual a isso, mas não!

21

Dada uma matriz de números inteiros aque contém n números inteiros e um único inteiro x; remova a menor quantidade de elementos de apara fazer a soma aigual a x. Se nenhuma combinação de for apossível x, retorne um valor falso.

Como apontado em um comentário, este é o conjunto máximo com uma soma de x , desculpe meu cérebro matemático menor. Eu esqueci muitos termos desde a faculdade.


Exemplos (Truthy):

f([1,2,3,4,5,6,7,8,9,10], 10) = [1,2,3,4]

f([2,2,2,2,2,2,2,2,2], 10) = [2,2,2,2,2]

f([2,2,2,2,-2,-2,-2,-4,-2], -8) = [2,2,-2,-2,-2,-4,-2]

f([-2,-4,-2], -6) = [-4,-2] OR [-2,-4]

f([2,2,2,4,2,-2,-2,-2,-4,-2], 0) = [2,2,2,4,2,-2,-2,-2,-4,-2] (Inalterado)

f([], 0) = [] (Caso inalterado de soma zero)


Exemplos (Falsy, qualquer valor consistente sem matriz):

Impossível argumentar: f([-2,4,6,-8], 3) = falsy (E.G. -1)

Caso de soma zero: f([], non-zero number) = falsy (E.G. -1)

  • Nota: qualquer valor como [-1]não pode ser válido para falsidade, pois é uma saída de verdade em potencial.

Regras:

  • A entrada pode ser obtida em forma de matriz ou como uma lista de argumentos, sendo o último ou o primeiro x.
  • Saída pode ser qualquer lista delimitada de números inteiros. EG 1\n2\n3\nou [1,2,3].
  • Qualquer valor pode ser usado como um indicador falso, além de uma matriz de números inteiros.
  • Seu código deve maximizar o tamanho da matriz final, a ordem não importa.
    • EG Para f([3,2,3],5)ambos [2,3]e [3,2]são igualmente válidos.
    • Por exemplo, f([1,1,2],2)você só pode retornar [1,1]como [2]é mais curto.
  • A soma ae o valor de xserão menores que 2^32-1e maiores que -2^32-1.
  • Isso é , vitórias mais baixas na contagem de bytes.
  • Se houver vários subarrays do mesmo tamanho que são válidos, é não aceitável para a saída de todos eles. Você deve escolher um único e produzir esse.

Deixe-me saber se isso foi publicado, não foi possível encontrá-lo.

Posts que encontrei assim : relacionados, mas fechados , ...

Urna de polvo mágico
fonte
1
Suponho que "Falsy, qualquer valor consistente que não seja da matriz" inclui gerar um erro?
Jonathan Allan
" Qualquer valor pode ser usado como um indicador falso, além de uma matriz de números inteiros. " Isso inclui uma matriz vazia?
Shaggy
@shaggy [] é indicativo de um valor potencial de verdade, certo? Permitir que essa meta regra seja mais importante do que verdade e falsidade distintas?
Magia Octopus Urna
@JohnathanAllan se esse erro não puder ser gerado em um cenário de verdade - eu suponho. Mas acho que isso está intencionalmente tentando esticar as especificações. Se eu mudar a redação do indicador para retornar o valor, tudo bem?
Magia Octopus Urna
Eu acredito que valores de saída consistentes contam como um valor de retorno embora por meta?
Magia Octopus Urna

Respostas:

7

Braquilog , 8 bytes

h⊇.+~t?∧

Experimente online!

Resposta mensal do Brachylog. Retorna false.se não for possível.

Explicação

h⊇.           The output is a subset of the head of the input
  .+~t?       The sum of the elements of the output must equal the tail of the input
       ∧      (Avoid implicit unification between the output and the input)
Fatalizar
fonte
6

Python 2 , 108 104 bytes

lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]
from itertools import*

Experimente online!

-4 bytes, graças a Jonathan Allan


Python 2 , 108 106 bytes

def f(a,n):
 q=[a]
 while q:
  x=q.pop(0);q+=[x[:i]+x[i+1:]for i in range(len(x))]
  if sum(x)==n:return x

Experimente online!

-2 bytes, graças a Janathan Frech

TFeld
fonte
1
Você pode usar range(-len(a),1)e -lsalvar 2, mas lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]salva 4.
Jonathan Allan
@JonathanAllan Thanks :) #
TFeld
1
Possíveis 106 bytes .
Jonathan Frech
@JonathanFrech Obrigado, eu devo ter sido cansado ontem;)
TFeld
4

Pitão , 8 bytes

  • 8-byter ( Experimente! ) - gera apenas uma solução possível. Para entradas insolúveis, ele não imprime nada em STDOUT, que é uma string vazia, que é tecnicamente falsa em Pyth, mas grava em STDERR. Agradecemos a FryAmTheEggman por sugerir isso (ignorando STDERR e concentrando-se apenas na saída STDOUT), economizando 1 byte.

    efqz`sTy    
    
  • 9-byter ( Experimente! ) - gera apenas uma solução possível, agrupada em uma lista de singleton conforme permitido por padrão (por exemplo ([1...10], 10) -> [[1,2,3,4]]; ([], 0) -> [[]]). Para insumos insolúveis, ele retorna [], o que é falsey em Pyth.

    >1fqz`sTy
    
  • 10 bytes ( Experimente! ) - Para obter uma saída mais clara, sem usar a regra da lista de singleton e usar em 0vez de []um valor falso.

    e+0fqz`sTy
    

Explicação

Primeiro, o código calcula o conjunto de potência da lista de entrada (todas as possíveis subconjuntos ordenados). Em seguida, ele mantém apenas as coleções cuja soma é igual ao número de entrada. Deve-se notar que as coleções são geradas do menor para o maior, portanto, focamos na última. Para obtê-lo:

  • O 8-byter simplesmente usa o final embutido, que gera um erro, mas STDERR pode ser ignorado de acordo com as regras do site, sendo a saída para STDOUT uma string vazia, o que é falso.
  • O 9 byter pega o último elemento, mas usa o código Python equivalente lst[-1:]no lugar de lst[-1]para evitar que erros sejam lançados para entradas insolúveis.
  • O byter de 10 bytes adiciona um 0 à lista de subcoleções filtradas e leva o final dessa coleção (último elemento). Se as entradas não puderem ser solucionadas, então 0 será usado naturalmente.
Mr. Xcoder
fonte
[]é falso? Arrumado. Por que Pyth faz isso []?
Urna Mágica do Polvo
@MagicOctopusUrn Pyth herda isso do Python : na verdade, experimente online .
XCoder # 31/18
@FryAmTheEggman uma lista vazia não seria uma saída verdadeira no caso de teste f([], 0) = []?
Sok
@FryAmTheEggman Obrigado pela sua sugestão! Eu fiz as mudanças necessárias :)
Mr. Xcoder
3

Geléia , 7 bytes

ŒPS⁼¥ƇṪ

Experimente online!

Saída esclarecida sobre o TIO.

Erik, o Outgolfer
fonte
3

Perl 6 , 38 37 bytes

{*.combinations.grep(*.sum==$_).tail}

Experimente online!

Função ao curry.

Nwellnhof
fonte
Espere, é ;mesmo necessário?
Jo rei
@JoKing Era necessário em uma iteração anterior evitar um erro de "fechamento duplo malformado". Mas, por alguma razão, pode ser omitido agora. (Eu acho que depois que eu substituído $^xcom $_.)
nwellnhof
3

Braquilog , 4 bytes

⟨⊇+⟩

Experimente online!

Quase equivalente ao Fatalize h⊇.+~t?∧, exceto muito mais curto, graças ao recurso de composição de predicados que, de acordo com o histórico de edição da referência, era um trabalho em andamento até 8 de janeiro, com a resposta em mais de dois meses. ⟨⊇+⟩é um sanduíche , expandindo para {[I,J]∧I⊇.+J∧}, onde os aparelhos são irrelevantes nesse caso, pois o sanduíche está em sua própria linha.

                The input
[I,J]           is a list of two elements I and J.
        .       The output,
         +J     which sums to J
           ∧    (which we don't unify with the output),
      I⊇        is a sublist of I
     ∧          (which we don't unify with [I,J]).

Uma transformação muito menos dramática da resposta de Fatalize, que usa os mesmos predicados com as mesmas variáveis, mas sai um byte menor do que ser organizado de maneira diferente:

Braquilog , 7 bytes

h⊇.&t~+

Experimente online!

           The input
h          's first element
 ⊇         is a superlist of
  .        the output,
   &       and the input
    t      's last item
     ~+    is the sum of the elements of
           the output.

(Além disso, se alguém quiser ver algo estranho, altere qualquer um dos sublinhados nos casos de teste para hífens.)

String não relacionada
fonte
1
Os sanduíches foram implementados pela @ ais523 em novembro de 2018, mas só foram retirados no Brachylog no início de janeiro de 2019.
Fatalize
1
Obviamente, nada disso interessa à história, uma vez que os idiomas que pós-datam o desafio são permitidos há anos.
pppery 28/11
2

Limpo , 89 bytes

import StdEnv,Data.List,Data.Func
$n=find((==)n o sum)o sortBy(on(>)length)o subsequences

Experimente online!

Define a função $ :: Int -> [Int] -> (Maybe [Int])retornando Nothingse não houver uma combinação apropriada de elementos e (Just [elements...])caso contrário.

Furioso
fonte
2

JavaScript (ES6), 108 bytes

Toma entrada como (array)(n). Retorna uma matriz ou false.

a=>n=>a.reduce((a,x)=>[...a,...a.map(y=>1/r[(y=[...y]).push(x)]||eval(y.join`+`)-n?y:r=y)],[[]],r=!n&&[])&&r

Experimente online!

Arnauld
fonte
2

Isso começou legal e pequeno, mas os casos extremos me pegaram. Aconteça o que acontecer, tenho orgulho do trabalho que coloquei nisso.

Python 3 , 169 161 154 bytes

from itertools import*
def f(a,x):
	if sum(a)==x:return a
	try:return[c for i in range(len(a))for c in combinations(a,i)if sum(c)==x][-1]
	except:return 0

Experimente online!

Gigaflop
fonte
Lembre-se de que isso é [código-golfe], então você deve tentar fazer com que o seu byte conte o menor possível! Você tem uma nova linha líder e alguns outros campos triviais de espaço em branco , e eu aposto que alguém que conhece python pode jogar isso ainda mais.
Giuseppe
@ Giuseppe Obrigado por me lembrar do espaço em branco líder. Passei algum tempo tentando consolidar algumas partes disso, mas decidi publicá-lo enquanto isso, caso outros possam sugerir edições.
Gigaflop 31/10/19
Não é um problema! Faz 5 anos desde que eu criei algum Python, mas não range(x)gera (0...x-1)? Então você range(len(a))não está dando a possibilidade de deixar a matriz inalterada?
31418 Giuseppe
@ Giuseppe Eureka, fez isso. Talvez eu tenha me concentrado muito no novo material com o qual estava trabalhando.
Gigaflop 31/10/19
Em vez de if a==[] and x==0usar if sum(a)==x. Então você também pode remover +1de range.
Vedant Kandoi 01/11/19
2

R , 100 80 bytes

function(a,x){i[sum(a|1):0,j[combn(a,i,,F),if(sum(j)==x)return(j)]]
F}
`[`=`for`

Experimente online!

20 bytes salvos graças ao digEmAll

Retorna FALSEpara critérios impossíveis.

Giuseppe
fonte
@digEmAll certamente estou feliz por não ter a chance de editar na sua resposta de 98 byte :-)
Giuseppe
eheh esqueceu de excluí-lo: D
digEmAll 5/18
1

Anexo , 28 bytes

${(y&`=@Sum\Radiations@x)@0}

Experimente online!

Alternativas

34 bytes :f[x,y]:=({y=Sum@_}\Radiations@x)@0

30 bytes :First@${y&`=@Sum\Radiations@x}

29 bytes :{(_&`=@Sum\_2)@0}#/Radiations

29 bytes :${({y=Sum@_}\Radiations@x)@0}

29 bytes :`@&0@${y&`=@Sum\Radiations@x}

29 bytes :{_}@@${y&`=@Sum\Radiations@x}

Explicação

${(y&`=@Sum\Radiations@x)@0}
${                         }    function receiving two arguments, x and y
            Radiations@x        calculate the radiations of x
                                (simulates removing all possible subslices of x)
           \                    keep those radiations
        Sum                     ...whose sum...
     `=@                        ...equals...
   y&                           ...y
  (                     )@0     select the first one (always the longest)
Conor O'Brien
fonte
0

APL (NARS), 65 caracteres, 130 bytes

{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

↓ é usado porque o primeiro elemento do conjunto de conjuntos seria um conjunto nulo (aqui ⍬ Zilde), que se deseja eliminar porque parece que + / ⍬ é zero ...

Para não encontrar, ou erro, ele retornaria ⍬ ou no texto impresso:

  o←⎕fmt
  o ⍬
┌0─┐
│ 0│
└~─┘

teste:

  z←{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

  o 1 z ,1
┌1─┐
│ 1│
└~─┘
  o 2 z ,1
┌0─┐
│ 0│
└~─┘
  o 10 z 1 2 3 4 5 6 7 8 9 10
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 2,2,2,2,2,2,2,2,2
┌5─────────┐
│ 2 2 2 2 2│
└~─────────┘
  o ¯8 z 2,2,2,2,¯2,¯2,¯2,¯4,¯2
┌7──────────────────┐
│ 2 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~──────────────────┘
  o ¯6 z ¯2,¯4,¯2
┌2─────┐
│ ¯4 ¯2│
└~─────┘
  o 0 z 2,2,2,4,2,¯2,¯2,¯2,¯4,¯2
┌10───────────────────────┐
│ 2 2 2 4 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~────────────────────────┘
  o 10 z 1 2 3 4
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 1 2 3
┌0─┐
│ 0│
└~─┘
  o 0 z ⍬
┌0─┐
│ 0│
└~─┘
  o +/⍬  
0
~
RosLuP
fonte