La igualdad viene en tres


11

Tomado de: OEIS- A071816

Su tarea, dado un límite superior de n, es encontrar la cantidad de soluciones que satisfacen la ecuación:

a+b+c = x+y+z, where 0 <= a,b,c,x,y,z < n

La secuencia comienza como se describe en la página OEIS y como a continuación (1 indexado):

1, 20, 141, 580, 1751, 4332, 9331, 18152, 32661, 55252, 88913, 137292, 204763, 296492, 418503, 577744, 782153, 1040724, 1363573, 1762004, 2248575, 2837164, 3543035, 4382904, 5375005, 6539156, 7896825, 9471196, 11287235, 13371756

Para n = 1, solo hay una solución:(0,0,0,0,0,0)

Para n = 2, hay 20 soluciones ordenadas (a,b,c,x,y,z)para a+b+c = x+y+z:

(0,0,0,0,0,0), (0,0,1,0,0,1), (0,0,1,0,1,0), (0,0,1,1,0,0), (0,1,0,0,0,1), 
(0,1,0,0,1,0), (0,1,0,1,0,0), (0,1,1,0,1,1), (0,1,1,1,0,1), (0,1,1,1,1,0), 
(1,0,0,0,0,1), (1,0,0,0,1,0), (1,0,0,1,0,0), (1,0,1,0,1,1), (1,0,1,1,0,1), 
(1,0,1,1,1,0), (1,1,0,0,1,1), (1,1,0,1,0,1), (1,1,0,1,1,0), (1,1,1,1,1,1).

I & O

  • La entrada es un entero entero que denota n.
  • La salida es un único número entero / cadena que denota f(n), donde f(...)está la función anterior.
  • La indexación es exactamente como se describe, ninguna otra indexación es aceptable.

Este es el , el menor recuento de bytes gana.


Ahhh mierda, no noté la fórmula directa en OEIS, pensé que esto no sería tan fácil. Oh, bueno, no estoy haciendo +1 en los puertos directos de esa ecuación; P.
Urna mágica de pulpo

1
Al menos la fórmula no fue perfecta: P
fəˈnɛtɪk

Por otra parte, le da a los reg-langs una oportunidad contra los eso-langs.
Urna mágica de pulpo

¿Sería mejor si el título es "la igualdad viene en trillizos"?
Leaky Nun

Respuestas:


11

Jalea , 9 6 bytes

ṗ6ḅ-ċ0

O (n 6 ) solución.

Pruébalo en línea!

Cómo funciona

ṗ6ḅ-ċ0  Main link. Argument: n

ṗ6      Cartesian power 6; build all 6-tuples (a, x, b, y, c, z) of integers in
        [1, ..., n]. The challenge spec mentions [0, ..., n-1], but since there
        are three summands on each side, this doesn't matter.
  ḅ-    Unbase -1; convert each tuple from base -1 to integer, mapping (a, ..., z)
        to a(-1)**5 + x(-1)**4 + b(-1)**3 + y(-1)**2 + c(-1)**1 + z(-1)**0, i.e.,
        to -a + x - b + y - c + z = (x + y + z) - (a + b + c). This yields 0 if and
        only if the 6-tuple is a match.
    ċ0  Count the number of zeroes.

¡Decir ah! Tengo que amar las respuestas teóricas (mi base para una respuesta teórica es que ahora se ejecuta en TIO para valores grandes de n , esto probablemente sea malo). Esperaba ver un O(n^6)pensamiento: P.
Magic Octopus Urn

9

Mathematica 17 o 76 Bytes

Usando la fórmula:

.55#^5+#^3/4+#/5&

(Guardado 3 bytes por @GregMartin y @ngenisis)

En lugar de usar la fórmula, aquí literalmente calculo todas las soluciones y las cuento.

Length@Solve[a+b+c==x+y+z&&And@@Table[(0<=i<#),{i,{a,b,c,x,y,z}}],Integers]&

2
Gracias por publicar la forma de fuerza no bruta :). +1 para cualquier respuesta matemática que no sea una ecuación o una función incorporada.
Urna mágica de pulpo

Según esta respuesta , puede reemplazar 11/20por .55un ahorro de dos bytes.
Greg Martin

Tampoco necesita el asterisco en el primer término.
ngenisis

8

Haskell , 48 bytes

No noté la fórmula antes de escribir esto, por lo que definitivamente no es el método general más corto (o más rápido), pero pensé que era bonito.

f n=sum[1|0<-foldr1(-)<$>pure[1..n]`mapM`[1..6]]

Pruébalo en línea!

f ngenera todas las listas de 6 elementos de [1..n], luego cuenta los cuya suma alterna es 0. Utiliza el hecho de que a+b+c==d+e+fes igual a a-(d-(b-(e-(c-f))))==0, y también que no importa si sumamos un 1 a todos los números.


He notado que, a menudo, la respuesta más corta es la menos impresionante;). Este es un uso bastante bueno de fold que no hubiera considerado antes de ver esta respuesta.
Urna mágica de pulpo

6

MATL , 12 bytes

l6:"G:gY+]X>

Pruébalo en línea!

Explicación

¡No podía perder la oportunidad de usar la convolución nuevamente!

Esto hace uso de la siguiente caracterización de OEIS:

a(n) = largest coefficient of (1+...+x^(n-1))^6

y, por supuesto, la multiplicación polinómica es convolución.

l        % Push 1
6:"      % Do the following 6 times
  G:g    %   Push a vector of n ones, where n is the input
  Y+     %   Convolution
]        % End
X>       % Maximum

5

Jalea , 9 bytes

ṗ3S€ĠL€²S

No es tan corto como el de @ Dennis, pero termina en menos de 20 segundos para la entrada 100.

Pruébalo en línea!

Cómo funciona

ṗ3S€ĠL€²S  Main link. Argument: n

ṗ3         Cartesian power; yield all subsets of [1, ..., n] of length 3.
  S€       Sum each. 
    Ġ      Group indices by their values; for each unique sum S, list all indices whose
           values are equal to S.
     L€    Length each; for each unique sum S, yield the number of items in the original
           array that sum to S.
       ²   Square each; for each unique sum S, yield the number of pairs that both sum to S.
        S  Sum; yield the total number of equal pairs.

¿Puedes explicar este método? Actualmente estoy en el proceso de aprender Jelly, pero todavía no soy lo suficientemente bueno como para enviar respuestas reales todavía; Siempre te busco a ti, Dennis y algunos otros para obtener buenos ejemplos.
Urna mágica de pulpo

@carusocomputing Terminó la explicación. Avíseme si todavía tiene alguna pregunta :-)
ETHproductions

Impresionante, estoy confundido sobre la optimización de las respuestas de la implementación más básica de fuerza bruta que haría con el loco código corto que veo publicando; pero siento que cada explicación está un paso más cerca, ¡gracias!
Urna mágica del pulpo

5

Pyth, 13 12 bytes

JsM^UQ3s/LJJ

Salvado un byte gracias a Leaky Nun.

Explicación

JsM^UQ3s/LJJ
   ^UQ3         Get all triples in the range.
JsM             Save the sums as J.
        /LJJ    Count occurrences of each element of J in J.
       s        Take the sum.

+1 por no usar la fórmula directa: P.
Urna mágica de pulpo

Es posible que desee publicar un enlace al intérprete en línea .
Leaky Nun

Además, puede usar en /LJJlugar de m/JdJ.
Leaky Nun



2

Oasis , 17 bytes

5m11*n3m5*nz++20÷

5                   n 5             implicit n for illustration
 m                  n**5
  11                n**5 11
    *               11*n**5
     n              11*n**5 n
      3             11*n**5 n 3
       m            11*n**5 n**3
        5           11*n**5 n**3 5
         *          11*n**5 5*n**3
          n         11*n**5 5*n**3 n
           z        11*n**5 5*n**3 4*n
            +       11*n**5 5*n**3+4*n
             +      11*n**5+5*n**3+4*n
              20    11*n**5+5*n**3+4*n 20
                ÷  (11*n**5+5*n**3+4*n)÷20

Pruébalo en línea!

Oasis es un lenguaje basado en pila optimizado para secuencias recurrentes. Sin embargo, la fórmula de recursión sería demasiado larga para este caso.


2

Brachylog , 17 bytes

{>ℕ|↰}ᶠ⁶ḍD+ᵐ=∧D≜ᶜ

Pruébalo en línea!

Explicación

{  |↰}ᶠ⁶           Generate a list of 6 variables [A,B,C,D,E,F]...
 >ℕ                  ...which are all in the interval [0, Input)
        ḍD         Dichotomize; D = [[A,B,C],[D,E,F]]
          +ᵐ=      A + B + C must be equal to D + E + F
             ∧
              D≜ᶜ  Count the number of possible ways you can label the elements of D while
                     satisfying the constraints they have

Supongo que debería venir automáticamente
Leaky Nun

@LeakyNun No puedes correr solo, es un metapredicado.
Fatalize

Pero aún así, si se usa en una lista, etiquetar esa lista podría convertirse en el predicado predeterminado, ¿no?
mat

@mat Se podría hacer de esa manera, pero en este momento no se puede usar un metapredicado en una variable.
Fatalize


1

Octava , 25 23 21 bytes

@(n).55*n^5+n^3/4+n/5

Pruébalo en línea!

Utiliza la fórmula de la entrada OEIS. Ahorró dos cuatro bytes reorganizando la fórmula y usando en .55lugar de 11/20, gracias a fəˈnɛtɪk.


1

Python 2.7, 109 105 99 96 bytes

Gracias ETHproductions y Dennis por guardar algunos bytes:

from itertools import*
lambda s:sum(sum(x[:3])==sum(x[3:])for x in product(range(s),repeat=6))

Interesante, ¿Python 3 no tiene funciones de rango más corto que 2.7?
Urna mágica del pulpo

sum(sum(x[:3])==sum(x[3:])for x ...)Sería aún más corto. Además, from itertools import*guarda un byte.
Dennis

No necesitas el espacio antes for. Además, no requerimos que las funciones se nombren de manera predeterminada, por lo que puede eliminarlas h=.
Dennis

1

Mathematica, 52 bytes

La implementación de Kelly Lowder de la fórmula OEIS es mucho más corta, pero esto calcula los números directamente:

Count[Tr/@#~Partition~3&/@Range@#~Tuples~6,{n_,n_}]&

Bueno, en realidad cuenta con el número de soluciones 1 <= a,b,c,x,y,z <= n. Este es el mismo número, ya que agregar 1 a todas las variables no cambia la igualdad.

Explicación: Range@#~Tuples~6hace todas las listas de seis enteros entre 1 yn, #~Partition~3&/@divide cada lista en dos listas de longitud 3, Tr/@suma estas sublistas yCount[...,{n_,n_}] cuenta cuántos pares tienen la misma suma. Tuve mucha suerte con el orden de precedencia entre f @, f /@y ~f~!


1

Octava , 41 bytes

@(n)round(max(ifft(fft(~~(1:n),n^2).^6)))

Pruébalo en línea!

Similar a mi respuesta MATL , pero calcula la convolución a través de una transformada discreta de Fourier ( fft) con un número suficiente de puntos ( n^2). ~~(1:n)se usa como una versión más corta de ones(1,n). roundes necesario debido a errores de coma flotante.


0

CJam , 17 bytes

ri,6m*{3/::+:=},,

La entrada de 11tiempos de espera en TIO, 12y superior se queda sin memoria.

Pruébalo en línea!

Explicación

ri                e# Read an int from input.
  ,               e# Generate the range 0 ... input-1.
   6m*            e# Take the 6th Cartesian power of the range.
      {           e# Keep only the sets of 6 values where:
       3/         e#  The set split into (two) chunks of 3
         ::+:=    e#  Have the sums of both chunks equal.
              },  e# (end of filter)
                , e# Get the length of the resulting list.

0

Clojure, 79 bytes

#(count(for[r[(range %)]a r b r c r x r y r z r :when(=(+ a b c)(+ x y z))]1))

Toneladas de repetición en el código, en un mayor número de variables, una macro podría ser más corta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.