Ihre Aufgabe ist es, mit einer eingegebenen Nummer p
die kleinste positive Kanonenkugelnummer der Reihenfolge zu finden p
, die NICHT 1 ist.
Definition
Eine Kanonenkugelnummer (in der Reihenfolge p
) ist eine Nummer, die beides ist:
- Eine
p
-gonale Zahl ( siehe diese Seite ). und eine
p
-gonale Pyramidenzahl.- Die
n
th-p
gonale Pyramidenzahl ist die Summe der 1. bisn
th-p
gonalen Zahlen.- (zB
4th square pyramid number = 1 + 4 + 9 + 16 = 30
)
- (zB
Das Bild unten zeigt die 4. quadratische Pyramidenzahl als quadratische Pyramide.
Weitere Informationen finden Sie unter diesem Link .
- Die
Die Kanonenkugelnummer der Ordnung 3 ist beispielsweise 10, weil es ist:
- Die vierte Dreieckszahl (
1 + 2 + 3 + 4 = 10
) - und die dritte dreieckige Pyramidenzahl. (
1 + 3 + 6 = 10
)
Formeln
HINWEIS: Wenn Sie hier nützlichere Formeln als meine finden (oder erstellen) können, posten Sie diese bitte hier (oder senden Sie mir eine Nachricht in der Frage-Chat-Sache).
- Wenn Sie interessiert sind, lautet die Formel für die
n
th-p
gonale Zahl:
- Und die
n
th-p
gonale Pyramidenzahl ist:
Technische Daten
p
ist garantiert größer als 2.- Das Programm muss Werte für eine Lösung für
p
bis zu (und einschließlich) prüfen2^16
. Ihr Programm kann alles tun, wenn keine Lösungen gefunden werdenp
. - Nur positive Indizes für
n
.
Testfälle
3
Ausgänge10
(4. Dreiecksnummer, 3. Dreieckspyramidenzahl)4
Ausgänge4900
(70. Quadrat Nummer, 24. Quadrat Pyramide Nummer)
Dies ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
Hinweis: Wenn Sie eine Lösung veröffentlichen, geben Sie bitte eine Beschreibung der Funktionsweise des Codes an.
Sollte ich ein Kopfgeld für eine Lösung starten, die besser ist und meine Formeln nicht verwendet?
n
? Wenn nicht, welchen Bereich werdenn
Sie verwenden?n
-gonale undn
-gonale Pyramidenzahlen sollten nicht definiert werden müssen.Antworten:
Python 3,
129127 BytesEine Funktion, die Eingaben über Argumente entgegennimmt und die Ausgaben zurückgibt.
Dies ist eine äußerst naive rohe Kraft, die selbst für mäßig große Personen sehr lange dauert
p
. die Ausführungszeit für etwas Annäherung an das gegebene Maximum für lächerlichp
von2^16
, aber es gibt keinen Grund , warum das Programm nicht funktionieren würde, da genügend Zeit.Es gibt wahrscheinlich viel kürzere und schnellere Möglichkeiten, dies zu tun, aber ich dachte, es wäre gut, etwas zu posten, um dies in Gang zu bringen.
Wie es funktioniert
Der Rückgabewert
x
wird auf initialisiert2
, und dannp
durchläuft das Programm einfach alle -gonalen undp
-gonalen Pyramidenzahlen bis zur Reihenfolgex
. Wenn die aktuellenp
-gonalen undp
-gonalen Pyramidenzahlen, die anhand der Formeln berechnet wurden, einander und bis gleich sindx
,x
muss dies die relevante Kanonenkugelnummer sein, und diese wird zurückgegeben. Andernfallsx
wird inkrementiert und das Programm versucht erneut, den neuen Wert von zu ermittelnx
.In Bezug auf das Golfen wird ein kartesisches Produkt verwendet, um die beiden for-Schleifen für die
p
-gonalen undp
-gonalen Pyramidenzahlen zu einer einzigen Schleife zusammenzufassen, und die Formeln wurden weiter faktorisiert, um einige Bytes zu sparen.quelle
JavaScript,
11198 Bytesungolfed
c ist nicht in der inneren Schleife , weil das nächste p [b] ist auf jeden Fall größer als das aktuelle g [c] reinitialisiert (so haben wir bewegen auf sowieso)
Beispiele
quelle
C 107 Bytes
Ungolfed mit Testparametern:
Dies nutzt die Tatsache, dass die n-te p-Gonalzahl definiert werden kann als
n(1+(p-2)(n-1)/2)
und die Pyramidenzahl die Summe der oben genannten Zahlen ist.Ich denke, es kann weiter gespielt werden, da es nicht wirklich notwendig ist, eine Variable
a
zu speichern.quelle
i
in Ihrer Formel die imaginäre Zahli
?i
soll seinn
. Ich hatte eine andere Notation in meiner Forschung. Ich kann mir nicht vorstellen, eine imaginäre Zahl für dieses Problem zu verwenden, und ich kann mir definitiv nicht vorstellen, sie in C zu verwenden.altes PHP-Programm,
115106 Bytes+16 für aktuelles PHP, siehe unten
<scriptpath>?n=<number>
mit PHP <5.4, hinzufügen
register_globals=1
zuphp.ini
(+18?)1
durch$n=$_GET[n]
. Oder ersetzen1
mit$n=$argv[1]
, führenphp -f <filename> <number>
.echo$p
mitdie(print$p)
+/- 0 für Funktion:
Schleifen für immer, wenn es nichts findet. Ersetzen Sie
1
durch$p<1e6
, um bei 100k zu brechen, oder durch,$p<$p+1
um eine Schleife zu erstellen , bis ein ganzzahliger Überlauf auftritt. (getestet mit PHP 5.6)Beispiele (zur Funktion)
Beispiele Ausgabe
quelle