Douglas Hofstadter führt in Gödel, Escher, Bach eine ganzzahlige Folge ein, die gemeinhin als Figur-Figur-Folge bezeichnet wird:
2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...
Es mag Ihnen Spaß machen, die Definition der Sequenz als Teil der Herausforderung selbst zu erarbeiten. Wenn Sie sie jedoch nicht herausfinden können oder wollen, finden Sie sie in OEIS als Sequenz A030124 und eine etwas klarere Definition in Wikipedia .
Schreiben Sie ein Programm oder eine Funktion, die n
über STDIN, ARGV oder ein Funktionsargument eine Liste der ersten n
Nummern der Sequenz in einem beliebigen vernünftigen Listenformat an STDOUT ausgibt.
Dies ist Codegolf, die kürzeste Lösung in Bytes gewinnt.
code-golf
number
number-theory
sequence
Martin Ender
quelle
quelle
Rubin,
5448Demo
Edit: Golfed dies ein bisschen mehr, als mir klar wurde, dass ich nicht die vollständige Komplementsequenz im Gedächtnis behalten muss. So funktioniert es jetzt: Wir verwenden
x
, um die größte berechnete Zahl in der Komplementsequenz zu verfolgen, und esb
handelt sich um einen Pool von Kandidaten für die Sequenz.n
Mal geben wir das kleinste verbleibende Element in ausb
und addieren esx
, um die nächste Zahl in der Komplementsequenz zu berechnen. Dann entfernen wir beide Zahlen aus dem Kandidatenpool, sodass wir immer die kleinste Zahl ausgeben, die keiner Sequenz bereits hinzugefügt wurde.Ruby-Golf-Tricks: Die Stabby-Lambda-Syntax ist kürzer als eine Methodendefinition. Die Anforderung, dass die Ausgabe an STDOUT anstatt als Rückgabewert ausgegeben wird, hat mich dazu inspiriert, die Tatsache zu verwenden, dass der Rückgabewert von
p(x)
istx
, an die ich mich normalerweise nicht erinnere, da dies in der in Anarchy Golf verwendeten Ruby-Version nicht der Fall ist.quelle
2..2*n
. Ich muss verwenden,n*n
weil ich es effektiv mache,b = [x]^b
damit ich das größte Element vonb
größer als den größten Wert von brauchex
, aber Ihrb -= [x]
verlangt nur, dass esb
den größtmöglichen Wert der Ausgabesequenz enthält.Haskell,
676160565553 Zeichenzurück zum ersten Algorithmus.
Diese Lösung berechnet die Komplementsequenz durch Summieren der Startelemente der Sequenz. Dann berechnet es die Folge als alle Zahlen zwischen den Folgenummern des Komplements.
(#)
ist die Funktion, die die Zahlen zwischen der Komplementsequenz berechnet.h
ist die Sequenz selbst.g
ist die Funktion, die die Frage beantwortet.Die g-Funktion ist so definiert, dass sie nur die benötigte Anzahl von Elementen aus h entnimmt.
Feinheiten:
h
ist eigentlich die Figurenfolge mit Ausnahme der ersten 2 Elemente.Es wird nicht die Komplementsequenz berechnet, sondern die Komplementsequenz mit der hinzugefügten 1 für jedes Element.
Diese beiden Feinheiten sind der Grund
scanl(+)8h
(das ist der Code für die Komplementsequenz (mit Ausnahme der ersten 2 Elemente) mit hinzugefügten Einsen)8
. Es ist für das dritte Element der Komplementsequenz, dem 1 hinzugefügt wurde.der Grund , wird die Berechnung die ersten beiden Elemente nicht fehlen, weil sie in dem Nachspiel sind
g
in2:4:h
.Beispiel:
quelle
GolfScript (
2421 Bytes)Online-Demo
Dies fing ganz anders an, endete aber auf einer GolfScript-Portierung der Ruby-Lösung von Histocrat , bevor Dennis einige Vorschläge machte, die in eine etwas andere Richtung gehen. Insbesondere das Drucken der Nummern bei der Identifizierung spart eine Menge Zeit, wenn Sie sie am Ende in einem Array zum Drucken zusammenfassen. Der Grund dafür ist, dass wir uns zu keinem Zeitpunkt Gedanken über mehr als drei Gegenstände auf dem Stapel machen müssen.
Präparation
quelle
^
mit\-
, können Sie ersetzen).*
mit3*
. Dadurch werden keine Bytes gespart, aber die Laufzeit und die Speichernutzung werden drastisch reduziert. - Sie sollten ein Byte speichern können, indem Sie die Ganzzahl über dem Array belassen. Die Schleife hat die gleiche Byteanzahl, die Initialisierung ist jedoch ein Byte kürzer.~.3*,1>\{(\(.p@+\|}*;
J - 28 Zeichen
Funktion
n
als Argument nehmen.Wir führen eine Funktion mit dem
n
Argument left so oft auf das Argument right aus, bis keine Änderung mehr erfolgt. Das zu startende Argument ist die Liste2 4
.In der Funktion selbst nehmen wir die Teilsummen
+/\
und die Gesamtsumme+/
und erhöhen sie dann mit&:>:
. Wir generieren dann jede ganze Zahl von 2 bis zu einer, die mehr als die volle Summe (2+i.
) ist, und setzen subtrahieren (-.
) die Teilsummen, wobei wir per Definition eine längere Figur-Figur-Sequenz hinterlassen. Schließlich kürzen oder verlängern wir die Liste zyklisch auf Längen
.Das Ergebnis ist, dass
2 4
wird3 7
, und dies wird vom2..8
Verlassen entfernt2 4 5 6 8
. Nach einer weiteren Runde2 4 5 6 8
wird3 7 12 18 26
wirdAuf diese Weise erweitern wir immer wieder die Figurenfolge. Das
$
Längenverhalten ist nur eine nicht triviale Methode, um darauf zu warten, dass die Sequenz längern
oder länger wird, und dien
ersten Werte auszugeben , wenn sie sich nicht mehr ändern. Wir müssen auch nicht lange warten: Wir können bis zu 46336 Terme aus vier Anwendungen des inneren Verbs erhalten.Die gleiche Funktion in k:
{{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
{{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}
quelle
Java -
183158Das war das Meiste, was ich je golfen habe und ich bin stolz darauf! (Obwohl es nicht in der Nähe der Spitze der Charts ist (weil es Java ist))
Danke an Peter Taylor für die Vorschläge
größer -
quelle
Byte.valueOf
spart drei, und da die Frage nicht den Bereich der Eingabe spezifiziert, denke ich, sollte es akzeptabel sein. Außerhalb der Schleifenm
wird nur zur Initialisierung verwendetn
, sok++<m
könnte seinm-->0
, beseitigenk
vollständig.int[] n
kann als initialisiertint n[]
und mit dem vorherigen Initialisierer zusammengeführt werden.n
hält niemals andere Werte als1
, son[...]!=0
könnte es seinn[...]>0
. Der Initialisierer kann dann der Initialisiererteil der erstenfor
Schleife werden.u
und nur verwenden++w
, müssen Sien[q]
oder nicht einstellenn[w]
. Es gibt einen Fehler, dass Sie das Ende ablaufen ,n
wennm==2
, das scheint nach der Initialisierung am besten festgelegt werdenn=new int[2*m*m]
, aber ich denke , es ist auf 157 Bytes nach unten.for(int q=1,w=2,m=...,n[]=...;m-->0;){...
Speichern eines Semikolons.Python 2 - 77 Bytes
Code:
Funktioniert genauso wie die Lösung von @ histocrat, außer dass die Eingabe von stdin stammt.
quelle
Python 2 - 68
quelle
Gelee , 15 Bytes
Probieren Sie es online!
Speicherfehler am Eingang von 6.
Wie es funktioniert
Effizientere Version, 16 Bytes
Probieren Sie es online!
Verwendet eine Idee aus dieser Antwort . Schneiden Sie jede Iteration auf die gewünschte Länge ab und nehmen Sie den Fixpunkt. Ich habe überlegt,
S
(sum) anstelle vonṀ‘
(max + 1) zu verwenden, kann aber die Richtigkeit nicht garantieren.quelle