¡Mi matriz debería ser igual a esto, pero no lo hace!

21

Dada una matriz de enteros aque contiene n enteros y un solo entero x; eliminar la menor cantidad de elementos apara hacer la suma de aigual a x. Si no se apueden formar combinaciones de xlatas, devuelve un valor falso.

Como se señaló en un comentario, este es el conjunto máximo con una suma de x , disculpe mi cerebro matemático menor. Olvidé muchos términos desde la universidad.


Ejemplos (Verdad):

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] (Sin alterar)

f([], 0) = [] (Caso de suma cero sin cambios)


Ejemplos (Falsy, cualquier valor consistente que no sea de matriz):

Imposible hacer caso: f([-2,4,6,-8], 3) = falsy (E.G. -1)

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

  • Nota: cualquier valor como [-1]no puede ser válido para falsedad, ya que es una salida de verdad potencial.

Reglas:

  • La entrada puede tomarse en forma de matriz, o como una lista de argumentos, siendo el último o el primero x.
  • La salida puede ser cualquier lista delimitada de enteros. EG 1\n2\n3\no [1,2,3].
  • Cualquier valor puede usarse como un indicador falso, que no sea una matriz de enteros.
  • Su código debe maximizar el tamaño de la matriz final, el orden no importa.
    • EG Para f([3,2,3],5)ambos [2,3]y [3,2]son igualmente válidos.
    • Por ejemplo f([1,1,2],2), solo puede regresar [1,1]cuando [2]sea ​​más corto.
  • Tanto la suma de acomo el valor de xserán menores 2^32-1y mayores que -2^32-1.
  • Este es el , el menor recuento de bytes gana.
  • Si hay varios subconjuntos del mismo tamaño que sean válidos, es no aceptable para la producción de todos ellos. Debe elegir uno único y generarlo.

Avíseme si esto se ha publicado, no pude encontrarlo.

Publicaciones que encontré así : relacionadas pero cerradas , ...

Urna de pulpo mágico
fuente
1
Supongo que "Falsy, cualquier valor consistente que no sea de matriz" incluye generar un error
Jonathan Allan
" Cualquier valor se puede utilizar como un indicador falso, que no sea una matriz de enteros " . ¿ Eso incluye una matriz vacía?
Shaggy
@shaggy [] es indicativo de un posible valor de verdad, ¿verdad? ¿Permitir que esa meta regla sea más importante que la verdad y la falsedad distintas?
Urna de pulpo mágico el
@JohnathanAllan si ese error no se puede generar en un escenario Verdad, supongo. Pero siento que esto está intentando intencionalmente estirar la especificación. Si cambio la redacción del indicador al valor de retorno, ¿está bien entonces?
Urna de pulpo mágico el
¿Creo que los valores de salida consistentes cuentan como un valor de retorno aunque por meta?
Urna de pulpo mágico el

Respuestas:

7

Brachylog , 8 bytes

h⊇.+~t?∧

Pruébalo en línea!

Respuesta mensual de Brachylog. Devuelve false.si no es posible.

Explicación

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
fuente
6

Python 2 , 108104 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*

Pruébalo en línea!

-4 bytes, gracias 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

Pruébalo en línea!

-2 bytes, gracias a Janathan Frech

TFeld
fuente
1
Podrías usar range(-len(a),1)y -lpara guardar 2, pero lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]guarda 4.
Jonathan Allan
@JonathanAllan Gracias :)
TFeld
1
Posibles 106 bytes .
Jonathan Frech el
@JonathanFrech Gracias, debo haber estado cansado ayer;)
TFeld
4

Pyth , 8 bytes

  • 8 bytesPruébelo! ): Genera solo una solución posible. Para entradas insolubles, no imprime nada en STDOUT, que es una cadena vacía, que técnicamente habla falsey en Pyth, pero escribe en STDERR. Gracias a FryAmTheEggman por sugerir esto (ignorando STDERR y centrándose solo en la salida STDOUT), ahorrando así 1 byte.

    efqz`sTy    
    
  • 9 bytesPruébelo! ): Genera solo una solución posible, envuelta en una lista de un solo tono según lo permitido por defecto (por ejemplo ([1...10], 10) -> [[1,2,3,4]]; ([], 0) -> [[]]). Para entradas insolubles, regresa [], lo cual es falsey en Pyth.

    >1fqz`sTy
    
  • 10 bytesPruébelo! ): Para obtener una salida más clara, sin usar la regla de lista única y usar en 0lugar de []un valor falso.

    e+0fqz`sTy
    

Explicación

Primero, el código calcula el conjunto de potencia de la lista de entrada (todas las posibles subcolecciones ordenadas de la misma). Luego, solo mantiene aquellas colecciones cuya suma es igual al número de entrada. Cabe señalar que las colecciones se generan de la más corta a la más larga, por lo que nos centramos en la última. Para obtenerlo:

  • El 8-byter simplemente usa el final incorporado, que arroja un error, pero STDERR puede ignorarse según las reglas de nuestro sitio, siendo la salida a STDOUT una cadena vacía, lo cual es falso.
  • El 9-byter toma el último elemento, pero usa el código Python equivalente lst[-1:]en lugar de lst[-1]evitar que se generen errores para entradas insolubles.
  • El byte 10 antepone un 0 a la lista de sub-colecciones filtradas, luego toma el final de esa colección (último elemento). Si las entradas no tienen solución, entonces se usa 0 en su lugar.
Sr. Xcoder
fuente
[]es falso? Ordenado. ¿Por qué Pyth hace eso []?
Urna mágica del pulpo
@MagicOctopusUrn Pyth hereda eso de Python en realidad: Pruébelo en línea .
Sr. Xcoder
@FryAmTheEggman, ¿no sería una lista vacía un resultado verdadero en el caso de prueba f([], 0) = []?
Sok
@FryAmTheEggman ¡Gracias por tu sugerencia! He realizado los cambios necesarios :)
Sr. Xcoder
3

Perl 6 , 38 37 bytes

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

Pruébalo en línea!

Función curry

nwellnhof
fuente
Espera, ¿es ;necesario?
Jo King el
@JoKing Era necesario en una iteración anterior para evitar un error de "doble cierre mal formado". Pero por alguna razón se puede omitir ahora. (Creo que después he sustituido $^xcon $_.)
nwellnhof
3

Brachylog , 4 bytes

⟨⊇+⟩

Pruébalo en línea!

Casi equivalente a Fatalize h⊇.+~t?∧, excepto que es mucho más corto, gracias a la función de composición de predicados que, según el historial de edición de la referencia, era un trabajo en progreso hasta el 8 de enero, posponiendo la respuesta por más de dos meses. ⟨⊇+⟩es un sándwich que se expande hacia {[I,J]∧I⊇.+J∧}donde los frenos son irrelevantes en este caso, ya que el sándwich está en su propia línea de todos modos.

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

Una transformación mucho menos dramática de la respuesta de Fatalize, que usa los mismos predicados con las mismas variables pero sale un byte más corto de ser organizado de manera diferente:

Brachylog , 7 bytes

h⊇.&t~+

Pruébalo en línea!

           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.

(Además, si alguien quiere ver algo extraño, cambie cualquiera de los guiones bajos en los casos de prueba a guiones).

Cadena no relacionada
fuente
1
Los sándwiches fueron implementados por @ ais523 en noviembre de 2018, pero solo se
eliminaron
1
Por supuesto, nada de esta búsqueda de historia importa, ya que los idiomas posteriores al desafío se han permitido durante años.
pppery
2

Limpiar , 89 bytes

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

Pruébalo en línea!

Define la función de $ :: Int -> [Int] -> (Maybe [Int])retorno Nothingsi no hay una combinación adecuada de elementos, y de lo (Just [elements...])contrario.

Οurous
fuente
2

JavaScript (ES6), 108 bytes

Toma entrada como (array)(n). Devuelve una matriz o 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

Pruébalo en línea!

Arnauld
fuente
2

Esto comenzó genial y pequeño, pero los casos extremos me atraparon. Pase lo que pase, estoy orgulloso del trabajo que puse en esto.

Python 3 , 169161154 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

Pruébalo en línea!

Gigaflop
fuente
Recuerde que esto es [código-golf], ¡así que debe intentar que su byte cuente lo más pequeño posible! Usted tiene una nueva línea líder y algunos otros campos de golf en blanco , y apuesto a que alguien más que conozca Python puede jugar golf más allá.
Giuseppe el
@Giuseppe Gracias por recordarme el espacio en blanco líder. Pasé algún tiempo tratando de consolidar algunas partes de esto, pero decidí publicarlo mientras tanto en caso de que otros puedan sugerir modificaciones.
Gigaflop
¡No es un problema! Han pasado como 5 años desde que hice Python, pero ¿no se range(x)genera (0...x-1)? ¿Entonces range(len(a))no te da la posibilidad de dejar la matriz sin cambios?
Giuseppe
@Giuseppe Eureka, eso lo hizo. Puede que me haya centrado demasiado en el nuevo material con el que estaba trabajando.
Gigaflop
En lugar de if a==[] and x==0usar if sum(a)==x. Entonces también puedes eliminar +1de range.
Vedant Kandoi el
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`

Pruébalo en línea!

20 bytes guardados gracias a digEmAll

Devoluciones FALSEpor criterios imposibles.

Giuseppe
fuente
@digEmAll Ciertamente me alegro de no haber tenido la oportunidad de editar en su respuesta de 98 bytes :-)
Giuseppe
eheh olvidó borrarlo: D
digEmAll
1

Adjunto , 28 bytes

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

Pruébalo en línea!

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}

Explicación

${(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
fuente
0

APL (NARS), 65 caracteres, 130 bytes

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

↓ se usa porque el primer elemento del conjunto de conjuntos sería un conjunto vacío (aquí ⍬ Zilde), que uno quiere eliminar porque parece que + / ⍬ es cero ...

Para no encontrar, o error, devolvería ⍬ o en el texto impreso:

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

prueba:

  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
fuente