La tâche dans ce défi est de mettre des éléments d'un tableau dans des bacs de temps. L'entrée sera un tableau non décroissant d'entiers positifs représentant l'heure des événements, et un entier qui représente la taille de chaque bac. Commençons par un exemple. Nous appelons le tableau d'entrée A
et le tableau de sortie O
.
`A = [1,1,1,2,7,10]` and `bin_size = 2`.
`O = [4,0,0,1,1]`.
Pourquoi ? Avec a bin_size = 2
, nous aurons les intervalles suivants:, (0,2], (2,4], (4,6], (6,8], (8,10]
où quatre éléments se (1,1,1,2)
trouvent dans le premier intervalle (0,2]
, aucun dans les deuxième et troisième intervalles, un 7
dans l'intervalle (6,8]
et un 10
dans l'intervalle (8,10]
.
Votre code doit tenir compte de chaque intervalle de longueur à bin_size
partir de 0
et compter le nombre de numéros A
qu'il contient. Vous devez toujours inclure la fin droite d'un intervalle dans un bac de sorte que dans l'exemple ci 2
- dessus est inclus dans le nombre de 4
. Votre code doit s'exécuter en temps linéaire dans la somme des longueurs de l'entrée et de la sortie.
Plus d'exemples:
`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]`.
Vous pouvez supposer que l'entrée et la sortie peuvent être données dans n'importe quel format qui vous convient. Vous pouvez utiliser toutes les langues et bibliothèques de votre choix.
0
s de fin sont-elles autorisées? Vous revenez donc[2,0,1,1,1,0]
au lieu de[2,0,1,1,1]
?bin_size
, devrions-nous vraiment les gérer? Il semble que la plupart des réponses le soient, mais si c'est le cas, il serait bon d'ajouter un cas de test pour ce scénario pour éviter toute confusion.Réponses:
R , 48 octets
Essayez-le en ligne!
Encore une fois,
table
et faitescut
unfactor
tour pour le binning. Les sorties d' un nommévector
oùnames
sont les intervalles, dans la notation des intervalles, par exemple,(0,5]
.EDIT: revenir à la version précédente qui fonctionne quand
s
ne se divise pasn
.la source
format you [most likely do not] find convenient
sans latable
partie.cut
divise le vecteur en facteurs avec des niveaux donnés par les intervalles ettable
compte les occurrences de chaque valeur unique dans son entrée.0:ceiling(max(n)/s)*s
avecseq(0,max(n)+s-1,s)
. Cela fonctionne au moins pour les deux échantillons de la question.1:max(n/s+1)*s-s
est une autre amélioration puisque les deux sont équivalentsOctave , 36 octets
Essayez-le en ligne!
À la chasse aux œufs de Pâques et à faire un feu de joie. J'ajouterai une explication quand j'aurai le temps.
la source
Perl 5
-a
-i
,3228 octetsDonnez le nombre après l'option -i. Donnez chaque élément d'entrée sur une ligne distincte sur STDIN
Essayez-le en ligne!
la source
Python 2 , 62 octets
Essayez-le en ligne!
la source
I[-1]/s+1
devrait donc être à la~-I[-1]/s+1
place.05AB1E , 18 octets
Essayez-le en ligne!
la source
A.count
max (A) , donc le temps d'exécution n'est pas linéaire en len (A) + len (O) . Est-ce correct ou ai-je eu quelque chose de mal?O(max(A)*max(A))
... donc c'est quadratique sur le maximum de A ... OP a précisé qu'il devait être linéaire en termes de ... quoi exactement?APL + WIN, 23 octets
Invite à saisir à l'écran les cases puis le vecteur d'entiers:
Explication:
la source
C ++ (gcc) ,
9083 octetsEssayez-le en ligne!
la source
Java 8, 75 octets
Port de @ DeadPossum's Python 2 answer , alors assurez-vous de voter pour sa réponse!
Explication:
Essayez-le en ligne.
la source
Rubis , 60 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 60 octets / O (len (a) + max (a) / n)
5 octets enregistrés grâce à @Neil
Prend des entrées dans la syntaxe de curry
(a)(n)
.Essayez-le en ligne!
Ou seulement 43 octets / O (len (a)) si les éléments vides sont autorisés.
la source
[...o].map(n=>n|0)
obtient la première sortie de la deuxième solution en moins d'octets.Haskell ,
637570 octetsOups, celui-ci n'est pas linéaire mais quadratique;
Essayez-le en ligne!
la source
Pyth,
2322 octetsEssayez-le ici
la source
Rubis ,
5350 octetsEdit: -3 octets par iamnotmaynard.
Essayez-le en ligne!
la source
a.max
n'est pas un multiple deb
(par exemplef[[1,1,1,2,7,10],3]
=>[4, 0, 1]
mais devrait donner[4, 0, 2]
). J'avais essayé la même approche.[4, 0, 1, 1]
)Ce casse-tête est essentiellement un tri par compte. Nous ne connaissons pas la longueur de la sortie sans passer d'abord par l'entrée.
C (clang) , 53 octets
Essayez-le en ligne!
Cette solution prend les paramètres suivants: longueur du
A
tableau d'entréel
d'un stockageb
bin_sizeO
pour la sortie. Doit être de longueur suffisanteet renvoie la sortie en O.
Cette solution a un handicap: elle ne retourne pas la longueur du tableau de sortie O, et donc l'appelant ne sait pas combien imprimer.
La version suivante surmonte ce handicap:
C (clang) , 79 octets
Essayez-le en ligne!
Il prend un paramètre supplémentaire
m
et en renvoie la longueurO
. Cela m'a coûté 26 octets.la source
C (gcc) ,
102908986 octetsEssayez-le en ligne!
Merci à Kevin Cruijssen pour avoir réduit de 12 octets et plafondcat pour 4 autres octets!
la source
int
et en changeant==1
en>0
.O(n)
temps, donc vous ne pouvez pas avoir de boucles for imbriquées .. (Cependant, votre réponse C ++ sembleO(n)
en bouclant sur les éléments d'entrée. Même si la boucle intérieure ne boucle que 2 fois, c'est déjà au-dessusO(n)
. Ou suis-je enO
train de mal comprendre quelque chose .. Je dois admettre que les temps ne sont pas vraiment mon expertise ..