Verwenden wir die vier Grundoperationen Addition +
, Multiplikation *
, Subtraktion -
und Division /
(float, nicht integer).
Stewies Sequenz ist wie folgt definiert:
x = [x(1), x(2)] // Two initial numbers (one indexed)
x(3) = x(1) + x(2)
x(4) = x(2) * x(3)
x(5) = x(3) - x(4)
x(6) = x(4) / x(5)
x(7) = x(5) + x(6)
... and so on.
Herausforderung:
Nehmen Sie zwei nicht negative ganze Zahlen ( x(1), x(2)
) und eine positive ganze Zahl N
als Eingabe.
x(1)
und x(2)
sind die beiden ersten Nummern Ihrer Sequenz und N
die Länge der Sequenz, die Sie ausgeben müssen. (Sie können wählen, ob die Liste 0-basiert sein soll. In diesem Fall ist die Liste N
um eins kürzer als die Länge).
- Das kann man nicht annehmen
x(2) >= x(1)
. N
wird immer>2
1-basiert sein (>1
wenn 0-basiert).- Sie müssen keine Division durch Null-Fehler verarbeiten.
- Beachten Sie den 2. Testfall. Sie werden nicht
0, 1
undN=6
als Eingabe erhalten, da dies zu einer Division durch Null führt, aber Sie müssen0, 1
und unterstützenN=5
.
- Beachten Sie den 2. Testfall. Sie werden nicht
- Angenommen, es wird nur eine gültige Eingabe gegeben.
- Die Eingabe und Ausgabe kann in einem beliebigen Format erfolgen, Sie müssen jedoch mindestens 3 Nachkommastellen unterstützen, wenn die Ausgabe nicht ganzzahlig ist.
Testfälle:
1 3
8
1, 3, 4, 12, -8, -1.5, -9.5, 14.25
0 1
5
0, 1, 1, 1, 0 // N=6 would give division by zero error. You don't need to handle that case.
1 0
9
1, 0, 1, 0, 1, 0, 1, 0, 1
6 3
25
6, 3, 9, 27, -18, -1.5, -19.5, 29.25, -48.75, -0.6, -49.35, 29.61, -78.96, -0.375, -79.335, 29.7506, -109.086, -0.272727, -109.358, 29.825, -139.183, -0.214286, -139.398, 29.8709, -169.269
N
0-basiert sein? Nehmen Sie also als Eingang 1 weniger als das in Ihren Beispielen gezeigte N. Ich denke, N-2 zu nehmen ist zu viel, um danach zu fragen ... :-PAntworten:
MATL ,
191817 BytesDie Eingabe ist in dem Format:
N
(0-basiert),x(1)
,x(2)
(als Zeichenkette); Alle durch Zeilenumbrüche getrennt.Probieren Sie es online! Oder überprüfen Sie alle Testfälle (leicht modifizierter Code; Ausgabesequenzen durch eine Leerzeile getrennt).
Erläuterung
MATL hat keine ordnungsgemäße
eval
Funktion, aberU
(str2num
) kann numerische Ausdrücke mit Infix-Operatoren auswerten.Jeder neue Begriff wird berechnet und auf den Stapel verschoben, wobei die vorherigen Begriffe beibehalten werden. Der gesamte Stapel wird am Ende gedruckt.
quelle
Haskell,
696864 Bytesx1
undx2
werden als Liste genommen. Anwendungsbeispiel:[1,3] # 8
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Durch Faulheit ist es möglich, eine unendliche rekursive Liste zu definieren, in der die ersten n Elemente verwendet werden.
Haskell, 66 Bytes
Anderer Ansatz, etwas länger. Argument Ordnung ist
N
,x2
,x1
. Anwendungsbeispiel:( (.a).(.).take ) 8 3 1
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Definiert 4 Funktionen
a
,b
,c
undd
die zwei Argumentey
,x
und um eine Liste zu machen , indem siex
vor einem Anruf an die nächste Funktion mity
als zweites Argument undx op y
wie die erste. Zum Beispiela
ist:a y x = x : (b (x+y) y)
,b
tut Multiplikation:b y x = x : (c (x*y) y)
etc.Edit: @Michael Klein hat in der 1. Variante (
#
) ein Byte gespeichert . Zum Glück habe ich auch ein Byte für die zweite Variante gefunden, also haben beide wieder die gleiche Länge.Edit II: @Zgarb hat 2 Bytes in der zweiten Version zum Speichern gefunden und I 4 in der ersten, sodass sie nicht mehr die gleiche Länge haben.
quelle
(.)
mit anderen Funktionen komponiert bin : pg x=(`take`f)where
speichert kein Byte: - /(h%g)y x=x:g(h x y)y
ES6 (Javascript),
79,6765 BytesAKTUALISIEREN
Golf gespielt
Prüfung
quelle
++i
vermeiden, 1 zu 2 zu addiereni
??S(n,a,i+1,a.push(...)):a
einige Bytes einsparen.a.push
die neue Länge zurückgibt,S=(n,a,i=2)=>i<n?S(n,a,a.push(...)):a
i=2
.S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"+*-/"[i%4]+a[i-1]))):a
2 Bytes einsparen.Python 3,
908074 Bytesxnor wird wahrscheinlich kommen und diese Lösung zerstören ...
Die Funktion ändert die an sie übergebene Liste. Verwenden Sie wie folgt:
Versuchen Sie es mit repl.it!
-6 Bytes dank Kupfer
quelle
O
einmal verwenden, können Sie einige Bytes sparen,'-/+*'[i%4]
indem Sie die Deklaration von ausführen und entfernenO
. Möglicherweise können Sie auch die wiederholten Anrufe umgehen,str
indem Sie etwas wie tuneval('%s'*3%(s[-2],'-/+*'[i%4],s[-1]))
.s+=[...]
kann ersetzt werden durchs+=...,
(Komma am Ende beachten).i
als Eingabe erhalten, sodass Sie nicht den Standardwert dafür benötigen (i=2
kann nur seini
). Zwei Bytes aus.n
stattdessen erlaubt war, das th-Element in der Sequenz zurückzugeben, ist dies 1 Byte kürzer mit Rekursion:f=lambda x,n:n<2and x[n-1]or eval('%s'*3%(f(x,n-2),'*-/+'[n%4],f(x,n-1)))
Perl 6 ,
75 7161 BytesProbier es aus
Probier es aus
Probier es aus
Erweitert:
quelle
Mathematica, 68 Bytes
Kaum auf den 3. Platz geschlichen! Unbenannte Funktion von drei Argumenten, die einen Hilfsoperator verwendet
±
, der±n
genau das n-te Element x (n) der Stewie-Sequenz ist. Die ersten beiden Argumente sind x (1) und x (2), und das dritte Argument ist das N, das angibt, welches x (N) wir ausgeben.Direkte Implementierung unter Verwendung einer Mod-4-Berechnung zur Auswahl der Binärfunktion, die auf die beiden vorherigen Terme angewendet werden soll. Bei der Auswahl der richtigen Binärfunktion, die
1##[#-#2,#/#2,+##]
hilfreich ist, werden einige dieser unterhaltsamen Mathematica-Golftricks verwendet .quelle
05AB1E ,
211918 BytesDie Eingabe erfolgt in der Reihenfolge N (0-basiert), x (2) , x (1) .
1 Byte dank Carusocomputing eingespart .
Probieren Sie es online!
Erläuterung
Wir erstellen iterativ den Stapel mit dem neuesten Element in der Sequenz oben, während alle vorherigen Elemente in der richtigen Reihenfolge bleiben.
Dann wickeln wir den Stack am Ende in eine Liste, um alle Werte auf einmal anzuzeigen.
quelle
XY
undUV
können Sie Bytes sparen.UX
:)Common Lisp, 158
Nicht wirklich konkurrenzfähig, aber ich mag, wie es ganz natürlich ausgedrückt wird:
Wir ignorieren Fehler bei der Berechnung von R, wodurch R (und dann B) möglicherweise den NIL-Wert annehmen. Dies ermöglicht die Ausgabe des aktuellen Ergebnisses, auch wenn der nächste Wert undefiniert ist. Dann schlägt die Schleife möglicherweise fehl, aber das entspricht den Regeln.
Tests
Wir benennen die Funktion
F
und stellen sicher, dass die erwarteten Werte in etwa den getesteten entsprechen.Der Grund für den ungefähren Test ist, dass die berechneten Werte etwas genauer sind als erforderlich. hier für
(f 6 3 25)
:quelle
dc,
112110108 bytesManchmal sind die
dc
Antworten sehr lang und manchmal sehr kurz. Es kommt nur auf die jeweilige Herausforderung an, wie es bei vielen anderen Sprachen der Fall ist. Auf jeden Fall werden Sie aufgefordert, eine durch Leerzeichen getrennte, einseitig indizierte Befehlszeileneingabe von 3 ganzen Zahlen einzugeben.x(1), x(2), N
jeden Fall werden Sie beim Aufruf zur aufgefordert, und jedes Element der Sequenz wird in separaten Zeilen mit nicht ganzzahligen Ausgaben ausgegeben, die 5 Nachkommastellen enthalten.Die Eingabe
6 3 25
führt beispielsweise zu folgender Ausgabe:quelle
Perl, 62 + 3 (
-pla
Flag) = 65 BytesVerwenden von:
quelle
Ruby, 79 Bytes
Ich vermute, dass dies alles andere als optimal ist (und ich habe mir die anderen Antworten noch nicht angesehen), aber es macht trotzdem Spaß.
Ich wollte ein bisschen Spaß haben
Enumerable#cycle
, aber leider sind es 4 Zeichen weniger, die ich nur verwenden kann%4
.quelle
C ++ 14, 118 Bytes
Als unbenanntes Lambda modifiziert es seine Eingabe. Muss
v
einvector<double>
oder seinvector<float>
.Ungolfed und Nutzung:
quelle
x86-64-Maschinencode, 34 Byte
Aufrufkonvention = x86-64 System V x32 ABI (Registerargumente mit 32-Bit-Zeigern im ).
Die Funktionssignatur ist
void stewie_x87_1reg(float *seq_buf, unsigned Nterms);
. Die Funktion empfängt die Startwerte x0 und x1 in den ersten beiden Elementen des Arrays und erweitert die Sequenz auf mindestens N weitere Elemente. Der Puffer muss auf 2 + N aufgerundet auf das nächste Vielfache von 4 aufgefüllt werden. (dh2 + ((N+3)&~3)
oder nur N + 5).Das Erfordernis von gepolsterten Puffern ist beim Zusammenbau von Hochleistungs- oder SIMD-vektorisierten Funktionen normal, und diese entrollte Schleife ist ähnlich, sodass ich nicht denke, dass sie die Regeln zu sehr verbiegt. Der Aufrufer kann (und sollte) problemlos alle Auffüllelemente ignorieren.
Das Übergeben von x0 und x1 als eine Funktion arg, die nicht bereits im Puffer enthalten ist, würde uns nur 3 Byte kosten (für ein
movlps [rdi], xmm0
odermovups [rdi], xmm0
), obwohl dies eine nicht standardmäßige Aufrufkonvention wäre, da System V übergibtstruct{ float x,y; };
zwei separate XMM-Register .Dies wird
objdump -drw -Mintel
mit ein wenig Formatierung ausgegeben, um Kommentare hinzuzufügenDiese C-Referenzimplementierung kompiliert (mit
gcc -Os
) zu etwas ähnlichem Code. gcc wählt die gleiche Strategie wie ich, nur einen vorherigen Wert in einem Register zu behalten.Ich habe mit anderen Methoden experimentiert, einschließlich einer x87-Version mit zwei Registern und folgendem Code:
Sie würden es auf diese Weise tun, wenn Sie auf Geschwindigkeit aus sind (und SSE nicht verfügbar war)
Das Einfügen der Ladevorgänge aus dem Speicher in die Schleife anstelle eines einmaligen Eintrags hätte möglicherweise geholfen, da wir die Sub- und Div-Ergebnisse nur in einer nicht ordnungsgemäßen Reihenfolge speichern konnten, aber immer noch zwei FLD-Anweisungen zum Einrichten des Stacks beim Eintrag erforderlich sind.
Ich habe auch versucht, SSE / AVX-Skalarmathematik zu verwenden (beginnend mit Werten in xmm0 und xmm1), aber die größere Anweisungsgröße ist umwerfend. Verwenden von
addps
(da das 1B kürzer ist alsaddss
) hilft ein kleines bisschen. Ich habe AVX VEX-Präfixe für nicht kommutative Anweisungen verwendet, da VSUBSS nur ein Byte länger als SUBPS ist (und dieselbe Länge wie SUBSS hat).Getestet mit diesem Testgeschirr:
Kompilieren mit
nasm -felfx32 -Worphan-labels -gdwarf2 golf-stewie-sequence.asm &&
gcc -mx32 -o stewie -Og -g golf-stewie-sequence.c golf-stewie-sequence.o
Führen Sie den ersten Testfall mit aus
./stewie 8 1 3
Wenn Sie keine x32-Bibliotheken installiert haben, verwenden Sie
nasm -felf64
und lassen Sie gcc mit der Standardeinstellung-m64
. Ich habemalloc
anstelle vonfloat seqbuf[seqlen+8]
(auf dem Stapel) verwendet, um eine niedrige Adresse zu erhalten, ohne sie tatsächlich als x32 erstellen zu müssen.Unterhaltsame Tatsache: YASM hat einen Fehler: Es verwendet einen rel32-JCC für den Loop-Zweig, wenn das Zweigziel dieselbe Adresse wie ein globales Symbol hat.
baut auf ...
11f: 0f 8f db ff ff ff jg 100 <stewie_x87_1reg>
quelle
05AB1E , 12 Bytes
Probieren Sie es online!
quelle
Japt , 20 Bytes
Versuch es
quelle
Bash, 224 Bytes (KEIN WETTBEWERB)
Eine enorm große Implementierung in BASH .
Übernimmt die Aufgabe im wahrsten Sinne des Wortes und erledigt alles in einer durchgehenden Pipe, ohne unheilige Kontrollflussstrukturen oder Rekursionen.
Eingang
Golf gespielt
Weniger Golf
Prüfung
Pipeline-Phasen
Generieren Sie eine Tabelle mit Elementindizes + op für jedes Ausgabesequenzelement (eines pro Zeile):
Verwenden Sie sed , um dies in ein lineares bc- Programm umzuwandeln :
füttere das bc und lass es den ganzen Job machen
quelle
Pyth - 20 Bytes
Alle
n
Ausgaben kosten mich.Funktioniert nicht online, da eval.
quelle
Ceylon, 195 Bytes
Formatiert und kommentiert:
Anwendungsbeispiel:
Beispielausgabe:
Das zweite Beispiel zeigt, wie dies mit der Division durch Null umgehen würde. Das letzte Beispiel zeigt, dass die Ergebnisse ein bisschen abweichen, je nachdem, welche Art von Arithmetik (und Rundung) verwendet wird ... Ich denke, dass die 64-Bit-Gleitkomma-Arithmetik von Ceylon etwas näher ist, als in der Frage angegeben .
quelle
Clojure, 99 Bytes
Diese Version ist in der Praxis besser zu benutzen, hat aber 110 Bytes:
Ich hatte Probleme, die iterierte Funktion und eine zyklische Abfolge von Operationen zu verwischen, sodass ich stattdessen einen Zähler verwenden musste. Auch versucht mit einer FSM-Übergangstabelle wie
{+ * * - - / / +}
Ich habe aber ich konnte sie nicht auf weniger Code komprimieren.Könnte als anonyme Funktion ausgedrückt werden
Nicht golfen:
Muss mit floats heißen wie
(f 6.0 3.0 25)
sonst bekommt man rationale Zahlen raus. Alternativ könnte die Iteration gestartet werden,[a (float b) 0]
die einige zusätzliche Zeichen bringt.quelle
Oktave , 91 Bytes
Probieren Sie es online!
Einige Golfplätze:
eval
Aufrufeval
Aufruf*-/+
(in MATLAB nicht möglich)'
und"
um ein Entkommen der Apostrophe zu vermeiden (in MATLAB nicht möglich)n=@num2str
da es zweimal verwendet wird (in MATLAB nicht möglich)quelle