Die Aufgabe bei dieser Herausforderung besteht darin, Elemente eines Arrays in Zeiträume zu verschieben. Die Eingabe besteht aus einem nicht abnehmenden Array positiver Ganzzahlen, die die Zeit der Ereignisse darstellen, und einer Ganzzahl, die die Größe jedes Bins darstellt. Beginnen wir mit einem Beispiel. Wir nennen das Input-Array A
und das Output-Array O
.
`A = [1,1,1,2,7,10]` and `bin_size = 2`.
`O = [4,0,0,1,1]`.
Warum ? Mit a bin_size = 2
haben wir die folgenden Intervalle: (0,2], (2,4], (4,6], (6,8], (8,10]
Wenn sich vier Elemente (1,1,1,2)
innerhalb des ersten Intervalls befinden (0,2]
, keines im zweiten und dritten Intervall, eines 7
im Intervall (6,8]
und eines 10
im Intervall (8,10]
.
Ihr Code sollte jedes Längenintervall berücksichtigen, bin_size
beginnend mit 0
und zählen, wie viele Zahlen A
in jedem enthalten sind. Sie sollten immer das rechte Ende eines Intervalls in eine Bin einbeziehen, damit im obigen Beispiel 2
die Anzahl von berücksichtigt wird 4
. Ihr Code sollte in linearer Zeit in der Summe der Längen der Eingabe und Ausgabe ausgeführt werden.
Mehr Beispiele:
`A = [1,2,7,12,15]` and `bin_size = 5`.
`O = [2, 1, 2]`.
`A = [1,2,7,12,15]` and `bin_size = 3`.
`O = [2,0,1,1,1]`.
Sie können davon ausgehen, dass die Ein- und Ausgabe in jedem Format erfolgen kann, das Sie für zweckmäßig halten. Sie können beliebige Sprachen und Bibliotheken verwenden.
0
s erlaubt? Also zurück[2,0,1,1,1,0]
statt[2,0,1,1,1]
?bin_size
ist? Sollten wir wirklich damit umgehen? Die meisten Antworten scheinen dies zu tun, aber in diesem Fall wäre es hilfreich, einen Testfall für dieses Szenario hinzuzufügen, um Verwirrung zu vermeiden.Antworten:
R , 48 Bytes
Probieren Sie es online!
Noch einmal,
table
undcut
versuchen Sie es mitfactor
dem Binning. Gibt einen Namen aus,vector
in demnames
die Intervalle angegeben sind, z. B. in Intervallnotation(0,5]
.BEARBEITEN: Zurück zur früheren Version, die funktioniert, wenn
s
nicht geteilt wirdn
.quelle
format you [most likely do not] find convenient
ohne dentable
Teil auszugeben .cut
teilt den Vektor in Faktoren auf, deren Pegel durch die Intervalle vorgegeben sind, undtable
zählt die Vorkommen jedes einzelnen Werts in seiner Eingabe.0:ceiling(max(n)/s)*s
mit denen Sie ersetzen könnenseq(0,max(n)+s-1,s)
. Es funktioniert zumindest für die beiden in Frage kommenden Stichproben.1:max(n/s+1)*s-s
ist eine weitere Verbesserung, da die beiden gleichwertig sindOktave , 36 Bytes
Probieren Sie es online!
Ostereier jagen und Lagerfeuer machen. Ich werde eine Erklärung hinzufügen, wenn ich Zeit habe.
quelle
Perl 5
-a
-i
,3228 BytesGeben Sie count nach der Option -i an. Geben Sie für jedes Eingabeelement in STDIN eine separate Zeile an
Probieren Sie es online!
quelle
Python 2 , 62 Bytes
Probieren Sie es online!
quelle
I[-1]/s+1
sollte~-I[-1]/s+1
statt.05AB1E , 18 Bytes
Probieren Sie es online!
quelle
A.count
max (A) zu nennen , so dass die Laufzeit in len (A) + len (O) nicht linear ist . Ist das richtig oder habe ich etwas falsch gemacht?O(max(A)*max(A))
... also ist es quadratisch auf dem Maximum von A ... OP angegeben, dass es linear sein muss in Bezug auf ... was genau?APL + WIN, 23 Bytes
Fordert zur Eingabe von Bins und dann von Ganzzahlen auf:
Erläuterung:
quelle
C ++ (GCC) ,
9083 BytesProbieren Sie es online!
quelle
Java 8, 75 Bytes
Port of @ DeadPossums Python 2-Antwort , also stimmen Sie seiner Antwort unbedingt zu!
Erläuterung:
Probieren Sie es online aus.
quelle
Ruby , 60 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 60 Byte / O (Länge (a) + Maximum (a) / n)
5 Bytes dank @Neil gespart
Übernimmt Eingaben in der Currying-Syntax
(a)(n)
.Probieren Sie es online!
Oder nur 43 Bytes / O (len (a)), wenn leere Elemente zulässig sind.
quelle
[...o].map(n=>n|0)
Ruft die erste Ausgabe der zweiten Lösung in weniger Bytes ab.Haskell ,
637570 BytesHoppla, dieser kürzere ist nicht linear, sondern quadratisch.
Probieren Sie es online!
quelle
Pyth,
2322 BytesProbieren Sie es hier aus
quelle
Rubin ,
5350 BytesEdit: -3 Bytes von iamnotmaynard.
Probieren Sie es online!
quelle
a.max
nicht ein Vielfaches vonb
(zBf[[1,1,1,2,7,10],3]
=>[4, 0, 1]
aber sollte geben[4, 0, 2]
) ist. Ich hatte den gleichen Ansatz versucht.[4, 0, 1, 1]
)Dieses Rätsel ist im Wesentlichen eine Zählsorte. Wir kennen die Länge der Ausgabe nicht, ohne zuerst die Eingabe durchzugehen.
C (clang) , 53 Bytes
Probieren Sie es online!
Diese Lösung akzeptiert die folgenden Parameter: Länge des
A
Eingabearraysl
von Ab
bin_sizeO
storage for Output. Muss ausreichend lang seinund gibt die Ausgabe in O zurück.
Diese Lösung hat ein Handicap: Sie gibt nicht die Länge des Ausgabearrays O zurück, sodass der Anrufer nicht weiß, wie viel gedruckt werden soll.
Folgende Version überwindet dieses Handicap:
C (clang) , 79 Bytes
Probieren Sie es online!
Es benötigt einen zusätzlichen Parameter
m
und gibt die Länge vonO
darin zurück. Es hat mich 26 Bytes gekostet.quelle
C (gcc) ,
102908986 BytesProbieren Sie es online!
Vielen Dank an Kevin Cruijssen für die Kürzung von 12 Bytes und Ceilingcat für weitere 4 Bytes!
quelle
int
und Ändern==1
zu>0
.O(n)
rechtzeitig ausgeführt werden, damit Sie keine verschachtelten for-Schleifen haben können. (Ihre C ++ - Antwort scheint jedoch in Ordnung zu sein. Ich habe diese also +1 gegeben. :))O(n)
by looping over the input items. Even if the inner loop would only loop 2 times it's already aboveO(n)
. Or am I misunderstanding something.. I must admitO
-times aren't really my expertise..