In dieser einfachen Herausforderung erhalten Sie ein Eingabearray L
mit nicht negativen ganzen Zahlen und einer Anzahl von Bins, die b
größer als 0, aber nicht länger als 1 sind L
. Ihr Code muss ein neues Array zurückgeben, M
dessen Länge b
der Block des Arrays ist L
. Dies wird am einfachsten anhand von Beispielen erklärt.
L = [1,0,5,1]
und b = 2
kehrt zurück M = [1,6]
.
L = [0,3,7,2,5,1]
und b = 3
kehrt zurück M = [3,9,6]
.
So weit, so einfach. In dieser Frage b
muss man sich jedoch nicht unbedingt teilen len(L)
. In diesem Fall enthält der letzte Behälter nur weniger Zahlen, um ihn zu bilden.
Jeder Behälter, außer möglicherweise der letzte, muss die gleiche Anzahl von Zahlen aufweisen, die zur Gesamtsumme beitragen. Das letzte Fach darf nicht mehr Nummern enthalten als die anderen Fächer. Der letzte Behälter muss so viele Zahlen wie möglich enthalten, abhängig von den anderen Regeln.
L = [0,3,7,2,5,1]
und b = 4
kehrt zurück M = [3,9,6,0]
. M = [10,8,0,0]
ist keine akzeptable Ausgabe, da der Name der dritten Bin nicht die Anzahl der als Bins 1
und beitragenden Nummern enthält 2
.
L = [0,3,7,2,5]
und b = 2
kehrt zurück M = [10,7]
. M = [3, 14]
ist keine akzeptable Ausgabe, da der letzte Bin 3
Elemente enthält, die dazu beitragen, der erste jedoch nur 2
.
L = [1,1,1,1,1,1,1]
und b = 3
kehrt zurück M = [3,3,1]
.
Als letzte Regel muss Ihr Code in linearer Zeit ausgeführt werden.
Sie können eine beliebige Sprache oder Bibliothek verwenden und davon ausgehen, dass die Eingabe auf eine von Ihnen gewünschte Weise erfolgt.
Es stellt sich heraus, dass es einige Eingaben gibt, die nicht gelöst werden können. Zum Beispiel [1,1,1,1,1]
und b=4
. Ihr Code kann für diese Eingaben alles ausgeben, was er möchte.
your code must run in linear time
- Ich würde jeden Algorithmus finden, der diesem natürlich nicht ganz komisch folgtAntworten:
APL (Dyalog) , 19 Bytes
Probieren Sie es online!
Wir hängen b Nullen an das Array an, bevor wir es in gleiche Teile von
⌈⍺÷⍨≢⍵
( ⌈ Länge von L ÷ b ⌉ ) umformen und sie summieren, wie in gezeigt,⍺⍴0
, da jede Menge von leeren Punkten (die nicht Teil des ursprünglichen Arrays sind) größer als b ist - 1 würde mit mindestens b - 1 Elementen aus anderen Chunks gefüllt , was den Gleichgewichtspunkt der letzten Gruppe auf maximal b - 1 vom Rest unterscheidet. Wir gebrauchen b> b - 1, weil es Codegolf ist.Zum Beispiel würde L mit 15 Elementen und b = 3 nicht als gruppiert werden
sondern als (beachten Sie, wie die am weitesten rechts stehenden 2
x
s die am weitesten links stehenden Nullen "ausfüllt")während ein 16- Elemente-Array mit 2 ( 3 - 1 ) leeren Stellen wie gefüllt wäre
quelle
Python 2 , 65 Bytes
Probieren Sie es online!
quelle
R ,
75717063 BytesProbieren Sie es online!
Diese Pads
L
mitNA
bis die Länge ein Vielfaches von istb
, nehmen dann die SpaltensummenL
als Matrix mitb
Spalten und entfernenNA
Werte.Erklärung als stapelbasierte Sprache:
quelle
function(L,b)colSums(matrix("length<-"(L,ceiling(length(L)/b)*b),,b),T)
no bytes saved for less readability
ist wahrscheinlich das Motto von R Golfing ... obwohl ich nehme an, dasssum(L|1)
ein Byte davon gespeichert istlength(L)
!MATL , 6 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Betrachten Sie Eingabe
4
,[0,3,7,2,5,1]
als Beispiel.quelle
Ruby ,
5453 BytesEin Byte dank @Kirill L. gespeichert
Probieren Sie es online!
quelle
[0]*b
durch1..b
C (gcc) , 107 Bytes
Probieren Sie es online!
quelle
Haskell , 61 Bytes
Probieren Sie es online!
quelle
[1, 2, 3, 4, 5, 6] # 3
.Java 10,
968986 BytesProbieren Sie es hier online aus .
Einen kürzeren Weg zum Schreiben
i/(n/b+(n%b==0?0:1)
hier gefunden:i/((n+b-1)/b)
Dank an Olivier Grégoire für das Golfen mit 3 Bytes.
Ungolfed-Version:
quelle
Elixier , 98 Bytes
Probieren Sie es online!
Das beste Elixier ist das Teilen in Teile mit einer Länge von n . Und es kann keine Ceil Division als Integer geben, also runden wir die Division auf. Leider führt die einzige Möglichkeit, dies zu tun, zu einem Float, sodass wir es erneut auf eine Ganzzahl runden.
quelle
Perl 6 ,
52 5150 Bytes52 Bytes: Testen Sie es
51 Bytes: Testen Sie es
50 Bytes: Probieren Sie es aus
47 Bytes nicht konkurrierend Testen Sie es
Es ist nicht konkurrierend, da
».sum
es erlaubt ist, die Berechnungen parallel durchzuführen. Es kann also in linearer Zeit sein oder nicht.Erweitert:
quelle
Holzkohle , 22 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Eingabe
b
.Eingabe
L
.Drücken Sie a
0
bis,L
bisL
die Länge durch teilbar istb
.Teilen Sie
L
die Länge durchb
und teilen Sie sieL
in Abschnitte dieser Länge auf, addieren Sie dann die einzelnen Abschnitte und setzen Sie sie für die implizite Ausgabe in separaten Zeilen in einen String um.quelle
JavaScript (Node.js) , 71 Byte
Probieren Sie es online!
quelle
C (clang) , 58 Bytes
Probieren Sie es online!
f()
Nimmt folgende Parameter an::L
Zeiger auf Eingabearrayl
: Länge des Eingabearraysb
: Anzahl der Binsm
: Zeiger auf Puffer, der ein neues Array empfängtEs folgt eine wiedereintretende Version mit 60 Bytes:
quelle
PHP, 88 Bytes
anonyme Funktion, nimmt Array und Integer, gibt Array zurück
Das einzige Golf Potenzial dies hatte ersetzt
ceil(count($a)/$b))
mit(count($a)-1)/$b+1
und Abkürzen(count($a)-1)
mit~-count($a)
. Der resultierende Gleitkommawert wird imarray_chunk
Aufruf implizit in eine Ganzzahl umgewandelt .Probieren Sie es online aus .
quelle