Obwohl verwandte Herausforderungen gestellt wurden, ist dies eine andere, um seine eigene Frage zu rechtfertigen.
Herausforderung
Bei einer positiven Ganzzahl wird die längste Folge aufeinanderfolgender positiver ungerader Ganzzahlen zurückgegeben, deren Summe die angegebene Ganzzahl ist. Wenn eine solche Sequenz nicht vorhanden ist, können Sie einen Fehler in einer für Ihre Sprache sinnvollen Weise melden, einschließlich der Rückgabe eines falschen Werts oder der Auslösung einer Ausnahme.
Testfälle
1 -> [1] 2 -> [] 3 -> [3] 4 -> [1, 3] 5 -> [5] 6 -> [] 9 -> [1, 3, 5] (beachte, dass [9] keine gültige Antwort ist) 15 -> [3, 5, 7] 104 -> [23, 25, 27, 29] (beachte, dass [51, 53] keine gültige Antwort ist)
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in jeder Sprache.
Antworten:
Haskell,
6765636258 Bytes4 Bytes gespart dank Julian Wolf
Probieren Sie es online!
Ich überprüfen , ob die Zahl kann als er Differenz von zwei Quadraten ausgedrückt werden:
m^2-n^2
. Ich kann dann die Liste der aufeinanderfolgenden ungeraden Zahlen konstruieren:[2n+1,2n+3...2m-1]
. Beachten Sie, dassn
die längste Liste ausgegeben wird , da das Minimum ausgewählt istquelle
x
für beiden
undm
Python 2 ,
6662 BytesBeendet mit einem RuntimeError (maximale Rekursionstiefe überschritten), wenn es keine Lösung gibt.
Probieren Sie es online!
quelle
Jelly ,
11 bis10 Bytes-1 Byte dank Dennis (benutze das implizite Range Building von
Ẇ
- ersetzenRm2Ẇ
durchẆḤ’
)Ein monadischer Link, der nach Möglichkeit eine Liste der Summanden zurückgibt oder
0
nicht.Probieren Sie es online!
Wie?
quelle
ẆḤ’
Speichert ein Byte.JavaScript (ES7),
87868581 BytesGibt eine durch Kommas getrennte Liste von Ganzzahlen zurück oder
0
falls keine Lösung vorhanden ist.Wie?
Wir suchen zuerst nach dem kleinsten perfekten Quadrat s, so dass x = n + s ein weiteres perfektes Quadrat ist.
Wenn s existiert, ist n die Differenz x - s von 2 perfekten Quadraten, die als Differenz von 2 Folgen aufeinanderfolgender ungerader Zahlen geschrieben werden kann. Wir erstellen dann die resultierende Liste.
Beispiel:
Für n = 104 :
Wir finden s = 11² = 121, was x = n + s = 225 = 15² erfüllt
Dann:
15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21
104 = 15² - 11² = 23 + 25 + 27 + 29
Code-Snippet anzeigen
quelle
n^2
immer die Summe der erstenn
ungeraden Zahlen ist? Huh, interessant05AB1E ,
98 Bytes-1 Byte danke an Emigna
Erläuterung:
Bei ungültiger Eingabe wird nichts ausgegeben.
Probieren Sie es online!
quelle
ʒOQ}
stattDO¹QÏ
speichert ein Byte.Haskell ,
61-60BytesVielen Dank an @maple_shaft für das Abschneiden von 1 Byte
Probieren Sie es online!
Verwendet die Tatsache, dass der längste Lauf immer der Lauf ist, der mit der niedrigsten Zahl beginnt.
Ich wollte etwas mit Arithmetik machen, anstatt zu brachialisieren
k
, aber esfromInteger
scheint zu töten.quelle
[1,3..n]
zu[1,3..]
r?n=[r,r+2..n]
. Probieren Sie es online!Python , 67 Bytes
Probieren Sie es online!
Ich kopierte meine Antwort aus der vorherige Mal in Folge Summe Herausforderung und wechselte das
+1
zu+2
. Wer hätte gedacht, dass Golf-Code so modular sein kann?Eine seltsam einfache Strategie: Suchen Sie nach dem Intervall
R
mit der gewünschten Summe.R
.Da das untere Ende des Intervalls nur zunimmt, werden längere Intervalle vor kürzeren gefunden. Wenn kein mögliches Intervall gefunden werden kann, wird mit IndexError abgebrochen.
quelle
JavaScript (ES6),
6564 ByteGibt ein Array zurück, wenn es eine Lösung gibt, oder 0 für keine Lösung.
Dies ist eine äußerst ineffiziente und dennoch golferische Lösung des Problems.
Es sucht nach der ersten Lösung mit
a-i
undi=1
, auch wenn es die rekursive Stapel nicht aufzuarbeiten. Beginnt diese Lösung nicht miti+2
, suchen wir rekursiv mita
und nach der ersten Lösungi+2
.Ungolfed
Testfälle:
Code-Snippet anzeigen
Für eine Vorstellung davon, wie ineffizient dies ist,
f(104)
erfordert die Lösung 69.535 rekursive Aufrufe. Der Stapel ist nie tiefer als 51 Ebenen, daher kein Problem mit dem Stapelüberlauf.Die Lösung
f(200)
erfordert 8,6 Millionen rekursive Aufrufe mit einem Stack von 99 Ebenen. (Seine Lösung ist[11,13,15,17,19,21,23,25,27,29]
.)Hier ist eine visuelle Darstellung des laufenden Programms:
Code-Snippet anzeigen
quelle
Python 2.7,
10910897 Bytes11 Bytes weniger, danke an Erik den Outgolfer.
Dies ist mein erster Code Golf!
Wie es funktioniert
Ich habe die bekannte Identität benutzt
1 + 3 + 5 + ... + (2n - 1) = n²
Nehmen Sie den Fall von
15
Im Allgemeinen, wenn es x Begriffe gibt
2n + 1
, die mit wie beginnenEs ist gleich
2nx + x²
Wenn
N
es sich um die Eingabe-Ganzzahl handelt, wird das Problem auf das Finden des Maximums reduziert,x
sodassEs ist eine quadratische Gleichung mit Lösung
Die längste Sequenz ist eine mit der größten
x
. Das Programm iteriertn
von0
bis,N
und wenn es feststellt, dass es sich umx
eine Ganzzahl handelt, erstellt es eine Liste von(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))
und gibt sie zurück.quelle
Python 3,
19081 BytesVielen Dank an @ovs und @ musicman523
quelle
print
Klammern fehlenl.append(i)
indem Sie einfachl+[i]
in dem rekursiven Aufruf verwenden. Sie können entfernen,l.pop(0)
indem Siel[1:]
in dem rekursiven Aufruf verwenden. Sie können den Aufruf vonc
ganz unten entfernen, indem Sie stattdessen Schlüsselwortargumente verwenden. Sie können>0
in Zeile 2 entfernen . Schließlich können Sie Ihreif
undelse
-Anweisungen in Ausdrücke umwandeln, indem Sie die ternäre Form verwenden, die Sie als Lambda-Ausdruck auf 92 Byte reduziert. Probieren Sie es online!i
auf insgesamt 81 Bytes reduzieren .sum(l)>q else
umq<sum(l)else
1 Byte zu speichern.QBIC , 47 Bytes
Dies versucht, alle ungeraden Zahlen von eins bis zu ihrer Summe zu zählen
n
. Wenn es erfolgreich istn
, setzen Sie die Schleife zurück, erhöhen Sie 1 auf 3 und versuchen Sie es erneut. Beenden Sie und geben Sie 0 aus, wenn am Anfang der Schleife unsere Nummer steht> n
.Erläuterung
quelle
R , 90 Bytes
Probieren Sie es online!
Verwendet eine rekursive Funktion, mit der die kumulative Summe von y: x einer Sequenz mit ungeraden Zahlen getestet wird. y wird bei jeder Rekursion erhöht, bis x überschritten wird. Die erste Sequenz, die dem Ziel entspricht, wird zurückgegeben.
quelle
Python 2 , 89 Bytes
Eine unbenannte Funktion, die eine positive Ganzzahl verwendet
n
und das Ergebnis zurückgibt, falls es existiert, und eineIndexError
andere auslöst.Probieren Sie es online!
Erstellt eine Liste aller relevanten ungeraden Zahlen, mit
r(1,n+1,2)
denen istrange(start=1, stop=n+1, step=2)
; erstellt alle relevanten Sub-Slices (plus einige leere), indem sie diese voni
inklusive zuj
exklusiv mit[i:j]
acrossi
in [0, n) mitr(n)
undj
in [0, n] mitr(n+1)
(die leeren, wenni>=j
oderi
außerhalb der Grenzen) aufteilen; Filter für diejenigen mit der richtigen Summe mitif sum(v)==n
; gibt den ersten (und damit längsten) solchen Slice mit zurück[0]
.quelle
Python 2 ,
91 bis90 Bytes-1 Byte dank @CMcAvoy
Probieren Sie es online!
quelle
Pyth, 11 Bytes
Probieren Sie es hier aus.
quelle
PHP , 73 Bytes
Keine Lösung ist eine Endlosschleife
Probieren Sie es online!
PHP , 83 Bytes
druckt nichts für keine Lösung
jeder eingang mod 4 == 2 hat keine lösung
Probieren Sie es online!
quelle
Python 2 ,
122121119115 Bytes-1 Byte dank musicman523. -4 Bytes dank Step Hen. Haha
Probieren Sie es online!
quelle
range
. Probieren Sie es online aus!Python 3 , 93 Bytes
Probieren Sie es online!
Ich habe nur festgestellt, dass dies
(s+e)*(2+e-s)==4*n
äquivalent istsum(range(s,e+1,2))==n
, und obwohl sie die gleiche Größe habenr=range
, kann ersteres näher an dieif
Aussage herangeführt werden.quelle
Python 3 , 185 Bytes
Probieren Sie es online!
Was die Funktionsweise betrifft, habe ich versucht, eine etwas elegantere Lösung als eine einfache Brute-Force-Suche zu finden. Ich habe die Formel für die Summe einer arithmetischen Folge neu angeordnet und die quadratische Formel angewendet, um den Ausdruck zu erhalten
(1-a+((a-1)**2+4*s)**(.5))/2
, der im Code erscheint. Was der Ausdruck berechnet, ist bei gegebener gewünschter Summes
und einem ersten Term für die arithmetische Folgea
die Länge der Folge. Diese Längen werden in einem Wörterbuch als Werte zu den ersten Begriffen als Schlüssel gespeichert.Als Nächstes werden alle nicht ganzzahligen Werte aus dem Wörterbuch entfernt, da diese ungültige Sequenzen darstellen. Von dort wird der größte Wert mit identifiziert
max(d.keys(), key=(lambda k: d[k]))
und die Folge von ungeraden Zahlen an dieser Position und in dieser Länge mit erstelltlist(range(int(m),int(m+2*d[m]),2))
.Ich suche Hilfe beim Golfen, wenn Sie etwas sehen. Ich war mehr daran interessiert zu sehen, wie gut ich mit einem nicht trivialen Algorithmus umgehen kann. Meine Antwort ist fast doppelt so lang wie die beste Python-Lösung.
quelle
Mathematica, 56 Bytes
Function
mit erstem argument#
.Table[n,{n,1,#,2}]
berechnet die Liste der positiven ungeraden Zahlen kleiner oder gleich#
.Subsequences
Gibt alle Untersequenzen dieser Liste in aufsteigender Reihenfolge zurück. Wir nehmen dann dieCases
welche Übereinstimmungx_/;Tr@x==#
, das heißt Sequenzen,x
so dass ihre SummeTr@x
gleich der Eingabe ist#
. Wir nehmen dann dieLast
solche Reihenfolge.quelle
JavaScript (ES6), 72 Byte
Gibt eine durch Leerzeichen getrennte Folge von ungeraden Zahlen zurück oder wirft bei ungültiger Eingabe. 84-Byte-Version, die ein (bei Bedarf leeres) Array zurückgibt:
Erläuterung: Basiert lose auf der awk-Lösung von @ Cabbie407 für Summen aufeinanderfolgender Ganzzahlen, außer dass ich mithilfe von Rekursion einige Bytes speichern konnte.
quelle
PHP, 78 Bytes
Endlosschleife, wenn keine Lösung.
?$b>$argn+2?$n=[]:1:0
Nach einfügen$s-$argn
, um stattdessen ein leeres Array zu drucken.Laufen Sie mit
-nR
oder versuchen Sie es online .quelle
C # (.NET Core) , 129 Byte
Gibt Zahlen in einer Zeichenfolge mit Leerzeichen aus (für jedes andere Zeichen muss nur das Zeichen geändert werden
" "
). Bei Eingabe ohne Lösung wird eine leere Zeichenfolge zurückgegeben (wenn die Ausführung für immer ohne Fehler eine gültige Methode ist, um anzugeben, dass keine Lösung vorhanden ist, können durch Entfernen 17 Byte gespeichert werdenif(b==e)return"";
).Algorithmus ist:
quelle
(i)=>
wiei=>
C ++, 157 -> 147 Bytes
-10 Bytes dank DJMcMayhem
Gibt 0 zurück, wenn keine Antwort erfolgt, andernfalls 1
Die letzte Zeile, die gedruckt wird, ist die Antwort
ungolfed:
Das ist mein erster Code Golf ^^
quelle
int v=0;
anstattint v;....v=0;
und wenn Sie Ihre Ausgabe Newline-getrennt machen, könnten Siestd::cout<<k<<"\n";
die zweite Newline insgesamt machen und dann entfernenKotlin, 152 Bytes
Probieren Sie es online aus (Warten Sie 4-5 Sekunden, der Compiler ist langsam)
Ungolfed
quelle
Excel VBA, 139 Bytes
Sub
Routine, die die Eingaben
einer Ganzzahl des erwarteten Typs annimmt und die längste Folge von ungeraden Folgenummern an die Zelle meldet[A1]
quelle