Écrivez une fonction qui, lorsqu'elle reçoit un tampon b
(1 - 104857600 octets) et un certain nombre de bits n
(1 <= n <= 64), divise le tampon en morceaux de n
bits. Remplissez le dernier bloc avec 0
s jusqu'à n
bits.
par exemple
Étant donné le tampon b = "f0oBaR"
ou de manière équivalente [102,48,111,66,97,82]
et n = 5
, retour
[12, 24, 24, 6, 30, 16, 19, 1, 10, 8]
En effet, le tampon ci-dessus, lorsqu'il est représenté sous forme binaire, ressemble à:
01100110 00110000 01101111 01000010 01100001 01010010
Et une fois regroupé en 5s ressemble à:
01100 11000 11000 00110 11110 10000 10011 00001 01010 010[00]
Ce qui, une fois reconverti en décimal, donne la réponse.
Remarques
- Vous pouvez utiliser le type de données le plus logique dans votre langue pour représenter le tampon. En PHP, vous utiliseriez probablement une chaîne, dans Node, vous voudrez peut-être utiliser un tampon
- Si vous utilisez une chaîne pour représenter le tampon, supposez que c'est ASCII pour la conversion char -> int
- Vous pouvez utiliser un tableau d'ints (0-255) pour l'entrée si vous préférez
- La valeur de retour doit être un tableau ou une liste d'entiers
Cas de test
> b = "Hello World", n = 50
318401791769729, 412278856237056
> b = [1,2,3,4,5], n = 1
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1
> b = "codegolf", n = 32
1668244581, 1735355494
> b = "codegolf" n = 64
7165055918859578470
> b = "codegolf" n = 7
49, 91, 108, 70, 43, 29, 94, 108, 51, 0
> b = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel est eu velit lacinia iaculis. Nulla facilisi. Mauris vitae elit sapien. Nullam odio nulla, laoreet at lorem eu, elementum ultricies libero. Praesent orci elit, sodales consectetur magna eget, pulvinar eleifend mi. Ut euismod leo ut tortor ultrices blandit. Praesent dapibus tincidunt velit vitae viverra. Nam posuere dui quis ipsum iaculis, quis tristique nisl tincidunt. Aliquam ac ligula a diam congue tempus sit amet quis nisl. Nam lacinia ante vitae leo efficitur, eu tincidunt metus condimentum. Cras euismod quis quam vitae imperdiet. Ut at est turpis.", n = 16
19567, 29285, 27936, 26992, 29557, 27936, 25711, 27759, 29216, 29545, 29728, 24941, 25972, 11296, 25455, 28275, 25955, 29797, 29813, 29216, 24932, 26992, 26995, 25449, 28263, 8293, 27753, 29742, 8272, 25964, 27749, 28276, 25971, 29045, 25888, 30309, 27680, 25971, 29728, 25973, 8310, 25964, 26996, 8300, 24931, 26990, 26977, 8297, 24931, 30060, 26995, 11808, 20085, 27756, 24864, 26209, 25449, 27753, 29545, 11808, 19809, 30066, 26995, 8310, 26996, 24933, 8293, 27753, 29728, 29537, 28777, 25966, 11808, 20085, 27756, 24941, 8303, 25705, 28448, 28277, 27756, 24876, 8300, 24943, 29285, 25972, 8289, 29728, 27759, 29285, 27936, 25973, 11296, 25964, 25965, 25966, 29813, 27936, 30060, 29810, 26979, 26981, 29472, 27753, 25189, 29295, 11808, 20594, 24933, 29541, 28276, 8303, 29283, 26912, 25964, 26996, 11296, 29551, 25697, 27749, 29472, 25455, 28275, 25955, 29797, 29813, 29216, 28001, 26478, 24864, 25959, 25972, 11296, 28789, 27766, 26990, 24946, 8293, 27749, 26982, 25966, 25632, 28009, 11808, 21876, 8293, 30057, 29549, 28516, 8300, 25967, 8309, 29728, 29807, 29300, 28530, 8309, 27764, 29289, 25445, 29472, 25196, 24942, 25705, 29742, 8272, 29281, 25971, 25966, 29728, 25697, 28777, 25205, 29472, 29801, 28259, 26980, 30062, 29728, 30309, 27753, 29728, 30313, 29793, 25888, 30313, 30309, 29298, 24878, 8270, 24941, 8304, 28531, 30053, 29285, 8292, 30057, 8305, 30057, 29472, 26992, 29557, 27936, 26977, 25461, 27753, 29484, 8305, 30057, 29472, 29810, 26995, 29801, 29045, 25888, 28265, 29548, 8308, 26990, 25449, 25717, 28276, 11808, 16748, 26993, 30049, 27936, 24931, 8300, 26983, 30060, 24864, 24864, 25705, 24941, 8291, 28526, 26485, 25888, 29797, 28016, 30067, 8307, 26996, 8289, 28005, 29728, 29045, 26995, 8302, 26995, 27694, 8270, 24941, 8300, 24931, 26990, 26977, 8289, 28276, 25888, 30313, 29793, 25888, 27749, 28448, 25958, 26217, 25449, 29813, 29228, 8293, 29984, 29801, 28259, 26980, 30062, 29728, 28005, 29813, 29472, 25455, 28260, 26989, 25966, 29813, 27950, 8259, 29281, 29472, 25973, 26995, 28015, 25632, 29045, 26995, 8305, 30049, 27936, 30313, 29793, 25888, 26989, 28773, 29284, 26981, 29742, 8277, 29728, 24948, 8293, 29556, 8308, 30066, 28777, 29486
> b = [2,31,73,127,179,233], n = 8
2, 31, 73, 127, 179, 233
n
supérieures à 8? Si oui, qu'en est-il des valeursn
supérieures à 64, ce qui est supérieur à la précision entière de la plupart des langues.char
est un entier de 1 octet de long.Réponses:
Pyth,
1817 octetsMerci à @lirtosiast pour un octet!
la source
Gelée, 13 octets
Cela prend l'entrée comme une liste d'entiers. Essayez-le en ligne!
Comment ça marche
la source
Julia, 117 octets
Il s'agit d'une fonction qui accepte un tableau entier et un entier et renvoie un tableau entier. C'est un exercice d'abus d'argument de fonction.
Non golfé:
la source
JavaScript (ES6), 120 octets
Twiddling binaire récursif sur des tableaux entiers. Non golfé:
la source
"(s,n)=>(s.replace(/./g,x=>(256+x.charCodeAt()).toString(2).slice(1))+'0'.repeat(n-1)).match(eval(`/.{${n}}/g`)).map(x=>+`0b${x}`)".length
Python 3, 102 octets
utiliser l' astuce pour regrouper la chaîne
s
: la chaîne / tampon d'entréen
: le nombre de bits dans chaque bloc diviséRésultats
la source
n
a le même sens que la question:splits the buffer into chunks of n bits
Rubis, 114 octets
Légèrement plus propre:
la source
Perl 6,
9368 octetsla source
PHP,
262217189 octets(mis à jour avec des conseils d' Ismael Miguel )
Formaté pour la lisibilité:
Exemple:
la source
str_pad($s,8,'0',STR_PAD_LEFT)
, vous pouvez utiliserstr_pad($s,8,0,0)
. Vous pouvez supprimer les guillemetsbindec
etdecbin
enregistrer 4 octets. Pour économiser davantage, vous pouvez stockerarray_map
dans une variable et la transmettre à la place. Et voilà:function f($b,$n){$M=array_map;return$M(bindec,$M(function($x)use($n){return str_pad($x,$n,0);},str_split($M('',array_map(function($s){return str_pad($s,8,0,0);},$M(decbin,$b))),5)));}
(184 octets).implode
avec$M
aussi bien.CJam, 30 octets
Essayez-le en ligne!
Il s'agit d'un bloc sans nom qui attend le tampon int et la quantité de morceaux sur la pile et laisse le résultat sur la pile.
A décidé d'essayer CJam. Cela ne m'a pris que 2 heures pour le faire ^^ C'est probablement trop long, les suggestions sont les bienvenues!
Explication
la source
2b8T
plutôt que2b8 0
d'enregistrer un octet (la variableT
est pré-initialisée à0
) 2. La suppression du dernier bloc peut être effectuée avecW<
(la variableW
est initialisée à-1
) ou);
(retirer le dernier élément et le supprimer).JavaScript (ES6) 104
Petit à petit tripotage itératif,
Modifier 5 octets de sauvegarde thx @Neil
Moins golfé
Tester
la source
x
chaque fois, pourquoi ne pas décaler lesx
bonsi
bits?c-g?[...s,t<<c]:s
pourrait vous faire économiser quelques octets de plus.J, 24 octets
Il s'agit d'une fonction anonyme, qui prend
n
comme argument de gauche et desb
nombres comme argument de droite.Tester:
Explication:
la source
Haskell,
112109 octetsExemple d'utilisation:
5 # [102,48,111,66,97,82]
->[12,24,24,6,30,16,19,1,10,8]
.Comment ça marche
la source
Java,
313306322 octetsJ'espère que cela bat PHP ... Et non. Noms de fonction longs stupides.
-7 merci à @quartata pour se débarrasser du public +16 pour corriger une erreur lorsque le split était exact, merci à @TheCoder pour l'avoir rattrapé
la source
o[]=new int[b.length()*8/s+1]
- Cela affectera une taille incorrecte si(b.length()*8)%s==0
Rubis , 66 octets
Essayez-le en ligne!
Prend le tampon d'entrée sous forme de chaîne, de sorte que quelques chaînes de test ont été construites directement dans le pied de page pour éviter les non imprimables.
la source
MATL , 9 octets
Essayez-le en ligne!
Prend l'entrée
b
comme une chaîne délimitée par''
ou comme un tableau de valeurs séparées par des virgules comme[102, 48, 111]
, alorsn
.la source
Perl 5
-nl -MData::Dump=pp
, 96 octetsEssayez-le en ligne!
Nécessite le
Data::Dump
module.Prend
n
la première ligne d'entrée et les numéros sur chaque ligne après cela.Sorties vers STDERR (le champ Debug sur TIO).
Dépareillé et rangé:
la source
Powershell 146 octets
Prenez le tampon et convertissez-le en un tableau de caractères, puis en un tableau d'entiers. Pour chacun de ceux convertis en binaire, remplissez les entrées avec des 0 si nécessaire et joignez-les en une seule grande chaîne. Fractionnez cette chaîne sur n caractères et supprimez les espaces créés. Chaque élément de la division est rembourré (seul le dernier élément en aurait vraiment besoin) et reconverti en entier. La sortie est un tableau
la source
Python 3.5 -
312292 octets:Bien que cela puisse être long, c'est, à ma connaissance, le moyen le plus court d'accepter à la fois des fonctions et des tableaux sans erreurs, tout en conservant une certaine précision dans Python 3.5.
la source
Java,
253247 octetsGolfé
UnGolfed
la source
c, 2
=>c,2
;((l=f.length())%n)>0
=>(l=f.length())%n>0
;Gelée , 13 octets
Essayez-le en ligne!
Différent de la réponse de Dennis.
Remarque: L'entrée est en fait une liste d'entiers non négatifs, mais le lien TIO vous facilite la tâche et accepte une telle liste ou une chaîne.
la source
Stax , 12 octets
Exécuter et déboguer
Ce n'est pas une fonction comme spécifié dans le défi, mais un programme, car stax ne prend pas en charge les fonctions. Il prend en charge la saisie de chaînes ou de littéraux de tableau.
la source
Python 2 , 101 octets
Essayez-le en ligne!
la source
Dyalog APL , 36 octets
Essayez-le en ligne!
Cela pourrait probablement être plus bas.
la source
Elixir ,
6360 octetsEssayez-le en ligne!
Prend l'entrée comme binaire Elixir, sort une liste d'entiers.
Ce code utilise la compréhension du générateur de chaînes de bits Elixir pour segmenter le binaire d'entrée
&1
en blocs de bits de taille fournis en argument&2
. Pour tenir compte des bits restants à la fin, nous remplissons le binaire avec&2 - 1
zéro bits. Voici également l'endroit où intervient une verbosité indésirable: Elixir se plaint si nous ne déclarons pas explicitement&1
comme chaîne de bits, et il ne prend pas en charge les expressions danssize(...)
, d'où la nécessité d'une affectation de variable supplémentaire.Oeuf de Pâques: dans le pied de page, remplacez
IO.inspect
parIO.puts
, et notre fonction "traduit" magiquement Lorem ipsum du latin au chinois - Essayez-le en ligne!la source
Japt , 16 octets
Après une longue journée de rencontres, j'ai l'impression d'avoir oublié comment jouer au golf! Je vais jouer avec ça dans le train plus tard, voir si je peux l'améliorer.
Essayez-le
la source
IEC 8859-1
? Est-ce même légal? Avez-vous trouvé une échappatoire? N'ont-ils pas précisé que ce devait être UTF-8? Parce que c'est 22 octets de UTF-8.1.
Chaque langue est libre d'utiliser son propre encodage / page de codes.2.
ISO-8859-1 est un encodage assez standard utilisé par de nombreux langages et non spécifique à Japt ou à cette solution spécifique.3.
Votre spécification n'indique pas que nous devons compter en UTF-8.4.
Si c'était le cas, vous en auriez été fortement découragé.PHP ,
135129124 octetsEssayez-le en ligne!
Mis en œuvre en tant que fonction, le tampon d'entrée est un tableau d'entiers et renvoie un tableau d'entiers.
Sortie
Vérifier tous les cas de test
la source
APL (NARS), 471 caractères, 942 octets
code commenté et test:
la source