Herausforderung:
Erstellen Sie bei einer positiven Ganzzahleingabe n einen Vektor, der diesem Muster folgt:
0 1 0 -1 -2 -1 0 1 2 3 2 1 0 -1 -2 -3 -4 -3 -2 -1 ... ±(n-1) ±n
Oder mit Worten erklärt: Der Vektor beginnt bei 0
und führt Inkremente aus, 1
bis er die kleinste ungerade positive Ganzzahl erreicht, die nicht Teil der Sequenz ist, und dekrementiert, bis er die kleinste (in der Größe) gerade negative Ganzzahl erreicht, die nicht vorhanden ist ist nicht Teil der Sequenz. Es geht so weiter bis n
erreicht ist. Die Sequenz endet mit positiv, n
wenn n
ungerade, und negativ, n
wenn n
gerade.
Das Ausgabeformat ist flexibel.
Testfälle:
n = 1
0 1
-----------
n = 2
0 1 0 -1 -2
-----------
n = 3
0 1 0 -1 -2 -1 0 1 2 3
-----------
n = 4
0 1 0 -1 -2 -1 0 1 2 3 2 1 0 -1 -2 -3 -4
-----------
n = 5
0 1 0 -1 -2 -1 0 1 2 3 2 1 0 -1 -2 -3 -4 -3 -2 -1 0 1 2 3 4 5
Sie können sich dafür entscheiden, n mit Nullindex zu verwenden. n = 1
würde dann geben 0 1 0 -1 -2
.
Das ist Code-Golf , also gewinnt der kürzeste Code in jeder Sprache! Erklärungen sind wie immer erwünscht!
Antworten:
R ,
5854504843 Bytes-2 Bytes dank MickyT
Probieren Sie es online!
quelle
Perl 6 ,
6026 BytesVersuch es
Versuch es
Erweitert:
(-1,-*...*)Z*0..$_
generiert die Sequenz0 1 -2 3 -4 5
quelle
Python 2 ,
695756 BytesProbieren Sie es online!
Für jedes
n
bis wirdinput
dasrange(-n,n)
(inklusive) berechnet, invertiert, wennn
es eine gerade Zahl ist, die ersten zwei Zahlen (nach der Inversion) entfernt und dann an die Ausgabe angehängt.quelle
05AB1E ,
97 Bytes2 Bytes dank @Emigna gespeichert
Probieren Sie es online!
Meine erste 05AB1E-Antwort (glaube ich), daher fehlen mir möglicherweise einige Tricks ...
Erläuterung
Ich muss mich bei @Dennis für die ursprüngliche Verwendung von
Ÿ
bedanken , sonst hätte icheswahrscheinlich nie gewusst ...quelle
ÝεDÈi®*}}Ÿ
ohne zu überprüfen,ā®sm
ist verrückt schlau haha.05AB1E ,
1514 BytesProbieren Sie es online!
Erläuterung
quelle
JavaScript (ES6), 56 Byte
Probieren Sie es online!
Kommentiert
quelle
Haskell , 43 Bytes
Probieren Sie es online!
Berechnet die negierten kumulativen Summen der Liste
[(-1)^k|k<-[1..n],_<-[2..2*k]]
, bei der es sich um die erstenn
Zeilen von handeltquelle
Jelly ,
119 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Haskell ,
4842 BytesProbieren Sie es online!
Danke an Οurous für -1 Byte
Auch wenn es ziemlich offensichtlich im Nachhinein ist, dauerte es eine Weile , um das erreichen
(-1)^i*x
die ,x
wenni
gerade ist , und-x
wenni
ungerade ist . Frühere Iterationen, bei denen:quelle
1-i
anstatt-i+1
im..
Ausdruck.C # (.NET Core) ,
300167 BytesIch habe noch nie etwas davon gemacht, aber das hier schien Spaß zu machen. Ich verstehe, warum die Leute diese "Golf" -Sprachen verwenden, da sie weit über den anderen Antworten zu liegen scheinen. Aber du musst mit dem gehen, was du weißt.
Probieren Sie es online!
quelle
using
Anweisungen und die Funktion zählen. Dies ist standardmäßig zulässig, es sei denn, die Abfrage gibt an, dass es sich um ein vollständiges Programm handeln muss (auch wenn dies der Fall ist, können Sie den enthaltenen Klassennamen verkürzen).[](){};.
)(n-1)*2
gerade umgeben2*n-2
und mit etwas Umstellung können Sie die Klammern dort entfernen.!=
hat Vorrang weniger als%
so können Sie ein Paar von Eltern entfernen. Und Sie können>0
anstelle von `! = 0 verwenden, um ein Byte zu speichern.static int[] f(int n)
kann sichf=n=>
ein (rekursiv) Lambda durch die Verwendung und(n-1)*2
werden kann ,~-n*2
auf der Klammer zu speichern. Ich habe es auf 155 (137 + 18) Bytes reduziert: Probieren Sie es online aus . Die 18 Bytes sind fürusing System.Linq;
, weil die erforderlichen Importe für die Byteanzahl obligatorisch sind. Genieße deinen Aufenthalt!J , 25 Bytes
-5 Bytes dank FrownyFrog!
Probieren Sie es online!
J , 30 Bytes
Erläuterung:
i.,]
Erstellt Liste 0..n&.>
für jede Zahl in der Liste das Verb in (...) ausführen und das Ergebnis boxen[:( _1&^)
finde -1i
hoch (-1 oder 1)i:@*
Machen Sie eine Liste -n..n oder n ..- n, je nach dem Vorzeichen der oben genannten;@
Unbox>:@*:
finde n ^ 2 + 1}.
und nimm so viele Zahlen aus der ListeProbieren Sie es online!
quelle
n
Version zu schreiben ? zB*:{.;@([:(i:@*_1&^)&.>i.)
.. die spezifikation erlaubt das$
für den Cut-Off, keine Notwendigkeit,&.>
da*
Rang 0 ist.Python 2 ,
6556 BytesDas Ausgabeformat ist etwas hässlich. : /
Probieren Sie es online!
quelle
Java 8,
858379 Bytes-6 Bytes dank @ OlivierGrégoire .
Probieren Sie es online aus.
Erläuterung:
quelle
j
).i
einen Auf- statt Ab-Befehl ausgeführt, um einen überflüssigen zu entfernenn*n
.R ,
48 4642 BytesProbieren Sie es online!
Ein Port der Ruby-Antwort von Kirill L. - und dank des gleichen Kirill L. 6 Bytes gespart! Jetzt kürzer als Giuseppes Lösung ;)
Ein Port, den Luis Mendo für diese
approx
Oktavantwort verwendet, ist weniger golfen.n=n^2+1
kann ersetzt werden durch,,n^2+1
; oder by0:n^2+1
(Positionsargumentxout
) für die gleiche Byteanzahl:R , 56 Bytes
Probieren Sie es online!
quelle
approx
, hier wird ähnlich wie in Luis Mendos Octave-Lösung gearbeitet.diffinv
undapprox
aus dieser Frage ...~
funktioniert das nicht als Komplement-Operator :(), aber Sie können noch 2 Bytes sparen, indem Sie zu einem vollständigen Programm wechseln.APL (Dyalog Unicode) , 17 Byte
Probieren Sie es online!
Golf 2 Bytes dank @FrownyFrog durch die Umwandlung in einen Zug. Siehe die ältere Antwort und ihre Erklärung unten.
APL (Dyalog Unicode) , 19 Byte
Probieren Sie es online!
(Verwendet
⎕IO←0
)Mein erster Ansatz war, mehrere Bereiche zu konstruieren und diese zusammenzufügen. Das ging leicht über 30 Bytes. Dann begann ich die Sequenz zu analysieren
+\⍣¯1
bezeichnet die inverse kumulative SummeEs gibt ein sich wiederholendes Muster von 1s und 1s, wobei die Länge jeder aufeinanderfolgenden Sequenz von 1s oder 1s 1 + 2 × n ist. Und jede Untersequenz wechselt zwischen 1 und ¯1. Was ich jetzt tun kann, ist, die Liste 1s und 1s zu erstellen und dann mit + zu scannen
quelle
+\0,¯1*⍳(/⍨)1+2×⍳
ist 17Haskell , 47 Bytes
Probieren Sie es online!
quelle
Java (JDK 10) , 98 Byte
Probieren Sie es online!
quelle
MATL ,
1715 Bytes-2 Bytes dank Luis Mendo!
Probieren Sie es online!
Erklärung für
n=3
:quelle
Oktave ,
444241 Bytes2 Bytes entfernt dank @StewieGriffin und 1 Byte weiter entfernt dank @Giuseppe!
Probieren Sie es online!
quelle
Ruby ,
5247 BytesProbieren Sie es online!
Unten ist die ursprüngliche 52-Byte-Version mit einer Erklärung:
Probieren Sie es online!
Komplettlösung
quelle
map(&:-@)
Portion?-r
.Prolog (SWI) , 113 Bytes
Probieren Sie es online!
quelle
Python 3, 83 Bytes
quelle
Schale ,
1817 BytesProbieren Sie es online!
quelle
Holzkohle , 19 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Alternative Erklärung:
Schleife über die ganzen Zahlen von
0
bis einschließlich der Eingabe.Konvertieren Sie die Ergebnisse vor dem Drucken in eine Zeichenfolge.
Negieren Sie alternative Ergebnismengen.
Bilden Sie eine Liste vom vorherigen Index zum aktuellen Index, ohne den vorherigen Index.
quelle
Jelly ,
1112 BytesBah, ich dachte ich hätte 11 mit
_2+ỊrN)N;¥/
Probieren Sie es online!
Wie?
quelle
Stax , 10 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Scala, 119 Bytes
Ungolfed:
Dies kann wahrscheinlich viel besser golfen werden, aber ich wollte eine Lösung mit Lazy Streams.
quelle
APL (Dyalog Unicode) ,
3432 BytesProbieren Sie es online!
Benötigt
⎕IO←0
-2 Bytes dank @FrownyFrog
quelle
Gestapelt , 44 Bytes
Probieren Sie es online! Es ist schon eine Weile her, dass ich in Stacked programmiert habe, aber ich glaube, ich habe es immer noch.
Alternativen
73 Bytes:
[0\|>:2%tmo*2 infixes[:...|>\rev...|>rev#,$#'sortby 1#behead]flatmap 0\,]
Dies geht mit dem in meiner Attache-Antwort verwendeten Ansatz "Bereiche aus generierten Indizes" einher.Dies erwies sich als ziemlich lang, da Stacked weder für umgekehrte Bereiche noch für das Zusammenfallen geeignet ist. (Das ist was
:...|>\rev...|>rev#,$#'sortby 1#behead
tut.)53 Bytes:
[0\|>:2%tmo _\tpo#,tr[...rep]flatmap 0\,inits$summap]
... also habe ich mich für einen Ansatz entschieden, bei dem stattdessen die kumulative Summe (
inits$summap
) über den ungeraden ganzen Zahlen liegt1
und von diesen-1
wiederholt wird, wie in der R-Antwort .46 Bytes:
[~>0\:2%\#,2*1-tr[...rep]flatmap,inits$summap]
... aber ich erkannte, dass die negativen und die ungeraden Ganzzahlen in einem Zug gebildet werden konnten, indem beide generierten Arrays (die mod 2-Werte des Bereichs und des Bereichs selbst) multipliziert und
2
dann subtrahiert wurden1
. Dies ergibt abwechselnd1
s und-1
s für den ersten Bereich und die ungeraden ganzen Zahlen für den zweiten!44 Bytes:
[~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]
... und dann fiel mir ein, dass ich ein eingebautes Präfix für die Zuordnung hatte. ^ - ^
quelle
Julia 0,6 , 44 Bytes
Probieren Sie es online!
Da OP "das Ausgabeformat ist flexibel" erwähnt, wird ein Array von Sub-Arrays gedruckt, z. U (3) =>
[[0, 1], [0, -1, -2, -1], [0, 1, 2, 3]]
.i%2*2-1
entscheidet über das Vorzeichen des aktuellen Subarrays - negativ für gerade Zahlen, positiv für ungerade.[0:i;(n>i)*~-i:-1:1]
besteht aus zwei Teilen. 0: i ist einfach, der Wertebereich von 0 bis zum aktuellen i. Im nächsten Teil ist ~ -i: -1: 1 der absteigende Bereich von i-1 bis 1. Wir möchten dies jedoch nur anhängen, wenn wir noch nicht den endgültigen Wert erreicht haben. Multiplizieren Sie also das obere Ende des Bereichs durch (n> i), so dass, wenn n == i ist, der Bereich 0: -1: 1 ist, was leer endet (so stoppt das Array bei n korrekt).Und hier ist eine Version, die den wahlfreien Zugriff unterstützt - das innere Lambda gibt hier den i-ten Term der Sequenz zurück, ohne dass zuvor ein Term gespeichert werden muss. Dieser gibt die Ausgabe auch als einzelnes ordentliches Array aus.
4947 BytesProbieren Sie es online!
quelle