A igualdade vem em três

11

Retirado de: OEIS- A071816

Sua tarefa, com um limite superior de n, é encontrar o número de soluções que satisfazem a equação:

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

A sequência começa como descrito na página OEIS e abaixo (indexado 1):

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

Pois n = 1, há apenas uma solução:(0,0,0,0,0,0)

Pois n = 2existem 20 soluções 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

  • A entrada é um único número inteiro que indica n.
  • A saída é um único número inteiro / cadeia de caracteres f(n), onde f(...)está a função acima.
  • A indexação é exatamente como descrito, nenhuma outra indexação é aceitável.

Isso é , vitórias mais baixas na contagem de bytes.

Urna de polvo mágico
fonte
Ahhh crappp, eu não percebi a fórmula direta no OEIS, achei que isso não seria tão fácil. Bem, eu não estou marcando +1 com portas diretas dessa equação;
Magic Octopus Urn
1
Pelo menos a fórmula não foi perfeitamente golfed: P
fənɛtɪk
Por outro lado, isso dá aos reg-langs uma chance contra os eso-langs.
Urna de polvo mágico
Seria melhor se o título fosse "a igualdade vem em trigêmeos"?
Leaky Nun

Respostas:

11

Geléia , 9 6 bytes

ṗ6ḅ-ċ0

Solução O (n 6 ) .

Experimente online!

Como 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.
Dennis
fonte
Ha! Preciso amar as respostas teóricas (minha base para uma resposta teórica agora é que ela roda no TIO para valores grandes de n , isso provavelmente é ruim). Eu esperava ver um pouco O(n^6): P.
Urna Mágica do Polvo
9

Mathematica 17 ou 76 bytes

Usando a fórmula:

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

(Salvou 3 bytes por @GregMartin e @ngenisis)

Em vez de usar a fórmula, aqui eu literalmente computo todas as soluções e as conto.

Length@Solve[a+b+c==x+y+z&&And@@Table[(0<=i<#),{i,{a,b,c,x,y,z}}],Integers]&
Kelly Lowder
fonte
2
Obrigado por postar a maneira que não seja de força bruta :). +1 para qualquer resposta do mathematica que não seja uma equação ou um recurso interno.
Urna de polvo mágico
De acordo com esta resposta , você pode substituir 11/20por .55uma economia de dois bytes.
Greg Martin
Você também não precisa do asterisco no primeiro período.
Ngenisis
8

Haskell , 48 bytes

Eu não percebi a fórmula antes de escrever isso, então definitivamente não é o método geral mais curto (ou mais rápido), mas achei que era bonito.

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

Experimente online!

f ngera todas as listas de 6 elementos de [1..n]e depois conta aqueles cuja soma alternada é 0. Usa o fato de que a+b+c==d+e+fé o mesmo que a-(d-(b-(e-(c-f))))==0, e também que não importa se adicionamos 1 a todos os números.

Ørjan Johansen
fonte
Percebi que, muitas vezes, a resposta mais curta é a menos impressionante;). Esse é um uso muito legal da dobra que eu não consideraria antes de ver esta resposta.
Magic Octopus Urn
6

MATL , 12 bytes

l6:"G:gY+]X>

Experimente online!

Explicação

Não pude perder a chance de usar a convolução novamente!

Isso faz uso da seguinte caracterização do OEIS:

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

e, é claro, a multiplicação polinomial é convolução.

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
Luis Mendo
fonte
5

Geléia , 9 bytes

ṗ3S€ĠL€²S

Não é tão curto quanto o de Dennis, mas termina em menos de 20 segundos para entrada 100.

Experimente online!

Como 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.
ETHproductions
fonte
Você pode explicar esse método? Atualmente, estou no processo de aprender Jelly, mas ainda não sou bom o suficiente para enviar respostas reais; Eu sempre olho para você, Dennis e alguns outros, para bons exemplos.
Urna Mágica do Polvo
@carusocomputing Concluída a explicação. Deixe-me saber se você ainda tiver alguma dúvida :-)
ETHproductions
Incrível, estou confuso com a otimização das respostas da implementação mais básica da força bruta que eu faria com o código curto louco que vejo vocês postando; mas sinto que cada explicação está um passo mais perto, obrigado!
Urna de polvo mágico
5

Pitão, 13 12 bytes

JsM^UQ3s/LJJ

Guardou um byte graças a Leaky Nun.

Explicação

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.

fonte
+1 por não usar a fórmula direta: P.
Magic Octopus Urn
Você pode postar um link para o intérprete online .
Freira vazada
Além disso, você pode usar em /LJJvez de m/JdJ.
Freira vazada
2

TI-BASIC, 19 bytes

:Prompt X
:.05X(11X^4+5X²+4

Avalia a fórmula OEIS.

Scott Milner
fonte
1
Como você está contando os bytes aqui? Prompt x= 2 bytes?
Urna de polvo mágico
@carusocomputing TI-BASIC é pontuada por tokens
dzaima 28/04
1
Meio triste por ter postado uma resposta do TI-BASIC 5 vezes antes e nunca a marquei corretamente agora que olho para o meu histórico ._.
Magic Octopus Urn
2

Oásis , 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

Experimente online!

Oasis é uma linguagem baseada em pilha otimizada para seqüências recorrentes. No entanto, a fórmula de recursão seria muito longa para este caso.

Freira Furada
fonte
2

Braquilog , 17 bytes

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

Experimente online!

Explicação

{  |↰}ᶠ⁶           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
Fatalizar
fonte
Eu acho que deve vir automaticamente com
Leaky Nun
@LeakyNun Você não pode correr por si só, é um metapredicado.
Fatalize
Mas ainda assim, se for usado em uma lista, rotular essa lista pode ser o predicado padrão, não?
mat
@mat Poderia ser assim, mas agora você não pode usar um metapredicado em uma variável.
Fatalize
1

JavaScript, 24 bytes

x=>11*x**5/20+x**3/4+x/5

Usa a fórmula da página OEIS.

Experimente online!

fəˈnɛtɪk
fonte
Eu acho que você pode salvar dois bytes comx=>x**5*.55+x**3/4+x/5
ETHproductions
@ETHproductions lá estão flutuando erros pontuais se eu usar * 0,55 em vez de * 20/11
fənɛtɪk
1

Oitava , 25 23 21 bytes

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

Experimente online!

Usa a fórmula da entrada OEIS. Salvei dois quatro bytes reorganizando a fórmula e usando em .55vez de 11/20, graças a fəˈnɛtɪk.

Stewie Griffin
fonte
1

Python 2.7, 109 105 99 96 bytes

Agradecemos à ETHproductions e ao Dennis por salvar alguns bytes:

from itertools import*
lambda s:sum(sum(x[:3])==sum(x[3:])for x in product(range(s),repeat=6))
acidtobi
fonte
Interessante, o Python 3 não possui funções de alcance menor que 2,7?
Magic Octopus Urn
sum(sum(x[:3])==sum(x[3:])for x ...)seria ainda mais curto. Além disso, from itertools import*salva um byte.
Dennis
Você não precisa do espaço antes for. Além disso, não exigimos que as funções sejam nomeadas por padrão, para que você possa removê-las h=.
Dennis
1

Mathematica, 52 bytes

A implementação de Kelly Lowder da fórmula OEIS é bem mais curta, mas isso calcula os números diretamente:

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

Bem, na verdade conta o número de soluções 1 <= a,b,c,x,y,z <= n. Este é o mesmo número, pois adicionar 1 a todas as variáveis ​​não altera a igualdade.

Explicação: Range@#~Tuples~6torna todas as listas de seis números inteiros entre 1 e n, #~Partition~3&/@divide cada lista em duas listas de comprimento 3, Tr/@soma essas sublistas e Count[...,{n_,n_}]conta quantos pares têm a mesma soma. Eu tive muita sorte com a ordem de precedência entre f @, f /@e ~f~!

Não é uma árvore
fonte
1

Oitava , 41 bytes

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

Experimente online!

Semelhante à minha resposta MATL , mas calcula a convolução por meio de uma transformada de Fourier discreta ( fft) com um número suficiente de pontos ( n^2). ~~(1:n)é usado como uma versão mais curta do ones(1,n). roundé necessário devido a erros de ponto flutuante.

Luis Mendo
fonte
0

CJam , 17 bytes

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

A entrada de 11tempo limite no TIO e 12a memória ficar mais alta.

Experimente online!

Explicação

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.
Gato de negócios
fonte
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 repetição no código, em um número maior de variáveis, uma macro pode ser menor.

NikoNyrh
fonte