Gleichheit kommt zu dritt


11

Entnommen aus: OEIS- A071816

Ihre Aufgabe bei einer Obergrenze von nist es, die Anzahl der Lösungen zu finden, die die Gleichung erfüllen:

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

Die Sequenz beginnt wie auf der OEIS-Seite beschrieben und wie folgt (1-indiziert):

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

Denn n = 1es gibt nur eine Lösung:(0,0,0,0,0,0)

Für n = 2gibt es 20 bestellte Lösungen (a,b,c,x,y,z)für 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).

Ich & O.

  • Die Eingabe ist eine einzelne Ganzzahl n .
  • Die Ausgabe ist eine einzelne Ganzzahl / Zeichenfolge f(n) , wobei f(...)die Funktion ist oben.
  • Die Indizierung ist genau wie beschrieben, keine andere Indizierung ist akzeptabel.

Dies ist , niedrigste Byte-Anzahl gewinnt.


Ahhh crappp, ich habe die direkte Formel auf OEIS nicht bemerkt, dachte ich , das wäre nicht das einfach. Na ja, ich bin nicht + 1'ing direkte Ports dieser Gleichung; P.
Magic Octopus Urn

1
Zumindest war die Formel nicht perfekt gespielt: P
fəˈnɛtɪk

Andererseits gibt es reg-langs eine Chance gegen die eso-langs.
Magic Octopus Urn

Wäre es besser, wenn der Titel "Gleichheit kommt in Drillingen" lautet?
Undichte Nonne

Antworten:


11

Gelee , 9 6 Bytes

ṗ6ḅ-ċ0

O (n 6 ) -Lösung.

Probieren Sie es online aus!

Wie es funktioniert

ṗ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.

Ha! Ich muss die theoretischen Antworten lieben (meine Basis für eine theoretische Antwort ist jetzt, dass sie auf TIO für große Werte von n ausgeführt wird , das ist wahrscheinlich schlecht). Ich hatte gehofft, ein O(n^6)obwohl zu sehen : P.
Magic Octopus Urn

9

Mathematica 17 oder 76 Bytes

Mit der Formel:

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

(3 Bytes pro @GregMartin und @ngenisis gespeichert)

Anstatt die Formel zu verwenden, berechne ich hier buchstäblich alle Lösungen und zähle sie.

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

2
Danke, dass du den Non-Brute-Force-Weg gepostet hast :). +1 für jede mathematische Antwort, die keine Gleichung oder integrierte Funktion ist.
Magic Octopus Urn

Gemäß dieser Antwort können Sie 11/20durch .55eine Einsparung von zwei Byte ersetzen .
Greg Martin

Sie brauchen das Sternchen auch im ersten Semester nicht.
Ngenisis

8

Haskell , 48 Bytes

Ich habe die Formel vor dem Schreiben nicht bemerkt, daher ist sie definitiv nicht die kürzeste (oder schnellste) allgemeine Methode, aber ich fand sie hübsch.

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

Probieren Sie es online aus!

f ngeneriert alle Listen mit 6 Elementen aus [1..n]und zählt dann diejenigen, deren alternierende Summe 0 ist. Verwendet die Tatsache, dass a+b+c==d+e+fdie gleiche ist wie a-(d-(b-(e-(c-f))))==0und dass es auch keine Rolle spielt, ob wir allen Zahlen eine 1 hinzufügen.


Mir ist aufgefallen, dass die kürzeste Antwort oft die am wenigsten beeindruckende ist;). Dies ist eine ziemlich coole Verwendung von Fold, die ich nicht in Betracht gezogen hätte, bevor ich diese Antwort gesehen hätte.
Magic Octopus Urn

6

MATL , 12 Bytes

l6:"G:gY+]X>

Probieren Sie es online aus!

Erläuterung

Ich konnte die Chance nicht verpassen, die Faltung wieder zu nutzen!

Dies nutzt die folgende Charakterisierung von OEIS:

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

und natürlich ist Polynommultiplikation Faltung.

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

Gelee , 9 Bytes

ṗ3S€ĠL€²S

Nicht so kurz wie bei @ Dennis, aber die Eingabe dauert weniger als 20 Sekunden 100.

Probieren Sie es online aus!

Wie es funktioniert

ṗ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.

Können Sie diese Methode erklären? Ich bin gerade dabei, Jelly zu lernen, aber ich bin immer noch nicht gut genug, um echte Antworten einzureichen. Ich freue mich immer auf Sie, Dennis und einige andere, um gute Beispiele zu finden.
Magic Octopus Urn

@carusocomputing Die Erklärung beendet. Lassen Sie mich wissen, wenn Sie noch Fragen haben :-)
ETHproductions

Genial, ich bin größtenteils verwirrt über die Optimierung der Antworten aus der grundlegendsten Brute-Force-Implementierung, die ich mit dem verrückten Funktionscode machen würde, den ich euch beim Posten sehe. aber ich denke, jede Erklärung ist einen Schritt näher, danke!
Magic Octopus Urn

5

Pyth, 13 12 Bytes

JsM^UQ3s/LJJ

Ein Byte dank Leaky Nun gespeichert.

Erläuterung

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 für die Nichtverwendung der direkten Formel: P.
Magic Octopus Urn

Möglicherweise möchten Sie einen Link zum Online-Dolmetscher veröffentlichen .
Undichte Nonne

Sie können auch /LJJanstelle von verwenden m/JdJ.
Undichte Nonne



2

Oase , 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

Probieren Sie es online aus!

Oasis ist eine stapelbasierte Sprache, die für wiederkehrende Sequenzen optimiert ist. Die Rekursionsformel wäre jedoch für diesen Fall zu lang.


2

Brachylog , 17 Bytes

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

Probieren Sie es online aus!

Erläuterung

{  |↰}ᶠ⁶           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

Ich denke, sollte automatisch mit kommen
Leaky Nun

@LeakyNun Du kannst nicht alleine laufen , es ist ein Metapredikat.
Fatalize

Aber dennoch, wenn es in einer Liste verwendet wird, könnte die Kennzeichnung dieser Liste zum Standardprädikat gemacht werden, nicht wahr?
Matte

@mat Es könnte so gemacht werden, aber im Moment können Sie kein Metapredikat für eine Variable verwenden.
Fatalize



1

Python 2.7, 109 105 99 96 Bytes

Vielen Dank an ETHproductions und Dennis für das Speichern einiger Bytes:

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

Interessant, hat Python 3 nicht Funktionen mit geringerer Reichweite als 2.7?
Magic Octopus Urn

sum(sum(x[:3])==sum(x[3:])for x ...)wäre noch kürzer. Außerdem from itertools import*speichert ein Byte.
Dennis

Sie brauchen den Platz vorher nicht for. Außerdem müssen Funktionen nicht standardmäßig benannt werden, damit Sie sie entfernen können h=.
Dennis

1

Mathematica, 52 Bytes

Kelly Lowders Implementierung der OEIS-Formel ist viel kürzer, aber dies berechnet die Zahlen direkt:

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

Nun, es zählt tatsächlich die Anzahl der Lösungen mit 1 <= a,b,c,x,y,z <= n . Dies ist dieselbe Zahl, da das Hinzufügen von 1 zu allen Variablen die Gleichheit nicht ändert.

Erläuterung: Range@#~Tuples~6Erstellt alle Listen mit sechs Ganzzahlen zwischen 1 und n, #~Partition~3&/@teilt jede Liste in zwei Listen mit der Länge 3 auf, Tr/@summiert diese Unterlisten und Count[...,{n_,n_}]zählt, wie viele Paare dieselbe Summe haben. Ich habe sehr viel Glück mit der Rangordnung zwischen f @, f /@und ~f~!


1

Oktave , 41 Bytes

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

Probieren Sie es online aus!

Ähnlich wie meine MATL-Antwort , berechnet jedoch die Faltung über eine diskrete Fourier-Transformation ( fft) mit einer ausreichenden Anzahl von Punkten ( n^2). ~~(1:n)wird als kürzere Version von verwendet ones(1,n). roundist wegen Gleitkommafehlern notwendig.


0

CJam , 17 Bytes

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

Die Eingabe von 11Timeouts auf TIO 12und höher hat nicht genügend Speicher.

Probieren Sie es online aus!

Erläuterung

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

Tonnenweise Wiederholungen im Code, bei einer größeren Anzahl von Variablen kann ein Makro kürzer sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.