Eine Folge von ganzen Zahlen ist eine Ein-Folge, wenn der Unterschied zwischen zwei aufeinanderfolgenden Zahlen in dieser Folge -1 oder 1 ist und das erste Element 0 ist.
Genauer gesagt: a1, a2, ..., an ist eine Eins-Sequenz, wenn:
For any k (1 ≤ k < n): |a[k] - a[k+1]|=1,
a[1]=0
Eingang
n
- Anzahl der Elemente in der Sequenzs
- Summe der Elemente in der Sequenz
Ausgabe
- eine einreihige Menge / Liste / Array / etc von Länge
n
mit der Summe der Elementes
, wenn möglich - eine leere Menge / Liste / Array / etc, wenn nicht möglich
Beispiele
Als Eingabe 8 4
könnte Ausgabe [0 1 2 1 0 -1 0 1]
oder sein [0 -1 0 1 0 1 2 1]
. Es kann andere Möglichkeiten geben.
Bei der Eingabe 3 5
ist die Ausgabe leer []
, da dies nicht möglich ist.
Regeln
Dies ist ein Code Golf, die kürzeste Antwort in Bytes gewinnt. Einsendungen sollten ein Programm oder eine Funktion sein. Die Eingabe / Ausgabe kann auf eine der Standardarten erfolgen .
(l-1)*l/2
und-(l-1)*l/2
die gleiche Parität haben wie(l-1)*l/2
.Antworten:
CJam,
56 47 4434 BytesHier gibt es viel Raum für Verbesserungen, aber hier ist der erste Versuch:
Dank an Dennis für die effiziente Ausführung des
{ ... }%
Teils.Gibt, falls möglich, die Array-Darstellung aus
""
Probieren Sie es hier online aus
quelle
{}%
Teil Ihres Codes sieht nicht nach meinem aus (das ist nur @ PeterTaylors Code, der Punkte durch Unterstriche ersetzt). Wenn ich etwas zu Ihrem Code beigetragen habe, ist es der{}=
Operator ..._{_W=)+}%\{_W=(+}%+
zwei Kopien, addiere 1 zu der ersten und subtrahiere 1 von der anderen. Ihr Beispiel hat mich dazu gebracht, in einem{ ... }%
Block herauszufinden, wie das geht . In Bezug auf das{ ... }=
hatte ich es bereits in meinen Experimenten so weit reduziert, obwohl es noch nicht veröffentlicht wurde.3 5
die Ausgabe sein sollte[]
und nicht""
[]p
in CJam nur Ausgaben an""
. Die Sprache repräsentiert also leere Arrays.JavaScript (E6) 79
82Kein Bedarf an roher Gewalt oder Aufzählung aller Tupel.
Eine Folge der Länge n wird als n- 1-Schritte angesehen, wobei jeder Schritt inkrementiert oder dekrementiert wird.
Beachten Sie, dass Sie ein Inkrement nur gegen ein Dekrement tauschen können, die Summe variiert um 2, sodass die Summe für jede gegebene Länge immer gerade oder immer ungerade ist.
Mit allen Schritten ist die Sequenz 0, 1, 2, 3, ..., n-1 und wir wissen , ist die Summe (n-1) * n / 2
ändern Sie den letzten Schritt, die Summe Änderungen durch 2, so dass die Der letzte Schritt wiegt 2.
Wenn Sie den vorletzten Schritt ändern, ändert sich die Summe um 4, sodass der letzte Schritt 4 wiegt. Das liegt daran, dass der nachfolgende Schritt auf der bisherigen Teilsumme aufbaut.
Wenn Sie den vorherigen Schritt ändern, ändert sich die Summe um 6, sodass der letzte Schritt 6 wiegt (nicht 8, es sind keine Binärzahlen).
...
Ändern der ersten Stufe wiegt (n-1) * 2
Algorithmus
Ungolfed Code
Test In der Firefox / FireBug-Konsole
Ausgabe
quelle
GolfScript (
4139 Bytes)Online-Demo
Danke an Dennis für 41-> 39.
quelle
,0=
zu?
. Ein einfacher Port für CJam wäre 5 Bytes kürzer:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
{ ... }%
Block gesprochen. In meinem Code hatte ich zwei und versuchte, ihn auf 1 zu reduzieren. Wie es sich für einen echten Algorithmus gehört, haben Peter und ich fast zur gleichen Zeit den gleichen Algorithmus veröffentlicht.Mathematica, 73 Bytes
Einfache Brute-Force-Lösung.
Ich generiere alle möglichen Schritte. Dann wandle ich diese in akkumulierte Listen um, um die One-Sequences zu erhalten. Und dann suche ich den ersten, dessen Summe gleich dem zweiten Parameter ist. Ist dies nicht der Fall, lautet der Standardwert
{}
.quelle
Haskell, 56 Bytes
Erläuterung:
1,-1
und der Länge n-1:replicateM n-1[-1,1]
Beispiel:
replicateM 2 [-1,1]
==[[-1,-1],[-1,1],[1,-1],[1,1]]
scanl
hat eine schlechte Leistung, aber es macht den richtigen Job hier.n
in der sich die Summe befindets
quelle
Control.Monad
nur für die Verwendung,replicateM
die bereits zu lang ist. Mit welcher anderen monadischen Funktion können Sie simulierenreplicateM
?head$
Ihre Lösung ergänzen .head
nicht zurück[]
zu[] :: [[a]]
- und ich Fehler hassen.mapM(\x->[1,-1])[2..n]
anstelle vonsequence
und verwendenreplicate
.Python, 138
quelle
CJam,
655854 BytesKaum kürzer als meine Mathematica-Lösung, aber das ist hauptsächlich meine Schuld, dass ich CJam immer noch nicht richtig nutze:
Es ist buchstäblich der gleiche Algorithmus:
n-1
Holen Sie sich alle -tupel von{1, -1}
. Suchen Sie den ersten, dessen Akkumulation der gleiche ist wies
, stellen Sie a voran0
. Drucken Sie ein leeres Array, wenn keines gefunden wird.quelle
CJam, 40
Ein weiterer Ansatz in CJam.
quelle
Rubin (136)
quelle
J, 47 Zeichen
Überprüft jede Sequenz wie viele andere Antworten. Ich werde versuchen, eine kürzere O (n) -Lösung zu erstellen.
quelle
APL 38
Beispiel:
Dieses wie viele andere zwingt sich einfach durch jede Kombination, um ein passendes zu finden, wenn es nicht gefunden wird, gibt es nichts zurück. Tatsächlich werden einige Kombinationen mehrmals versucht, um den Code zu verkürzen.
quelle