Die Gravitationskraft ist eine Kraft, die zwei beliebige Objekte mit Masse anzieht. In dieser Herausforderung werden unsere Objekte Zahlen sein und ihre Masse wird ihr Wert sein. Dabei geht es uns nicht um die Stärke der Kraft, sondern um die Richtung.
Stellen Sie sich diese Zahlenreihe vor
[1 6 9 4 6 9 7 6 4 4 9 8 7]
Jeder von ihnen schafft eine Kraft zwischen sich und seinen Nachbarn. Unter bestimmten Umständen wird dadurch eine andere Nummer angezogen (verschoben). Wenn die Zahl größer als die benachbarte ist, wird sie angezogen. Schauen wir uns unser vorheriges Beispiel an:
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Die Zahl 1
ist nicht groß genug, um sich zu bewegen 6
, aber die Zahl 6
ist usw. Grundsätzlich werden Zahlen zur größten benachbarten Zahl verschoben (auch größer als die Zahl selbst). Wenn beide benachbarten Zahlen gleich sind, wird es nicht angezogen. Es kommt auch vor, wenn die Zahl und die benachbarte Zahl gleich sind.
Dies soll nur die Attraktion zeigen, aber was passiert danach? Zahlen, die durch Anziehung kollidieren, sind zusammengefasst:
[20 32 28]
Die Herausforderung besteht also im Grunde darin, bei einer gegebenen Anzahl von Zahlen das Ergebnis der angezogenen Anzahl auszugeben.
Beispiel 1
Input => [10 15 20 10 20 10 10]
[10 → 15 → 20 10 20 ← 10 10]
Output => [45 10 30 10]
Beispiel 2
Input => [9 9 9 9 8 1 8]
[9 9 9 9 ← 8 1 8]
Output => [9 9 9 17 1 8]
Beispiel 3
Input => [1 6 9 4 6 9 7 6 4 4 9 8 7]
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Output => [20 32 28]
Beispiel 4
Input => [1 2 3 2 1]
[1 → 2 → 3 ← 2 ← 1]
Output => [9]
Beispiel 5
Input => [1]
Output => [1]
Beispiel 6
Input => [1 1]
Output => [1 1]
Beispiel 7
Input => [2 1 4]
Output => [2 5]
Anmerkungen
- Anziehung geschieht nur einmal
- Zahlen werden nicht von nicht benachbarten Zahlen angezogen
- Die Menge der Zahlen enthält nur positive ganze Zahlen
[1 3 5 4 2]
= 15 & le;G*M*m / r^2
ist für beide Körper gleich. Das leichtere bewegt sich mehr als das schwerere, nicht wegen mangelnder Anziehungskraft. Sagen Sie vielleicht "1 ist nicht groß genug, um 6 zu bewegen".Antworten:
JavaScript (ES6),
106 104100 Bytes2 Bytes dank @Shaggy gespart
Probieren Sie es online!
Kommentiert
Wir aktualisieren zuerst das ursprüngliche Eingabearray,0
a[]
indem wir eine Kopie davon iterieren. Während dieses Schritts werden alle von anderen 'angezogenen' Werte auf .Da das Array von links nach rechts analysiert wird, können wir einfach zu hinzufügen , wenn ein Wert von seinem rechten Nachbarn angezogen wird.ai ai+1
Beispiel: Aus wird und dann .4→5→6 [0,9,6] [0,0,15]
Wenn jedoch mehrere Werte in einer Reihe von ihrem linken Nachbarn angezogen werden, müssen wir zum ersten Attraktor dieser Sequenz (mit ) hinzufügen und nicht einfach .ai ak k<i ai−1
Beispiel: wird in und dann in .6←5←4 [11,0,4] [15,0,0]
Wir filtern dann alle Einträge gleich .0
quelle
[1,3,5,3,1,2,1]
und ausgegeben[14,2]
, aber es funktioniert tatsächlich richtig und wird ausgegeben[13,3]
.Stax ,
27252318 BytesFühren Sie es aus und debuggen Sie es
Die Ausgabe wird durch Zeilenumbrüche getrennt.
Dieses Programm bearbeitet benachbarte Paare im Array und bestimmt anhand dieser Prozedur, ob eine Aufteilung zwischen ihnen erfolgen soll.
Betrachten Sie eine willkürliche Eingabe
[... w x y z ...]
. Hier erfahren Sie, ob eine Aufteilung zwischenx
und erfolgen solly
.x == y
ja, dann ja.x > y
, dann iffz >= x
.y > x
, dann iffw >= y
.Die Summierung bleibt als Übung.
quelle
Retina 0.8.2 , 64 Bytes
Probieren Sie es online! Link enthält Testsuite. Erläuterung:
In Unary konvertieren.
Entfernen Sie die Trennzeichen zwischen den angezogenen Zahlen.
(?<=(1+))
wird\1
auf die Zahl vor dem Trennzeichen gesetzt. Nach dem Trennzeichen gibt es dann zwei Fälle:In diesen Fällen besteht eine Anziehungskraft zwischen den beiden Zahlen, und das Löschen des Trennzeichens führt dazu, dass die Zahlen kollidieren und sie addieren.
In Dezimalzahl konvertieren.
quelle
Jelly , 23 Bytes
Probieren Sie es online!
Ein monadischer Link, der eine Liste von Ganzzahlen als Argument verwendet und eine Liste von Ganzzahlen zurückgibt.
Erläuterung
Einige Inspirationen stammen aus der Stax-Antwort von @ recursive .
quelle
C (gcc) , 111 Bytes
Probieren Sie es online!
Nimmt ein nullterminiertes Array von Ganzzahlen.
Erläuterung
quelle
Python 2 , 162 Bytes
Probieren Sie es online!
quelle
J , 45 Bytes
Probieren Sie es online!
Inspiriert von der ursprünglichen Stax-Antwort von recursive
quelle
R ,
222196173 BytesHier ist eine Lösung mit etwas Hilfe von Robin Ryder
Probieren Sie es online!
Eine kurze Reihe von Kommentaren
quelle
sign(e)
statt(e>0)-(e<0)
{}
in der for-Schleife sind nicht erforderlich, da sich nur ein Befehl in der Schleife befindet.y
.m
es sich um einen Booleschen handeltPython,
114112 BytesDies nutzt die Tatsache, dass die Richtung des Pfeils eigentlich keine Rolle spielt und dass das Vorhandensein eines Pfeils zwischen a [i] und a [i + 1] durch Betrachten des Bereichs von vier Elementen bestimmt werden kann. 1: i + 3].
Edit: Danke an Jo King für die Regelklärung
quelle
Perl 5 ,
156147 BytesProbieren Sie es online!
quelle
K (ngn / k) , 46 Bytes
Probieren Sie es online!
0,x,0
Umgeben Sie das Argument mit 0s3'
Drillinge aufeinanderfolgender Gegenstände{
}'
für jeden tunx 2 0
Holen Sie sich das letzte und erste der aktuellen Drillinge -x[2]
undx[0]
. Sie sind die Nachbarn vonx[1]
, auf denen das Triplett zentriert istx<\:
Vergleichen Sie mit weniger als gegen jedes der aktuellen Tripletts+/
Summe. das Ergebnis ist ein Paar, dasx[2]
und entsprichtx[0]
2=
Überprüfen Sie, ob einer der Nachbarn größer ist als die beiden anderen Elemente von.x
Geben Sie ein Paar 0- oder 1-Boolescher Werte zurück-/
subtrahieren sie. Ein Ergebnis von -1 bedeutet, dassx[1]
es nach links gezogen wird, 1 nach rechts und 0 bedeutet, dass es an Ort und Stelle bleibt(!#x)+
Addiere 0 zu dem ersten Element, 1 zu dem zweiten usw. Dies berechnet die Indizes, zu denen Elemente angezogen werden{x x}/
Index mit sich selbst bis zur Konvergenz. das ergebnis sind die effektiven indizes, zu denen jeder artikel letztendlich hingezogen wirdx@.=
Gruppex
(das ursprüngliche Argument) von denen. Das Ergebnis ist eine Liste von Listen+/'
summiere jedenquelle
Clojure ,
299252 BytesProbieren Sie es online!
Erläuterung:
quelle
APL (Dyalog Classic) ,
5251 BytesProbieren Sie es online!
Übersetzung meiner Antwort
quelle
05AB1E , 21 Bytes
Probieren Sie es online!
quelle