Inverse Deltas eines Arrays
Ihre Aufgabe ist es, ein Array von 32-Bit-Ganzzahlen mit Vorzeichen zu erhalten und es mit seinen inversen Deltas neu zu kompilieren. Zum Beispiel die Liste
1 3 4 2 8
hält die Deltas:
2 1 -2 6
die dann negiert werden und ergeben:
-2 -1 2 -6
und neu kompiliert, was ergibt:
1 -1 -2 0 -6
als Endergebnis.
Input-Output
Sie erhalten eine Liste / array / table / tuple / stack / etc. von vorzeichenbehafteten ganzen Zahlen als Eingabe über eine beliebige Standardeingabemethode.
Sie müssen die geänderten Daten erneut in einer akzeptablen Form ausgeben, indem Sie der obigen Delta-Inversionsmethode folgen.
Sie erhalten N Eingänge, bei 0 < N < 10
denen jede Zahl in den Bereich fällt-1000 < X < 1000
Testfälle
5 6 7 8 -> 5 4 3 2
1 3 4 2 8 -> 1 -1 -2 0 -6
32 18 25 192 199 -> 32 46 39 -128 -135
Anmerkungen
- Sie sind nicht auf die Delta-basierte Methode beschränkt: Wenn Sie die einfachere Methode (die nicht zu schwer sein sollte) herausfinden können , können Sie sie verwenden.
- Wie oben angegeben, erhalten Sie immer mindestens 1 Eingang und nicht mehr als 9.
- Die erste Nummer der Ausgabe muss immer die erste Nummer der Eingabe sein. Ist dies nicht der Fall, ist Ihre Methode falsch.
- Es wird nur die Standardeingabe Ausgabe akzeptiert
- Es gelten Standardlücken
- Das ist Code-Golf , also gewinnt die niedrigste Byte-Anzahl!
- Habe Spaß!
Wir haben einen Sieger.
Dennis 's Jelly Answer bei einem Tiny 3 Bytes hat das Gold mit nach Hause genommen, da ich den Eindruck habe, dass es nicht zu schlagen ist.
Ich war ein wenig enttäuscht, dass ich keine Antwort auf die ursprüngliche Spezifikation erhalten habe, aber ich kann später genau das belohnen.
Antworten:
Gelee ,
73 BytesProbieren Sie es online!
Hintergrund
Die Deltas von (a, b, c, d) sind b - a , c - b und d - c . Die kumulative Reduktion von (a, b - a, c - b, d - c) durch Subtraktion ergibt a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c und 2a - c - (d - c) = 2a - d , also ist das korrekte Ergebnis (2a - a, 2a - b, 2a - c, 2a - d) .
Wie es funktioniert
quelle
Python 2, 30 Bytes
Teste es auf Ideone .
Wie es funktioniert
Die Deltas von (a, b, c, d) sind b - a , c - b und d - c . Die kumulative Reduktion von (a, b - a, c - b, d - c) durch Subtraktion ergibt a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c und 2a - c - (d - c) = 2a - d , also ist das korrekte Ergebnis (2a - a, 2a - b, 2a - c, 2a - d) .
quelle
Mathematica, 8 Bytes
Unbenannte Funktion mit einer unbestimmten Anzahl von Argumenten. Dies geschieht auf "einfache" Weise: Negiert die gesamte Liste und fügt das doppelte (ursprüngliche) erste Element hinzu.
Genannt zum Beispiel wie
2#-{##}&[1,3,4,2,8]
; liefert eine Liste wie{1,-1,-2,0,-6}
.quelle
JavaScript (ES6), 21
Danke @Dennis
quelle
05AB1E , 4 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
Python, 44 Bytes
Dies verwendet die "Einfachere Methode".
quelle
Pyth, 5 Bytes
Online-Dolmetscher!
quelle
R,
231817 Bytesautomatische Vektorisierung und Standarddruck zur Rettung!
quelle
2*x[1]-x
stattdessen?Ruby, 23 Bytes
Nicht besonders originell.
quelle
Perl 6 ,
4016 BytesErweitert:
quelle
Brain-Flak , 76 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Haskell,
20 bis19 BytesGleiche Lösung wie Dennis, danke für deine Idee von
2a - x
.Dank Christian Severs ein Byte gespart.
quelle
f(x:r)=x:map(2*x-)r
x
vorne mitzumachen .Pyke,
54 BytesProbieren Sie es hier aus!
quelle
PHP, 48 Bytes
Mit der Technik von Dennis. Verwenden Sie wie:
Nicht-Dennis 55-Byte-Version:
quelle
a&
anstelle von''<
und zwei Bytes mit_
anstelle von' '
.APL, 8 Bytes
Erläuterung:
Testfälle:
quelle
Labyrinth , 34 Bytes
Probieren Sie es online!
Verwendet @Dennis 's
(2a - a, 2a - b, 2a - c, 2a - d)
Ansatz.Die gelben Kacheln sind für den Kontrollfluss. In dieser 2D-Programmiersprache beginnt das Programm mit der obersten linken Kachel, die sich nach Osten bewegt, um zu beginnen. An Kreuzungen wird die Richtung durch das Vorzeichen der Oberseite des Hauptstapels bestimmt. Leere Fliesen sind Wände.
Grün
Dieser Abschnitt speichert 2a auf dem Hilfsstapel.
?
Holen Sie sich die erste Zahl und schieben Sie sie an die Spitze des Hauptstapels:
Duplizieren Sie die Oberseite des Stapels_2
Schieben Sie zwei nach oben auf den Stapel*
Popy
, Popx
, Pushx*y
}
Bewegen Sie die Oberseite des Hauptstapels an die Oberseite des Hilfsstapels._
Schieben Sie die Null auf den StapelOrange
Dieser Abschnitt subtrahiert 2a von der aktuellen Zahl, negiert das Ergebnis, gibt das Ergebnis aus, erhält das nächste Zeichen (den Begrenzer), beendet, wenn EOF, gibt eine neue Zeile aus, erhält die nächste Zahl.
"
Noop. Wenn Sie von Norden kommen, ist die Spitze des Stapels Null und das Programm wird nach Süden fortgesetzt. Wenn Sie von Westen kommen, ist der obere Teil des Stapels einer und das Programm dreht sich nach rechts (weiter nach Süden).;
Werfen Sie die Oberseite des Stapels weg. Da die Null oder Eins nur für den Kontrollfluss verwendet wird, müssen diese verworfen werden{
Bewegen Sie die Oberseite des Zusatzstapels (2a) zur Oberseite des Hauptstapels:
Duplizieren Sie die Oberseite des Hauptstapels}
Bewegen Sie die Oberseite des Hauptstapels an die Oberseite des Hilfsstapels-
Popy
, Popx
, Pushx-y
\`` Negate the top of the stack. This and the previous three operations have the effect of
- (x-2a) = 2a-x`!
Legen Sie den oberen Rand des Stapels ab und geben Sie ihn als Zahl aus,
Drücken Sie das nächste Zeichen (das das Trennzeichen sein wird) oder das negative Zeichen, wenn EOF)
Erhöhen Sie die Oberseite des Stapels. Wenn das letzte Zeichen EOF ist, ist die Oberseite des Stapels jetzt Null, und das Programm fährt direkt mit dem@
Befehl und dem Beenden fort. Wenn das letzte Zeichen ein Delimeter war, ist die Oberseite des Stapels positiv und das Programm biegt nach rechts ab und fährt nach Osten zum fort\
\
Geben Sie eine neue Zeile aus?
Holen Sie sich die nächste Nummer_1
Schieben Sie eine nach oben, um an der Kreuzung nach rechts abzubiegenquelle
Labyrinth , 24 Bytes
Eingabe- und Ausgabeformat sind Zeilenvorschub-getrennte Listen (obwohl das Eingabeformat tatsächlich viel flexibler ist). Das Programm bricht mit einem Fehler ab.
Probieren Sie es online!
Bei dieser Byteanzahl gibt es zwei andere Lösungen, die im Grunde gleich funktionieren, aber einen etwas anderen Steuerungsfluss verwenden.
Erläuterung
Der Anweisungszeiger (IP) bewegt sich in der ersten Zeile nach Osten, aber alle Befehle vor dem
?
sind grundsätzlich keine Befehle für den globalen Status, da wir nirgendwo Befehle für die Stapeltiefe verwenden. Der Code beginnt also wirklich?
in westlicher Richtung, da sich die IP dreht, wenn sie die Sackgasse erreicht.Der Code beginnt daher mit dem folgenden linearen Codebit:
Dies setzt uns einfach mit einer Kopie von ein
2a
, um die[2a - a, 2a - b, 2a - c, ...]
Formel zu verwenden.Wir betreten nun die Hauptschleife des Programms und verwenden einen ziemlich üblichen Trick, um eine einzelne Codezeile zu durchlaufen:
Beachten Sie, dass der Stapel leer ist, wenn wir die Taste drücken,
<
damit wir wissen, dass wir dort Nullen erhalten. Der<
dreht dann die gesamte Zeile nach links und nimmt die IP mit, so dass wir folgendes erhalten:Die IP muss sich dann nach links bewegen, wo die
>
Linie wieder an ihren ursprünglichen Platz verschoben wird (um sie für die nächste Iteration vorzubereiten). Dann wird die Zeile einfach von rechts nach links ausgeführt, sodass eine einzelne Schleifeniteration wie folgt lautet:Der Haken bei der Arbeit mit einer Schleife dieses Typs ist, dass Sie mit keiner Form der bedingten Ausführung arbeiten können, da Labyrinth keine Möglichkeit hat, Code zu überspringen. Deshalb beenden wir das Programm mit einer Division durch Null, wenn wir EOF drücken. Hier ist eine Aufschlüsselung jeder Schleifeniteration.
quelle
C ++ 14, 36 Bytes
Als unbenanntes Lambda, das seine Eingabe ändert:
Mit der Technik von Dennis. Funktioniert für jeden Container wie
int[]
odervector<int>
.Verwendung:
quelle
CJam, 16 Bytes
Eingabeformat:
[1 2 3 4]
. Verwendet die einfache Formel.Erläuterung:
Entschuldigung für den fehlenden Testlink. Ich denke, SE mag es nicht, wenn es Links mit Klammern enthält.
quelle
Aufdringlich , 9 Bytes
Geben Sie Argumente als durch Komma getrennt Werte auf cmd line:
$ pushy invdeltas.pshy 1,3,4,2,8
. Hier ist die Aufschlüsselung mit Beispielstapel:Hinweis: Dies können 8 Byte sein, wenn die Rückwärtsausgabe zulässig ist:
@&2*K~-_
quelle
Perl, 26 + 3 (
-pla
Flag) = 29 Bytesoder
Verwenden von:
quelle
Dyalog APL , 5 Bytes
-+2×⊃
Dies ist ein 5-Zug, der wie zwei verschachtelte 3-Züge ("Gabeln") analysiert wird:
-+(2×⊃)
liest sich wie folgt: die Negation (
-
) des gesamten Arrays plus (+
) zweimal (2×
) das erste Element (⊃
)quelle
ised, 11 Bytes
Aufruf:
ised --l 'file with input.txt' '2*$1_0-$1
(edit: korrigiert durch Diebstahl der Algebra von Dennis)
quelle
Wunder , 17 Bytes
Ich bin mir nicht sicher, warum ich das nicht früher gepostet habe. Verwendung:
Besser lesbar:
quelle