Schreibe eine Programm oder eine Funktion zur Ausgabe der Summe der Quadratzahlen ungerade (OEIS # A016754) weniger als eine Eingabe n
.
Die ersten 44 Zahlen in der Sequenz sind:
1, 9, 25, 49, 81, 121, 169, 225, 289, 361, 441, 529, 625, 729, 841, 961, 1089,
1225, 1369, 1521, 1681, 1849, 2025, 2209, 2401, 2601, 2809, 3025, 3249, 3481,
3721, 3969, 4225, 4489, 4761, 5041, 5329, 5625, 5929, 6241, 6561, 6889, 7225, 7569
Die Formel für die Sequenz lautet a(n) = ( 2n + 1 ) ^ 2
.
Anmerkungen
- Das Verhalten Ihres Programms ist möglicherweise undefiniert für
n < 1
(dh alle gültigen Eingaben sind>= 1
.)
Testfälle
1 => 0
2 => 1
9 => 1
10 => 10
9801 => 156849
9802 => 166650
10000 => 166650
code-golf
arithmetic
Thomas
quelle
quelle
Antworten:
Gelee, 6 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Für alle positiven ganzen Zahlen k gilt 1² + 3² + ⋯ + (2k - 1) ² = k (2k - 1) (2k +1) ÷ 3 .
Da gibt es m C r = m! ÷ ((mr)! R!) R -Kombinationen einer Menge von m Elementen, die oben als (2k + 1) C 3 = (2k + 1) 2k (2k - 1) ÷ 6 = k (2k) berechnet werden können - 1) (2k + 1) ÷ 3.
Um die Formel anzuwenden, müssen wir die höchsten 2k + 1 so finden, dass (2k - 1) ² <n ist . Wenn wir die Parität für einen Moment ignorieren, können wir das höchste m so berechnen, dass (m - 1) ² <n als m = ceil (srqt (n)) gilt . Um m bedingt zu erhöhen, wenn es gerade ist, berechnen Sie einfach m | 1 (bitweises ODER mit 1 ).
Wie es funktioniert
quelle
JavaScript (ES6), 30 Byte
31 Bytes, wenn
f(1)
Null statt False zurückgegeben werden soll:quelle
05AB1E ,
108 BytesCode:
Erläuterung:
Könnte sich als nützlich erweisen:
t;L·<nO
.Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
Haskell, 30 Bytes
Überraschend normal aussehend.
quelle
C #,
126131 BytesÜberarbeitete Version, um der neuen Frage zu entsprechen:
Hardcoded Limit verwenden:
quelle
# Language name, number bytes
Konsistenz.Console.Read
am Ende?namespace
s sind für einzelne Dateien nicht erforderlich.System.Console.Write(s);
wenn es funktioniert und wenn Sie das nicht brauchenConsole.Read
.Gelee, 7
Probieren Sie es online oder versuchen Sie es mit einer geänderten Version für mehrere Werte
Shh ... Dennis schläft ...
Danke an Sp3000 im Chat für die Hilfe!
Erläuterung:
quelle
R,
3836 Bytes@ Giuseppe sparte zwei Bytes durch Verschieben
x
in die Argumentliste ging, um die geschweiften Klammern zu speichern. Tolle Idee!Ungolfed
Probieren Sie es online!
quelle
x
in ein Standardfunktionsargument wechseln und dann die geschweiften Klammern entfernen.C,
51, 50,48 BytesDenn warum nicht in einer der wortreichsten Sprachen Golf spielen? (Hey, zumindest ist es nicht Java!)
Probieren Sie es online!
Volles ungolfed Programm mit Test I / O:
quelle
most verbose languages
Golfer als Python, C #, LISP, Forth, etc, C ist eigentlich ziemlich gut für Golf< 50 bytes
. Außerdem gibt es eine entsprechende Meta - Post hier .Eigentlich 7 Bytes
Probieren Sie es online!
Auch für 7 Bytes:
Probieren Sie es online!
Dies verwendet die gleiche Formel wie in Dennis 'Gelee-Antwort.
Erläuterung:
quelle
Literally
?Oktave, 23 Bytes
Testen:
quelle
CJam, 15 Bytes
Probieren Sie es online!
Hardcodierte 10000-Lösungen:
Martins 12-Byte-Lösung:
Meine ursprüngliche 13-Byte-Lösung:
Probieren Sie es online!
quelle
Pyth, 10 Bytes
Testsuite
Erläuterung:
quelle
s<#Q%2t^R2
Mathcad, 31 "Bytes"
Beachten Sie, dass Mathcad Tastenkombinationen verwendet, um mehrere Operatoren einzugeben, einschließlich der Definition und aller Programmieroperatoren. Beispiel: ctl-] gibt eine while-Schleife ein. Sie kann nicht eingegeben werden und nur über die Tastenkombination oder über die Programmiersymbolleiste. "Bytes" ist die Anzahl der Tastaturoperationen, die zur Eingabe eines Mathcad-Elements erforderlich sind (z. B. Variablenname oder Operator).
Da ich keine Chance habe, diesen Wettbewerb zu gewinnen, dachte ich, ich würde mit einer direkten Formelversion ein bisschen Abwechslung schaffen.
quelle
Schläger, 57 Bytes
quelle
MATL , 10 Bytes
EDIT (30. Juli 2016): der verknüpften Code ersetzt
9L
durch1L
die jüngsten Änderungen in der Sprache anzupassen.Probieren Sie es online!
quelle
Python, 39 Bytes
Wenn z.
n=1
B.False
eher eine Ausgabe als eine Ausgabe zulässig ist,0
können wir die Basisfallkonvertierung vermeiden, um 37 Bytes zu erhaltenEs ist seltsam , dass ich nicht einen kürzeren Weg zu bekommen gefunden
0
füri*i>=n
und ungleich Null sonst. In Python 2 bekommt man noch 39 Bytes mitquelle
bool
ist eine Unterklasse vonint
in Python, was bedeutet, dassFalse
ein akzeptabler Wert für0
.Python,
4238 Bytesquelle
Python 2, 38 Bytes
Basierend auf Dennis 'Formel mit
s==-2*k
. Gibt einen Float aus. Tatsächlich wird die Eingabe quadratisch, dekrementiert und dann auf die nächste gerade Zahl aufgerundet.quelle
PARI / GP ,
333226 BytesAngepasst von Dennis 'Code :
Meine erste Idee (30 Bytes) mit einer einfachen Polynomformel:
Dies ist eine effiziente Implementierung, die sich eigentlich nicht sehr von der ungolfed Version unterscheidet, die ich schreiben würde:
Eine alternative Implementierung (37 Byte), die über jedes der Quadrate eine Schleife ausführt:
Eine andere alternative Lösung (35 Byte), die das Summieren ohne temporäre Variable demonstriert:
Noch eine andere, nicht besonders konkurrenzfähige Lösung (40 Byte), die die L 2 -Norm verwendet . Dies wäre besser, wenn Vektoren mit Schrittgrößenindizes unterstützt würden. (Man könnte sich die Syntax vorstellen, bei der
n->norml2([1..((n-1)^.5+1)\2..2])
8 Bytes verloren gehen.)quelle
Haskell,
3231 BytesAnwendungsbeispiel:
(#1) 9802
->166650
.Edit: @xnor speicherte ein Byte mit einem klugen Listenverständnis. Vielen Dank!
quelle
n#x=sum[x^2+n#(x+2)|x^2<n]
Julia, 29 Bytes
Dies ist eine rekursive Funktion, die eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt.
Wir beginnen einen Index bei 1, und wenn sein Quadrat kleiner als die Eingabe ist, nehmen wir das Quadrat und addieren das Ergebnis der Wiederverwendung zum Index + 2, wodurch sichergestellt wird, dass gerade Zahlen übersprungen werden, andernfalls geben wir 0 zurück.
quelle
Oracle SQL 11.2, 97 Byte
quelle
Julia, 26 Bytes
Dies konstruiert den Bereich aller ungeraden positiven ganzen Zahlen unter n und die Anordnung der Quadrate der Ganzzahlen in diesem Bereich und berechnet dann die Summe der Ganzzahlen in beiden Iterablen.
Probieren Sie es online!
quelle
Reng v.3.3, 36 Bytes
Probieren Sie es hier aus!
Erläuterung
1: Initialisierung
Setzt
c
auf0
(den Zähler) und die EingabeI
für diem
Axt.1ø
geht zur nächsten Zeile.2: Schleife
:
dupliziert den aktuellen Wert (die quadrierte ungerade Zahl) und [Ichm
lege diem
Axt nieder. Ich habe den Lesser-als-Trick in einer anderen Antwort verwendet , die ich hier verwende.%:1,e
prüft ob der STOS <TOS. Wenn es so ist,q^
steigt es auf und bricht aus der Schleife aus. Andernfalls:c
legt den Zähler ab,2*
verdoppelt ihn,1+
fügt einen hinzu und²
quadriert ihn.c1+#C
Inkrementec
und die Schleife geht wieder.3: endgültig
$
löscht den letzten Wert (größer als gewünscht),a+¡
addiert bis die Länge des Stapels 1 ist,n~
gibt aus und endet.quelle
Clojure, 53 Bytes
Sie können dies hier überprüfen: https://ideone.com/WKS4DA
quelle
Mathematica 30 Bytes
Diese unbenannte Funktion quadriert alle ungeraden Zahlen, die kleiner als die Eingabe (
Range[1,Sqrt[#-1],2]
) sind, und addiert sie.quelle
PHP, 64 Bytes
Erweitert:
Bei jeder Iteration der
for
Schleife addiert sie 2 zu k und prüft, ob k 2 kleiner ist als$i
, wenn k 2 zu addiert wird$a
.quelle
R, 60 Bytes
Entspricht genau der Beschreibung in challenge, einschließlich der Rückgabe von 0 für den Fall n = 1. Degolfed, ';' stellt einen Zeilenumbruch in R dar, der unten ignoriert wird:
quelle
Java 8,
12811911711149 BytesBasierend auf der C # -Lösung von @Thomas .
Erläuterung:
Probieren Sie es online aus.
quelle
Python 2, 49 Bytes
Dies endete kürzer als ein
lambda
.Probieren Sie es online aus
Mein kürzestes
lambda
, 53 Bytes :quelle